Cscms代码审计-PHP
字数 1564 2025-08-29 08:31:35
Cscms代码审计教学文档
1. 环境准备
- CMS版本: Cscms 4.2
- PHP版本: 7.0.9(建议使用此版本进行复现)
- 审计工具: PhpStorm(用于代码分析)、BurpSuite(用于抓包和修改请求)
2. 漏洞概述
本次审计发现两个高危漏洞:
- SSRF漏洞(服务器端请求伪造)
- 文件覆盖导致Getshell漏洞
3. SSRF漏洞分析
3.1 漏洞位置
- 功能点: 后台工具栏的采集功能
- 文件路径:
upload/plugins/sys/admin/Collect.php - 方法:
Collect->add
3.2 漏洞触发流程
- 请求中的
cjurl参数未做安全处理 - 参数被传入
$this->caiji->str方法 - 通过
htmlall方法使用curl请求URL
3.3 代码分析
// Collect.php#Collect->add
$cjurl = $_POST['cjurl']; // 未过滤的用户输入
$this->caiji->str($cjurl); // 传入危险方法
// 查找str方法定义(在PhpStorm中按两次Shift键搜索)
// str方法内部调用htmlall方法
function str($url) {
$this->htmlall($url);
}
// htmlall方法使用curl请求
function htmlall($url) {
// 使用curl请求$url,存在SSRF风险
}
3.4 复现步骤
- 在本地使用Python3开启HTTP服务:
python3 -m http.server 8000 - 访问后台采集功能
- 在采集URL处输入
http://127.0.0.1:8000 - 观察本地服务收到请求,证明SSRF存在
3.5 影响范围
所有调用$this->caiji->str方法的地方都存在SSRF漏洞
4. 文件覆盖导致Getshell漏洞
4.1 漏洞位置
- 敏感函数:
write_file(文件写入函数) - 文件路径:
upload/cscms/app/helpers/common_helper.php
4.2 漏洞触发流程
- 查找调用
write_file的位置(PhpStorm中Ctrl+Shift+F搜索) - 发现
upload/plugins/sys/admin/Plugins.php#Plugins->_route_file调用此函数 $note[$key]['name']和$note[$key]['url']以字符串方式拼接到文件内容- 可通过换行符绕过注释限制
4.3 关键代码分析
// common_helper.php
function write_file($file, $content) {
// 文件写入操作
}
// Plugins.php#_route_file
foreach($note as $key=>$val) {
$data .= "//".$note[$key]['name']."\n";
$data .= "\$route['".$key."'] = '".$note[$key]['url']."';\n\n";
}
write_file($file, $data); // 写入文件
4.4 复现步骤
- 使用BurpSuite抓取请求包
- 修改请求包内容,插入换行符和恶意代码:
name=%0aphpinfo();/* url=*/%0a// - 文件将写入到
upload/cscms/config/dance/rewrite.php - 访问个人中心的音乐页面触发代码执行
4.5 绕过限制技巧
- 发现
eval、shell_exec等函数被转义 assert未被转义,但在PHP7+有限制- 最终利用PHP动态特性实现RCE:
${system('id')};
5. 代码审计方法论总结
5.1 审计方法
-
功能点定向审计:
- 针对特定功能(如采集功能)进行深入分析
- 根据经验判断常见漏洞位置
-
敏感函数回溯:
- 从危险函数(如文件操作、命令执行等)回溯参数来源
- 分析参数是否可控
-
通读全文代码(本次未使用):
- 全面阅读代码,发现潜在问题
5.2 PhpStorm审计技巧
-
快速定位方法定义:
- 双击Shift键全局搜索
- Ctrl+鼠标左键跳转到定义
-
全局搜索调用关系:
- Ctrl+Shift+F全文搜索
- 分析函数调用链
-
代码结构分析:
- 使用Structure面板查看类和方法结构
- 利用Find Usages分析变量使用情况
6. 漏洞修复建议
6.1 SSRF修复
- 对采集URL进行严格过滤
- 限制访问内网IP和特殊协议
- 使用白名单机制限制可采集的域名
6.2 文件覆盖修复
- 对写入内容进行严格过滤
- 禁止换行符等特殊字符
- 对PHP代码进行转义处理
- 限制文件写入权限和目录
7. 总结
本次审计展示了从功能点和敏感函数入手的两种代码审计方法,成功发现SSRF和文件覆盖Getshell两个高危漏洞。通过PhpStorm的高效搜索和分析功能,大大提高了审计效率。最后利用PHP动态特性绕过过滤实现RCE,展示了漏洞利用的创造性思维。