PHP源码中unserialize函数引发的漏洞分析
来源:互联网 发布:sql偏移注入 编辑:程序博客网 时间:2024/04/29 21:49
前言
前端时间看到三个白帽中有一道题目是php反序列化的,于是想抽空研究一下这个漏洞。
后来就再网络上找到了这篇文章,通俗易懂。就转载过来了。
0×01 unserialize函数的概念
为什么需要对变量进行序列化呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果一个脚本中想要调用之前一个脚本的变量,但是前 一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本的调用?这肯定是不现实的。
serialize和unserialize就是解决这一问题的存在,serialize可以讲变量转换为字符串,并且在转换中可以保存当前变量的值;而unserialize则可以将serialize生成的字符串变换回变量。
0×02 利用
再讲利用不正确使用unserialize而导致的问题之前,先再介绍下unserialize工作的过程。unserialize再回复变量之前,会根据serialize生成的字符串中的变量信息,重新创造一个变量,并为它赋值。
利用unserialize的条件要具备一下几点,
1.unserialize函数的参数可控
2.脚本中存在一个构造函数、析构函数、__wakeup()函数中有向php文件中写数据的操作的类
3.所写的内容需要有对象中的成员变量的值
利用的思想就是通过本地构造一个和脚本中符合条件类同名的类,并对能够写入php文件的成员变量赋值,内容为将要执行的php脚本代码(例 如:phpinfo())。然后,本地实例化这个类,并通过调用serialize函数将实例化的对象转换为字符串。最后,将获得的字符串作为 unserialize的参数进行传递。
其实就是说我们在本地构建一个特殊类,进行序列化,序列化的代码作为payload进行利用
这是存在问题的一段代码,他的作用就是将通过GET方法传进来的字符串进行反序列化。并且他提供了一个名为a的类,这个类的析构函数会创建一个名为123.php的文件,并在其中写入内部成员test的值。最后为了证明效果,我将析构函数生成的文件包含进来了。
我们利用这个问题的思想是,模仿一个a类,并给成员变量test赋予测试代码<?php phpinfo()?>,然后实例化一个a类的对象,并对它进行序列化,具体实现如下,
0×03 总结
Unserialize函数在php代码开发中运用的频率还是很频繁的,在代码审计的过程中发现有的程序为了传递参数的方便,对序列化的字符串又进行了一 次base64的加密,以防止字符串被magic_gpc过滤。但是,也同是方便的攻击者绕过magic_gpc提交攻击代码。
如何防护或者预防这种问题的发生?我们可以根据上一章中提出的提出的利用条件来进行预防与防护。
1.要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则
2.要对于unserialize后的变量内容进行检查,以确定内容没有被污染
- PHP源码中unserialize函数引发的漏洞分析
- PHP源码中unserialize函数引发的漏洞分析
- PHP源码中unserialize函数引发的漏洞分析
- Php中unserialize()函数返回的是bool(false)
- php中serialize()与unserialize()函数使用方法
- 长度问题:php函数unserialize数据返回false问题分析
- php函数unserialize数据返回false问题分析
- javascript中模仿php的serialize和unserialize序列化函数
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php函数serialize()与unserialize()
- php serialize与unserialize函数
- php函数serialize()与unserialize()
- 自定义Drawable(文字按钮点击效果设置)
- COW
- Eclipse 关联源码
- UIGestureRecognizer手势
- 使用栈的递归与非递归DFS
- PHP源码中unserialize函数引发的漏洞分析
- 信息学奥林匹克竞赛-小鱼的数字游戏
- 常用电压基准芯片
- ubuntu中&&(命令执行控制)
- Lua和C++交互总结(很详细)
- 破解由于异步执行而导致的JS插件未加载就使用的问题
- 自适应滤波中期望信号的相关知识
- Java NIO系列教程(五) 通道之间的数据传输
- 用腾讯的技术实现自己的搜索和大数据分析