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

本文详细介绍了PHP中php_array_merge_recursive函数的Use-After-Free漏洞,该漏洞可能导致绕过禁用函数的安全风险。文章讨论了漏洞的原理,包括函数实现、错误的引用计数增加以及如何利用这个漏洞进行内存操作,最终实现禁用函数的绕过。还提供了漏洞验证的步骤和修复措施。
摘要由CSDN通过智能技术生成

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

漏洞简介

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值