PHP反序列化漏洞
参考:https://cnblogs.com/xiaoqiyue/p/10951836.html
https://www.jb51.net/article/188446.htm
什么是序列化和反序列化?
序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。
为什么要序列化?
更好的将数组或者是对象存储到文件或数据库中
注意: php序列化的时候 private和protected变量会引入不可见字符,%00类名%00属性名为private。%00*%00属性名为 protected,注意这两个%00就是ascii码为0的字符,这个字符显示和输出可能看不到,甚至导致截断,但是通过URL编码就可以看得清楚。
原理:
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。
在反序列化的过程中自动触发了某些魔术方法。
漏洞触发条件:unserialize函数的变量可控,php文件中存在可利用的类,类中有魔术方法
魔术方法:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
格式:
花括号内的格式即为 {变量1数据类型:变量1名长度:"变量1名称";变量1值类型:变量1值名长度:"变量1值名称";}