聚焦源代码安全,网罗国内外最新资讯!

漏洞简介

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 版本中进行攻击尝试

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

二、7.4.10 版本修复分析

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

参考

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

别走,代码安全实验室招人了!

奇安信代码安全实验室正在寻找漏洞挖掘安全研究员,针对常见操作系统、应用软件、网络设备、智能联网设备等进行安全研究、漏洞挖掘。

奇安信代码安全实验室是奇安信集团旗下,专注于软件源代码安全分析技术、二进制漏洞挖掘技术研究与开发的团队。实验室支撑国家级漏洞平台的技术工作,多次向国家信息安全漏洞库 (CNNVD)和国家信息安全漏洞共享平台 (CNVD)报送原创通用型漏洞信息;帮助微软、谷歌、苹果、Cisco、Juniper、Red Hat、Ubuntu、Oracle、Adobe、VMware、阿里云、飞塔、华为、施耐德、Mikrotik、Netgear、D-Link、Netis、以太坊公链等大型厂商或机构的产品发现了数百个安全漏洞。目前,实验室拥有国家信息安全漏洞库特聘专家一名,多名成员入选微软全球TOP安全研究者。在Pwn2Own 2017世界黑客大赛上,实验室成员获得Master of Pwn破解大师冠军称号。

如果你:

  • 对从事漏洞研究工作充满热情

  • 熟悉操作系统原理,熟悉反汇编,逆向分析能力较强

  • 了解常见编程语言,具有一定的代码阅读能力

  • 熟悉 Fuzzing 技术及常见漏洞挖掘工具

  • 挖掘过系统软件、网络设备等漏洞者(有cve编号)优先

  • 具有漏洞挖掘工具开发经验者优先

那么,你将得到:

  • 富有竞争力的薪酬,期望赏金猎人上线

  • 补充医疗保险+定期体检----你的健康我来保障

  • 定期团建----快乐工作交给我

  • 福利年假+带薪病假----满足各种休假需求

  • 下午茶----满足你每天的味蕾

注:工作地点为北京、西安。

心动不如行动!不要犹豫!赶紧给 zhuqian@qianxin.com 投简历吧!我们会在3个工作日内找到你~

推荐阅读

Apache Solr 未授权上传(RCE)漏洞(CVE-2020-13957)的原理分析与验证

Netlogon 特权提升漏洞(CVE-2020-1472)原理分析与验证

QEMU CVE-2020-14364 漏洞分析(含 PoC 演示)

题图:Pixabay License

转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 吧~

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

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

    漏洞简介 PHP 发布公告,旧版本的 php_array_merge_recursive 函数中存在UAF风险,被利用可能导致用来绕过禁用函数. 受影响的版本 PHP 7.2 - 7.4.9 安全专家 ...

  2. php函数的实现原理及性能分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在任何语言中,函数都是最基本的技术单元之一.对于php的函数,它具有哪些特点?函数调用是怎么实现?php函数的性能如何, ...

  3. 文件包含的漏洞、原理、利用

    最近的总结都比较简单,但不是在水,只是在我学习过程中总结的觉得真的有用的知识,还有就是有些代码发不出来我也没办法,所以就有所调整. 文件包含原理是啥? 文件包含漏洞:即file inclusion,意 ...

  4. Web安全-浅析CSV注入漏洞的原理及利用

    文章目录 漏洞简介 漏洞原理 漏洞利用 命令执行 钓鱼攻击 反弹shell 漏洞实例 Twitter网站 Hackerone 漏洞挖掘 漏洞防御 漏洞简介 CSV 注入(CSV Injection)漏 ...

  5. 破壳漏洞的原理与利用

    使用ssh登录蠕虫发起者主机(10.1.1.231),执行下面三条命令.命令执行结果如下图所示. [root@worm-master ~]# tail /var/log/httpd/access_lo ...

  6. Strust2远程代码执行漏洞(S2-033)利用分析

    0x00前言 5月12日,Struts官方发布安全公告称,Apache Strut2 REST插件存在漏洞,可以远程执行任意指令,该漏洞编号为S2-033(CVE-2016-3087 ),公告详情如下 ...

  7. (23)【漏洞利用】【原理、利用过程】中间件解析漏洞、CMS漏洞、编辑器漏洞、CVE漏洞

    目录 解析漏洞: 原理: 变化因素: 熟知的中间件(解析漏洞) 0x01    IIS5.x-6.x解析漏洞: (1)目录解析漏洞(IIS6.0) 原理: 利用过程: (2)文件解析漏洞 原理: 利用 ...

  8. Java反序列化漏洞通用利用分析

    2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSpher ...

  9. Lib之过?Java反序列化漏洞通用利用分析

    1 背景 2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来***最新版的WebLogic.We ...

最新文章

  1. 刚刚做了个chrome浏览器 博客园转载插件,欢迎试用,多提意见!
  2. 产品经理专业知识50篇(五)-用户成长体系设计方案
  3. Linux上的ffmpeg完全使用指南
  4. Python之倒序切片
  5. stored_outline优化稳定执行计划
  6. 一个小问题:深度学习模型如何处理大小可变的输入
  7. [.NET] 《Effective C#》快速笔记(四)- 使用框架
  8. c语言线性拉伸0到255,数字图像处理作业题.doc
  9. 韦东山: 作为一个初学者,怎样学习嵌入式Linux?
  10. 彻底搞懂数据库内连接、外连接
  11. 华为OD机试真题大全完整目录
  12. Oracle 10g 32位 下载地址
  13. 统信UOS系统如何格式化U盘
  14. Linux解决出现错误时蜂鸣器滴滴响的问题
  15. Zotero中文文献管理
  16. 【老板须知】实施ERP系统能为公司带来什么样的好处
  17. 【LOJ6436】【PKUSC2018】神仙的游戏(NTT)
  18. 张量网络算法基础(三、格点模型)
  19. 北京尚学堂带你“重新”认识程序员
  20. Echats关系图les-miserables的图表详细解析(和弦图)(一)

热门文章

  1. php阳历转阴历(农历),阴历转阳历的方法
  2. Linux 用户磁盘空间配额管理
  3. gradle入门(1-7)eclipse和gradle集成插件的安装和使用
  4. (翻译) MongoDB(15) 在 Tarball 上安装MongoDB社区版
  5. Spring MVC 入门指南(二):@RequestMapping用法详解
  6. 有哪些问题应该得到解决?
  7. HBase常用操作备忘
  8. pselect 和 select
  9. 2012-11-6 2个月小结
  10. Jquery 操作checkbox