PHP反序列化 代码执行

1. 漏洞文件vul.php代码如下图,考虑如何利用:(本地测试)

2. 背景知识:

     PHP中有一些特殊函数可以自动调用,即它们不需要其它函数的调用即可执行自己的代码,考虑到这个特性,这些函数通常被称为魔幻函数或魔幻方法。

     最常用的魔幻函数是__construct(),因为PHP版本5中,__construct方法实际上是你所定义的类的构造函数。对于一个给定的类,如果PHP 5找不到   __construct()函数,那么它将搜索一个与类名字相同的函数,这是PHP中编写构造器的老方法,这种方法中你只需要定义一个名字与类名相同的函数。

     下面是PHP中的一些魔幻函数:

  __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(),     __invoke(), __set_state(), __clone(), __autoload().

3. 利用过程:

漏洞代码中,接受参数作为文件名并读取,然后反序列化。

我们在web目录下准备test.php文件,内容如下图:

编写serial.php文件对其进行序列化,并把结果写入到test.txt中,代码如下图:

test.txt内容如下:

然后访问漏洞文件:http://localhost/vul.php?filename=test.txt

成功访问后,test2.txt中会被写入323232

因为漏洞文件的AA类中的__destruct函数被自动执行了(具体原理应该是unserialize函数执行时触发的一些操作,没深入研究)。

 

如果把test.php文件内容改为如下:

然后用serial.php进行序列并写入到test.txt中,再次访问漏洞文件:http://localhost/vul.php?filename=test.txt

此时,会在web目录下生成test2.php文件,访问后执行里面的代码。进一步利用可以获取webshell

 

利用反序列化漏洞的前提:

unserialize()函数的参数可控;

php文件中存在可利用的类,类中有魔术方法

posted @ 2015-11-13 17:43  sky钦  阅读(2669)  评论(0编辑  收藏  举报