当前位置:首页 > 黑客技术 > 正文内容

PHP绕过禁用函数漏洞的原理与利用分析

访客4年前 (2021-04-04)黑客技术501

漏洞简介

PHP 发布公告,旧版本的?php_array_merge_recursive?函数中存在UAF风险,被利用可能导致用来绕过禁用函数。

受影响的版本

PHP 7.2 - 7.4.9

安全专家建议用户尽快升级到安全版本,以解决风险。

漏洞原理

一、array_merge_recursive 函数实现

在?array_merge_recursive?函数的实现中,通过遍历源数组键值,如果键值不存在,则将对应的值直接插入目标数组;如果键值存在,则查询相应的目标数组。在目标数组不存在此键值时,将键值与相应的值插入目标数组;如果存在相同的键值,则会尝试将相应的值加入到目标数组中。具体处理如下图,在目标值为?NULL?时,将其转变为数组类型并在数组中加入?NULL,在源数组中的值为对象类型时将其转换为数组类型,尝试为?src_entry?添加引用后将?src_zval?添加到数组中;如果源数组中的值类型为数组则递归调用?php_array_merge_recursive?函数。

原理分析

在尝试为源数组中的值添加引用计数的时候错误地调用了?Z_TRY_ADDREF_P(src_entry),?src_entry?此时为对源数组中的值的引用,此时引用计数被添加到了引用而不是源数组中的值。

如果在?array_merge_recursive?函数中传入可变的字符串(通过直接赋值获得的字符串不可变,在尝试添加引用计数时会失败),此时?src_zval?即可变字符串的引用计数并没有增加,在数组被销毁时,因为可变字符串的引用计数提前变为 0 导致 UAF。

三、利用分析

注: 以下调试直接在 php 调试而不是在服务器加载 php 调试,但是差别不大。

1、在字符串被释放后,创建一个新的对象占位,进行类型混淆,此时字符串的?len?被新创建对象的?ce?覆盖。ce 是一个地址,所以后续不会影响字符串的写入。

占位前后对比图如下:

字符串对象被释放后,创建对象前:

创建对象后:

2、读取新创建对象的?handlers?方便之后泄露内存信息,handers?的值即为上图的 0x0000000008dfe500,在后面可以达到任意内存读取后可以用来泄露 php 基地址。读取新创建对象中包含堆地址的区域,获取被释放的字符串地址,例如可以读取 0x7ffffb080540 中的堆地址,减去 0xc8 即为字符串对象中的字符串地址 hex(0x00007ffffb0805b0 - 0xc8)=0x7ffffb0804e8 即为字符串对象的 val 属性的地址。

3、将新创建对象的一个属性的值指向的类型改写为引用,引用的地址为一个伪造的引用字符串对象。可以将新创建对象的第一个属性即?properties_table?数组中的第一个元素的类型改为引用,地址改为伪造的引用字符串对象的地址。地址0x7ffffb0804f8 保存的即为新创建对象的第一个属性的地址,地址0x7ffffb080500 中存储的 0xa 代表引用类型。

其指向的地址 0x00007ffffb080548 保存的为伪造引用对象的地址,伪造的对象的第三个八字节需置为 6 (引用对象的类型)。引用字符串对象的内存布局如下图。可以看到,引用中保存类型为 0x6 代表字符串类型,但是地址为 0x0,之后可以通过写入任意地址来达到内存读取。

4、通过修改伪造的字符串的起始地址来达到任意内存读取,利用之前泄露的?handlers?地址来获取?elf?基址,之后遍历内存获取?zif_system?函数的地址。

5、伪造一个闭包对象,从一个真实存在的闭包对象拷贝其存储的值,修改函数类型为内置函数类型,has_dimension?属性地址为?zif_system,修改后如下图。

6、修改对象的一个属性地址为伪造的闭包对象的地址,调用对象的属性函数即可完成禁用函数的绕过。

漏洞验证

一、在7.4.5 版本中进行攻击尝试

在目标服务器上传利用脚本,执行命令。

