加载中...

反序列化的一些小想法

序列化和反序列化

一、基本概念

网站传输大型数据,不可能传送整个模型,就会传送序列化数据如:

<?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

….(自己加的便于书写)里的参数要报错你注入的参数不要出错,从而达到注入木马代码效果

posted @ 2023-04-15 16:53  泠の半掉线  阅读(12)  评论(0)    收藏  举报