反序列化漏洞

概念

序列化( serialization ):讲数据结构、对象等状态转化成可使用的格式(一般用于:缓存、网络发送、身份信息等),以备能够被还原为原始状态;
序列化 & 反序列化功能一般用作:存储、传输;
反序列化 (unserialization) :和上方相反

什么是类:

类是有相同属性和操作的一组对象的集合;

<?php
class student{
var $a=c;
echo $a;
}
?>

什么是对象:

对象是一个信息获取信息处理描述组成的整体,是对现实世界的描述;
对象是类的实例:

<?php
class student{
var $a=c;
echo $a;
}
$z=new student();
?>

完整案例:

<?php
//创建类
class student{
public $name="zhangsan";
public $age=8;
public $sex="male";
public $bul=flase;
}
//创建对象
$Student=new student();
//序列化对象
$str=serialize($Student);
//打印
echo $str;
?>
输出结果:
O:7:"student":3:{s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";}

O 表示 object , 数字 7 表示 'student' 的长度,数字 3 表示属性数量,大括号内 {
s 表示 'string' ; 4 表示字符串长度, 'name' 表示名称 }

<?php
//创建类
class student{
public $name="zhangsan";
public $age=8;
public $sex="male";
public $bur=false;
public $gir=1.111;
public $arr=array('a','b','c');
private $name2="zhangsan";
protected $name3="zhangsan";
}
//创建对象
$Student=new student();
var_dump($Student);
echo "<br>";
//序列化对象
$str=serialize($Student);
//打印
var_dump($str);
echo "<br>";
//将序列化的字符串,反序列化
$unstr=unserialize($str);
//打印
var_dump($unstr);
?>

object(student)#1 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
string(8) "zhangsan" }
string(230) "O:7:"student":8:
{s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";s:3:"bur";b:0;s:3:
"gir";d:1.111;s:3:"arr";a:3:
{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}s:14:"studentname2";s:8:"zhangsan";s:8:"*n
ame3";s:8:"zhangsan";}"
object(student)#2 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
string(8) "zhangsan" }

常见数据类型序列化后样式:

bool-------->b:value 例:s:3:"bul";b:0;=========>$bul=false
string------->s:count:value 例: s:4:"qwer";s:4:"qwer"; =========>$qwer=qwer
int---------->i:value 例:s:2:"in";i:8; ========>$in=8
Object------->O:<obj-name-length>:<obj-name>:属性数量; 例:O:3:"res":2:
array-------->a:3:{i:0;i:1;i:1;i:2;i:2;i:34}============>array(1,2,34)

private 属性序列化后格式: %00 类型 %00 成员名;
protected 属性序列化后格式: %00*%00 成员名;
public 属性无特例 ;
php7.1+ 反序列化的类属性不敏感;

魔术函数:

php 中自定的功能、方法; php 中魔术方法以 '------', 两个下划线开头,魔术函数无需调用,只需要满足特定条件即可触发;
__wakeup () ,反序列化时被执行
__sleep () ,序列化时被执行
__construct (), 对象被创建时执行
__destruct (), 对象被销毁时执行
例:

<?php
class people{
public function __sleep(){
echo "sleep";
}
public function __wakeup(){
echo "wakeup";
}
}
$People=new people();
$str=serialize($People);
$unstr=unserialize($str);
?>

反序列化**+**魔术函数

<?php
class pussy{
public $name='lihua';
public function __wakeup(){
eval($this->name);
}
}
$a=$_GET['a'];
unserialize($a);
?>
用户可操作参数传入序列化字符串,且被反序列化函数处理
payload:
O:5:"pussy":1:{s:4:"name";s:10:"phpinfo();";}

反序列化漏洞成因:

①有 unserialize&serialize ,
②魔法函数;
③用户控制输入;
php 反序列化常见于 ctf 代码审计中;
java 反序列化常见于组件、框架( weblogic 、 shrio 、 struct2 );

相关推荐
为几何欢30 分钟前
【内网安全】组策略同步-不出网隧道上线-TCP转ICMP
网络·tcp/ip·安全·网络安全
炫酷的伊莉娜1 小时前
【网络安全】第4讲 身份认证技术(笔记)
笔记·安全·web安全
dot.Net安全矩阵4 小时前
.NET 漏洞分析 | 某ERP系统存在SQL注入
数据库·sql·安全·web安全·矩阵·.net
helloKittywz5 小时前
Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??
安全·web安全·网络安全·系统安全·学习笔记·权限提升·本地用户提权
梦中北山5 小时前
JWT安全分析
开发语言·网络·安全·web安全·php
丸卜6 小时前
[GHCTF 2024 新生赛]UP+——入土为安的第一天
网络安全
亿林等保6 小时前
公司“领导”们竟如此讨论工作!小伙:此事有蹊跷;|国家漏洞库CNNVD:关于OpenSSH安全漏洞的通报;
网络安全
小鼠米奇6 小时前
13.什么是Proxy?
网络·安全·web安全
都适、隶仁ミ6 小时前
SQL注入工具Sqlmap
linux·网络·数据库·sql·安全·网络安全·系统安全
网安加社区7 小时前
行业洞察 | 2024应用程序安全领域现状报告
网络·安全·网络安全