PHP反序列化
在PHP中:
序列化使用serialize()将对象变成一个可传输的字符串
反序列化则是使用unserialize()将字符串反序列化为对象。
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
分为有类和无类
有类看魔术方法,不同方法会影响传入参数或操作
常见的几个魔法函数:
_construct()当一个对象创建时被调用
_destruct()当一个对象销毁时被调用
_toString()当一个对象被当作一个字符串使用
_sleep()在对象被序列化之前运行
_wakeup()将在序列化之后立即被调用
反序列化是要先知道源代码的,所以我们查看源代码
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn1kenpnT0MGROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzEzMxITOzkDM0IzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
发现源码中有payload,显然是出题者给我们的
若果没有这行 O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
我们需要现根据源代码的方式自己生成一个反序列化字符串,网上有在线的工具
之后运行我们的payload: O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
结果竟然是一个JS的弹窗,这样我们相当于通过反序列化发现了XSS漏洞。
所以我们能得知反序列化并不是漏洞,而是一种途径,通过反序列化可找到其他漏洞,拿sql注入来说,如果我们通过反序列化找到了sql注入的漏洞,那么我们就不能再用sqlmap了,只能手工注入,或者自己做个插件来进行注入。