(视频地址:https://v.qq.com/x/page/c31651dla6g.html)

二、7.4.10 版本修复分析

修改?Z_TRY_ADDREF_P(src_entry) 为 Z_TRY_ADDREF_P(src_zval)。

参考

https://bugs.php.net/bug.php?id=79930

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/107397.html

分享给朋友:

“PHP绕过禁用函数漏洞的原理与利用分析” 的相关文章

天猫双十一活动什么时候开始华流

以前提到双十一那都是光棍才过的节日,而现在双十一摇身一变成了全民购物狂欢节。在双十一期间以淘宝天猫为主的购物平台都会推出各种优惠活动以及满减折扣,可以算得上是全年最便宜的时候了。那么天猫双十一活动什么时候开始呢?下面就跟百思特小编来详细了解一下2020年天猫双十一开始时间吧!...

美团暗语「美团暗语2021」

 昨天,很多网友问小编美团暗语最好的方法是什么?有关美团暗语2021最好的方法是哪种?最新美团暗语2020?根据网民透露的审判细节这篇文章主要介绍了美团暗语,包括美团暗语 据大江网2021年10月20日17:01:48的最新消息,微博网友@ 爆料。 平安夜来临之际,事件,在网上炒得沸沸扬扬,引发全...

接单的黑客_可以找黑客黑美团吗

有在网络安全范畴中,猜测网络违法和歹意软件发展趋势好像现已成为了各大网络安全公司的传统了。 为了防止让咱们去阅览上百页的安全陈述,咱们专门整兼并总结了McAfee、Forrester、FiskIQ、卡巴斯基实验室【1、2、3】、WatchGuard、Nuvias、FireEye、CyberArk、F...

黑客了解,中国黑客越南网络apt,黑客网站密码破解工具

6.42 · hxxp[://]offlineearthquake[.]com/file//?id=&n=000 进程三:使命履行及实时数据剖析10.61 2019年6月19日,FireEye Endpoint Security设备上收到了缝隙检测警报。 违规应用程序被辨认为Microso...

糖尿病胰岛素多少钱一支_血糖高不高,看脚就知道

饮食和运动可以让你不怕糖尿病过好生活.也与运动太少有关。眼睛发痒一般是过敏.哪家医院对糖尿病的治疗上信誉. 血糖高是哪个部位.据统计,黎明现象,空腹和。 精神状态等各方面根本的健康因素并不重视,不过在这家医院现在可以实现跨省异地直接,之前就血糖高,口服药是可以降糖的!治疗导致的并发症,就换了别的药,...

如何查询酒店开房记录?谁可以查?网上怎么查?

关于酒店开房记录,这个基本上是看不到的,只有公检法系统(主要是公安局)才能查询的。如果你真想查询,要提供相关真实的身份证明,到公安局咨询,可能需要繁琐的手续。 2014年初,网上就有过“2000W开房数据泄露”的惊爆新闻,是因众多酒店使用了浙江慧达驿站公司开发的酒店Wi-Fi管理、认证系统,而该公司...

评论列表

慵吋风晓
2年前 (2022-06-19)

x0000000008dfe500,在后面可以达到任意内存读取后可以用来泄露 php 基地址。读取新创建对象中包含堆地址的区域,获取被释放的字符串地址,例如可以

掩吻路岷
2年前 (2022-06-19)

e 是一个地址,所以后续不会影响字符串的写入。占位前后对比图如下:字符串对象被释放后,创建对象前:创建对象后:2、读取新创建对象的?handlers?方便之后泄露内存信息,handers?的值即为上图的 0x0000000

痛言梦息
2年前 (2022-06-19)

src_entry),?src_entry?此时为对源数组中的值的引用,此时引用计数被添加到了引用而不是源数组中的值。如果在?array_merge_recursive?函数中传入可变的字符串(通过直接赋值获得的字符串不可变,在尝试添加引用计

冬马只酷
2年前 (2022-06-19)

相应的目标数组。在目标数组不存在此键值时,将键值与相应的值插入目标数组;如果存在相同的键值,则会尝试将相应的值加入到目标数组中。具体处理如下图,在目标值为?NULL?时,将其转变为数组类型并在数组中加入?NULL,在源数组

余安辞慾
2年前 (2022-06-19)

目标数组中。具体处理如下图,在目标值为?NULL?时,将其转变为数组类型并在数组中加入?NULL,在源数组中的值为对象类型时将其转换为数组类型,尝试为?src_entry?添加引用后将?src_zval?添加到数组中;如果源数组中的值类型为数组则递归调用?php_array_me

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。