反序列化的一些小想法
序列化和反序列化
一、基本概念
网站传输大型数据,不可能传送整个模型,就会传送序列化数据如:
<?php
class People(){
public $name;
protected $age =10;
private $mate = man;
function __construct(){
//用new创建实例时调用
echo this->name;
}
function __destruct(){
//该实例用完后,调用 (即使前面出错,或者不直接实例化,用反序列化,只要存在实例就在结束时调用)
echo "destruct".this->name;
}
function __wakeup(){
//调用unserialize时调用
echo "I am serializing";
}
}
//正常流程
$renA= new People();
//protected属性只能被它自己和它的子类修改
//private属性只能被它自己修改
$renA->name="xiaohong";
/*序列化string s:len(s):value
integer i:value
boolean b:0或1
Null N
!!!
object
O:len(object_name):object_name:object_size{s:len(key_name):key;s:len(value_name):value;}}
obeject size指拥有变量个数,包括父类但不包括常量变量 $const定义的
*/
$s = serialize($renA);
//反序列化时如果上面的object_size,len的值不对,就报错。
//object_size报错,不会执行wakeup,但仍会执行析构
//!!!!!注意如果object_size和len(object_name)出错后面不执行,而后面出错会执行完前面的然后报错
//如果网站在wakeup设置防火墙可以通过此绕过
$renB = unserialize($s);
?>
二、基本攻击手段
1.看到源码,然后放到自己的PHP中获得序列化
2.修改序列化数据
2.写入日志
funcion __destruct(){
echo this->name."写入日志";
}
我们可以将变量O:6:”People”:3{s:4:”name”;s:4:”nini”;……….}
改为O:6:”People”:3{s:4:”name”;s:18:””;……….}攻击载荷不一定是php也有可能xss
….(自己加的便于书写)里的参数要报错你注入的参数不要出错,从而达到注入木马代码效果

浙公网安备 33010602011771号