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值名称";}

  

posted @ 2021-05-08 16:12  !rbash  阅读(64)  评论(0编辑  收藏  举报