ok php漏洞,php反序列化漏洞复现过程

PHP反序列化漏洞复现

测试代码

ad90495fd418c86b65f703b088519168.png

我们运行以上代码文件,来证明函数被调用:

cae42862c5e8db2738873b9d9bb85ff4.png

应为没有创建对象,所以构造函数__construct()不会被调用,但是__wakeup()跟__destruct()函数都被调用,如果这些函数里面包含的是恶意代码会怎么样呢?

利用场景

__wakeup() 或__destruct()

由前可以看到,unserialize()后会导致__wakeup() 或__destruct()的直接调用,中间无需其他过程。因此最理想的情况就是一些漏洞/危害代码在__wakeup() 或__destruct()中,从而当我们控制序列化字符串时可以去直接触发它们。这里针对 __wakeup() 场景做个实验。

基本的思路是,本地搭建好环境,通过 serialize() 得到我们要的序列化字符串,之后再传进去。通过源代码知,把对象中的test值赋为 “<?php phpinfo(); ?>”,再调用unserialize()时会通过__wakeup()把$test的写入到shell.php中。为此我们写个php脚本:

757cdf480a9e1d0c0b4c1579784dad04.png

运行结果:

cb4cd886e261873ec497bdc00f9de5cb.png

我们再来看shell1.php:

63ac31b80c32acb5111302f69be8f321.png

成功的利用反序列化漏洞来得到phpinfo()信息

不过具体的环境多是像下面代码这样,我们的test是我们可控的参数

8cde58e0dae5de6da8f0d3b594bee350.png

我们传入参数test=O:7:"bmjoker":1:{s:4:"test";s:18:"<?php phpinfo();?>";}

8066d1080dff913b0be6399fe516e685.png

同时shell.php也成功写入

57deb29a0025bae6cd12221e2387cb72.png

成功利用php反序列化漏洞

其他Magic function的利用

但如果一次unserialize()中并不会直接调用的魔术函数,比如前面提到的__construct(),是不是就没有利用价值呢?非也。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。

18d5cbcabe014f02e28caa3a5ca01109.png

这里我们给test传入构造好的序列化字符串后,进行反序列化时自动调用 __wakeup()函数,从而在new joker()会自动调用对象joker中的__construct()方法,从而把<?php phpinfo();?>写入到shell.php中:

我们传入参数  test=O:7:"bmjoker":1:{s:4:"test";s:18:"<?php phpinfo();?>";}

8ba0877290344af19d5290e3356d02cf.png

同时she.php也成功写入:

f3f0247f107ec89bb9aff32bb38ad585.png

利用普通成员方法

前面谈到的利用都是基于“自动调用”的magic function。但当漏洞/危险代码存在类的普通方法中,就不能指望通过“自动调用”来达到目的了。这时的利用方法如下,寻找相同的函数名,把敏感函数和类联系在一起。

f6f42f25d73443cc1454f61c1b7d4d23.png

本意上,new一个新的lmjoker对象后,调用__construct(),其中又new了bmjoker对象。在结束后会调用__destruct(),其中会调用action(),从而输出 bmjoker

0ee38ba3255303c0bb6603b1be3936d7.png

下面是利用过程。构造序列化

00c7d973afa6874e1a77834102176063.png

得到:

b01b674348295cdaea150110a81181a9.png

传给5.php的test参数,利用成功

673731afdc9546de1a5e8369a4184d4d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值