初识php反序列化

php反序列化

参考资料:Understanding PHP Object Injection

php基础提要: 图1

php允许保存一个对象方便以后重用,这就是序列化。 场景:变量值需要跨脚本传递。

序列化

反序列化

下面演示php反序列化。 建立logfile.php(定义了一个类,可以进行文件删除),use.php(使用这个类,生成序列化字符串)。 1.php(之后演示删除该脚本) test.php(接受序列化字符串,删除1.php)

logfile.php定义了一个类,可以进行文件删除操作

use.php指定了一个文件,进行删除。 O:7:"LogFile":1:{s:8:"filename";s:5:"1.php";} 复制生成的这个序列,之后要用到。

之后,建立一个test.php,其中定义一个新的类 User。 此时图一建立的1.php还存在。 捕获 6 捕获 7 划重点,test.php因为接受了用户给出的变量usr_serialized,而用户的输入不可控。导致php脚本解析并执行了删除1.php的操作。

而test.php本来设计的功能,是传递“O:4:”User”:2:s:3:”age”;i:20;s:4:”name”;s:4:”John”;}”

于是页面会显示“User John is 20 years old.”

在跨页面传递变量的时候,没有设计好,就导致了这个命令执行。