快捷搜索: 王者荣耀 脱发

反序列化漏洞-基础篇笔记

序列化与反序列化概述

serialize和unserialize就是解决这一问题的存在,serialize可以将变量转换为字符串,并且在转换中可以保存当前变量的值;而unserialize则可以将serialize生成的字符串变换回变量。


通过一个列子查看php对象序列化之后的格式


对php对象进行反序列化


跟serialize和unserialize相关的一些magic函数

__sleep magic方法在一个对象被序列化的时候调用。

__wakeup magic方法在一个对象被反序列化的时候调用。

可以看到serialize的时候调用了__sleep,unserialize的时候调用了__wakeup函数,在对象销毁的时候调用了__destruct函数

举个存在漏洞栗子。一个类用于临时将日志储存进某个文件,当__destruct被调用时,日志文件会被删除

调用这个类:test06.php

看到

$usr = unserialize($_GET[usr_serialized]);

$_GET[usr_serialized]是可控的,那么我们就可以构造输入删除任意文件的脚本

如:构造输入删除目录下的1.php文件的过程

编写脚本:test07.php

访问得到序列化代码:得到序列化之后的字符串O:7:"LogFile":1:{s:8:"filename";s:5:"1.php";}

如图:

访问http://localhost/test06.php?usr_serialized=O:7:"LogFile":1:{s:8:"filename";s:5:"1.php";}得到如图

这时发现一个存在的1.php文件被删除了


常见的注入点以及防范方法

在上述实验中,展示了由于输入可控造成的__destruct函数删除任意文件,其实问题也可能存在于__wakeup、__sleep、__toString等其他magic函数,一切都是取决于程序逻辑。

打个比方,某用户类定义了一个__toString为了让应用程序能够将类作为一个字符串输出(echo $obj) ,而且其他类也可能定义了一个类允许__toString读取某个文件。

获取exp,访问http://localhost/exp/test08.php

触发漏洞,获取1.txt内容,访问http://localhost/test09.php?usr_serialized=O:9:"FileClass":1:{s:8:"filename";s:5:"1.txt";}

防范方法

Unserialize漏洞依赖几个条件

1)unserialize函数的参数可控

2)脚本中存在一个构造函数、析构函数、__wakeup()函数中有向php文件中写数据的操作的类

3)所写的内容需要有对象中的成员变量的值

防范方法有:

1)要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则

2)要对于unserialize后的变量内容进行检查,以确定内容没有被污染

经验分享 程序员 微信小程序 职场和发展