来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 0x01 unserialize函数的概念首先看下官方给出的解释:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。...
0x01 unserialize函数的概念 首先看下官方给出的解释:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE。若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。 通过PHP官方给出的解释,可以理解unserialize函数是与serialize函数相对应的,它们两个的作用就是将变量进行序列化与反序列化。 为什么需要对变量进行序列化呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本的调用?这肯定是不现实的。 serialize和unserialize就是解决这一问题的存在,serialize可以讲变量转换为字符串,并且在转换中可以保存当前变量的值;而unserialize则可以将serialize生成的字符串变换回变量。 0x02 利用 再讲利用不正确使用unserialize而导致的问题之前,先再介绍下unserialize工作的过程。unserialize再回复变量之前,会根据serialize生成的字符串中的变量信息,重新创造一个变量,并为它赋值。 利用unserialize的条件要具备一下几点, 1.unserialize函数的参数可控 利用的思想就是通过本地构造一个和脚本中符合条件类同名的类,并对能够写入php文件的成员变量赋值,内容为将要执行的php脚本代码(例如:phpinfo())。然后,本地实例化这个类,并通过调用serialize函数将实例化的对象转换为字符串。最后,将获得的字符串作为unserialize的参数进行传递。 下面我们通过本地实验,来看下这样利用,最后达到的效果是什么。 下面我们将修改这段代码,将其作为漏洞代码,来看下怎么利用unserialize达到攻击的效果,代码修改如下, 我们利用这个问题的思想是,模仿一个a类,并给成员变量test赋予测试代码<?php phpinfo()?>,然后实例化一个a类的对象,并对它进行序列化,具体实现如下, Unserialize函数在php代码开发中运用的频率还是很频繁的,在代码审计的过程中发现有的程序为了传递参数的方便,对序列化的字符串又进行了一次base64的加密,以防止字符串被magic_gpc过滤。但是,也同是方便的攻击者绕过magic_gpc提交攻击代码。 如何防护或者预防这种问题的发生?我们可以根据上一章中提出的提出的利用条件来进行预防与防护。 1.要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则 2.要对于unserialize后的变量内容进行检查,以确定内容没有被污染 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com