概述
序列化与反序列化概述
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后的变量内容进行检查,以确定内容没有被污染
最后
以上就是欢呼镜子为你收集整理的反序列化漏洞-基础篇笔记的全部内容,希望文章能够帮你解决反序列化漏洞-基础篇笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复