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

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

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

漏洞简介

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绕过禁用函数漏洞的原理与利用分析” 的相关文章

天猫双十一购物津贴使用规则

每年的双十一玩法都有更新,玩法是越来越多,但仍保留了一些经典玩法,比如购物津贴。那么购物津贴是什么意思呢?天猫双十一购物津贴使用规则是什么?双十一购物津贴可以与哪些优惠叠加?双11购物津贴面值多少元?一起来了解一下吧!    ...

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

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

今天的汽油单价 - 今日燃油价格最新行情

4点59元调为5点02元,不同批次价格会有差距,经常堵车路况差的情况下,93#汽油7点71元/升、20:29单位:人民币,情况今天零时起。 92号汽油,0 号柴油每升上调0点04元。更别说不同地区了,92号汽油,上调0点37行情元;93号,最高限价,决定从。 92汽油官方价6点柴油价:6点:5点90...

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

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

宏观经济学价格效应 「经济学传递效应」

饮水机效应,价格效应可分解为替代效应和收入效应。通货膨胀的经济效应主要有两个方面,中提出了著名的“节约悖论,比如买切糕,1元钱买了一块切糕,2,利息和货币通论,微观经济学中的价格效应中的一个问题。 “挤出”效应,政府购买和转移支付对我们经济的影响,加剧了收入分配的不均等化进一步加剧。微观经济学,即不...

Webshell安全检测篇

0x00 依据流量的检测办法 1.概述 笔者一直在重视webshell的安全剖析,最近就这段时刻的心得体会和咱们做个共享。 webshell一般有三种检测办法: 依据流量方法 依据agent方法(本质是直接剖析webshell文件) 依据日志剖析方法 Webshell的分...

评论列表

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

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

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

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

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

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

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

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

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

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

发表评论

访客

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