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

访客4年前黑客文章681

漏洞简介

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?函数。

1603876698_5f99375a50bd0ae6c26e2.png!small?1603876698732

原理分析

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

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

三、利用分析

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

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

1603876709_5f9937654162fee3844cf.png!small?1603876709557

占位前后对比图如下:

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

1603876718_5f99376e687a7362bb933.png!small?1603876718844

创建对象后:

1603876727_5f993777d299e8f447ff7.png!small?1603876728269

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

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

1603876743_5f9937870af19b91cff0e.png!small?1603876743421

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

1603876754_5f993792b2cf352938556.png!small?1603876755117

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

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

1603876765_5f99379d887de87177fcd.png!small?1603876766033

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)。

1603876861_5f9937fd573ce83d3ed38.png!small?1603876861610

参考

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

相关文章

谷歌:华为别用我的安卓系统!自己研发一个去

谷歌:华为别用我的安卓系统!自己研发一个去

    现如今手机所占据的领域巨大,每个人的生活中都要用到手机,每个人在选择手机品牌时要求也不一样。还记得我们之前使用的最早的就是传呼机之后又成了按键机,慢慢的才有了触屏机。之前很多人用的最多...

学生淘宝开店卖什么赚钱(史上最全大学生赚钱

学生淘宝开店卖什么赚钱(史上最全大学生赚钱

大学生兼职想赚钱,看你心有多大,想赚多少钱,如果想一个月赚个生活费,可以选择一个小类目,竞争小的产品,做好前期的优化新店开就刷几单,最起码先把新开店铺去掉,然后1周左右产品要好就可以开单了,总之想要赚...

sem优化营销公司,上海sem优化营销哪家公司不错?

上海sem优化营销哪家公司不错? 这个我较量推荐你选择象宏营销筹谋公司啦,我哥的公司就是找他们家相助的啦,结果还长短常不错的啦。 SEM搜索引擎营销优化是什么?  SEM优化翻译为搜索引擎营...

赤兔Office Excel恢复软件扫描修复Excel文件,赤兔Office Excel教程

赤兔Office Excel数据恢复软件扫描仪修补Excel文档?下边是我详细介绍赤兔Office Excel数据恢复软件扫描仪修补excel文档设定实例教程详细介绍的操作流程,有必须的小伙伴们一起来...

黑客在线qq接单免费(黑客在线接单免费多彩)

黑客在线qq接单免费(黑客在线接单免费多彩)

本文目录一览: 1、常见的免费的黑客网站有什么? 2、有没有专门免费送qq号码的网站 3、怎样才能在网上学到免费的黑客 常见的免费的黑客网站有什么? 常见的黑客网站:中国黑客基地、HEIKE...

怎么和身边人微信同步接收

. 很多妈妈在带宝宝睡觉的时候会发现,宝宝睡着了以后会打呼而且这声音还不算小。那么宝宝打呼就是睡的香吗,宝宝打呼到底是什么原因呢,下面小编就来和大家说一说。 宝宝打呼噜什么原因 1、睡姿问题。宝...