创意电子
标题:
PHP反序列化字符逃逸详解
[打印本页]
作者:
合天网安实验室
时间:
2021-8-24 15:52
标题:
PHP反序列化字符逃逸详解
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;}
完整代码如下:
欢迎光临 创意电子 (https://wxcydz.cc/)
Powered by Discuz! X3.4