年前的最后一篇文章,php反序列化漏洞原理与挖掘

点击"仙网攻城狮”关注我们哦~
不当想研发的渗透人不是好运维
让我们每天进步一点点
简介
序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
php反序列化常用函数:
serialize和unserialize
#当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
json_encode 和 json_decode
#使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
#JSON格式是可读的。
#JSON格式比serialize返回数据结果小。
#JSON格式是开放的、可移植的。其他语言也可以使用它。
var_export 和 eval
#var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。
wddx_serialize_value 和 wddx deserialize
#wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。
实战
PHP反序列化漏洞
1.实战中使用serialize和unserialize来演示一下反序列化漏洞的现象,前提需要了解这两个函数的作用。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
2.一般反序列化漏洞都是通过代码审计而发现,一般的黑盒测试是很难发现的。查看一下后台代码。


3.根据上面的处理逻辑我们自己写一个php页面来尝试生成一个payload。

4.访问一下刚刚的php页面可以弹窗。

5.确认后点击鼠标右键,查看页面源代码获取payload。

6.把O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}源代码直接复制发送给api。

7.总结:想要挖掘反序列化漏洞一定要对序列化和反序列化函数特别熟悉,最起码得知道序列化后是什么,反序列化后是什么,才能挖的顺利。

往期内容


更多资讯长按二维码 关注我们
专业的信息安全团队,给你最安全的保障。定期推送黑客知识和网络安全知识文章,让各位了解黑客的世界,学习黑客知识,普及安全知识,提高安全意识。
觉得不错点个“赞”呗
更多推荐



所有评论(0)