代码审计之zzcms网站管理系统
字数 1832 2025-08-18 11:37:07

ZZCMS 8.2 代码审计与漏洞分析教学文档

一、审计工具与环境准备

  1. 审计工具:使用Seay源代码审计系统

    • 支持自动审计功能
    • 提供全局定位搜索功能
    • 可生成扫描报告
  2. 审计流程

    • 导入项目源码
    • 执行自动审计
    • 分析扫描结果
    • 重点验证可疑漏洞点

二、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进行输入过滤
  • 直接输出用户控制的lbkeyword参数
  • 可构造恶意输入闭合标签

2. 图片上传表单XSS

漏洞文件/uploadimg_form.php (66-67行)

六、文件上传漏洞

漏洞文件/uploadimg.php

漏洞分析

  1. 检查流程:

    • 检查文件是否存在
    • 检查文件大小
    • 检查MIME类型(可被GIF89a绕过)
    • 黑名单检查后缀(php/asp/jsp)
  2. 绕过方法:

    • 使用.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;
}

过滤方式

  1. trim()去除空白字符
  2. htmlspecialchars()转义HTML特殊字符
  3. 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等关键词)
  • 大小写可绕过
  • 可使用编码/注释绕过

八、防御建议

  1. SQL注入防御

    • 使用预处理语句
    • 完善过滤函数的关键词列表
    • 对表名、字段名等使用白名单校验
  2. 文件操作防御

    • 限制文件路径范围
    • 过滤../等路径遍历字符
    • 使用basename()获取文件名
  3. XSS防御

    • 统一输入过滤机制
    • 在输出时进行HTML编码
    • 设置CSP策略
  4. 文件上传防御

    • 使用白名单校验文件后缀
    • 检查文件内容而非仅扩展名
    • 上传后重命名文件
  5. 安装流程防御

    • 所有安装步骤都检查install.lock
    • 安装完成后删除install目录

九、审计技巧总结

  1. 关注用户输入点

    • $_GET/$_POST/$_COOKIE/$_REQUEST
    • 文件上传
    • HTTP头(如IP地址)
  2. 追踪数据流向

    • 从输入点到最终使用点
    • 特别注意数据库操作、文件操作、命令执行等危险函数
  3. 审计工具辅助

    • 使用自动审计工具快速定位可疑点
    • 利用全局搜索追踪变量和函数
  4. 验证漏洞时注意

    • 实际环境测试
    • 考虑过滤规则的绕过方法
    • 构造最小化PoC
  5. 学习资源推荐

    • 《代码审计--企业级Web代码安全架构》
    • 各类CMS漏洞分析文章
    • OWASP代码审计指南
ZZCMS 8.2 代码审计与漏洞分析教学文档 一、审计工具与环境准备 审计工具 :使用Seay源代码审计系统 支持自动审计功能 提供全局定位搜索功能 可生成扫描报告 审计流程 : 导入项目源码 执行自动审计 分析扫描结果 重点验证可疑漏洞点 二、SQL注入漏洞分析 1. 基于IP伪造的SQL注入 漏洞文件 : /user/check.php 漏洞代码 : 漏洞分析 : getip() 函数从多个HTTP头获取IP地址(HTTP_ CLIENT_ IP、HTTP_ X_ FORWARDED_ FOR等) 未对IP地址进行过滤处理 攻击者可伪造恶意IP构造SQL注入 利用方法 : 2. 表名直接拼接导致的SQL注入 漏洞文件 : /user/del.php 漏洞代码 : 漏洞分析 : $tablename 变量直接从POST获取 未进行任何过滤直接拼接进SQL语句 可构造恶意表名实现注入 改进的Payload : 三、任意文件删除漏洞 1. 广告管理模块文件删除 漏洞文件 : /user/adv.php 漏洞代码 : 漏洞分析 : $oldimg 变量未过滤 ../ 等路径遍历字符 可跨目录删除任意文件 需要满足 $action=="modify" 且 $img != $oldimg 利用Payload : 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 文件 其他步骤文件缺少安装锁定检查 可直接访问后续步骤重装系统 利用方法 : 五、反射型XSS漏洞 1. 顶部导航栏XSS 漏洞文件 : /inc/top.php 漏洞代码 : 漏洞分析 : 未包含 /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 过滤函数 : 过滤方式 : trim() 去除空白字符 htmlspecialchars() 转义HTML特殊字符 addslashes() 转义SQL特殊字符 2. SQL关键词过滤 函数 : 缺陷 : 过滤不完整(缺少sleep、benchmark等关键词) 大小写可绕过 可使用编码/注释绕过 八、防御建议 SQL注入防御 : 使用预处理语句 完善过滤函数的关键词列表 对表名、字段名等使用白名单校验 文件操作防御 : 限制文件路径范围 过滤 ../ 等路径遍历字符 使用 basename() 获取文件名 XSS防御 : 统一输入过滤机制 在输出时进行HTML编码 设置CSP策略 文件上传防御 : 使用白名单校验文件后缀 检查文件内容而非仅扩展名 上传后重命名文件 安装流程防御 : 所有安装步骤都检查install.lock 安装完成后删除install目录 九、审计技巧总结 关注用户输入点 : $_GET / $_POST / $_COOKIE / $_REQUEST 文件上传 HTTP头(如IP地址) 追踪数据流向 : 从输入点到最终使用点 特别注意数据库操作、文件操作、命令执行等危险函数 审计工具辅助 : 使用自动审计工具快速定位可疑点 利用全局搜索追踪变量和函数 验证漏洞时注意 : 实际环境测试 考虑过滤规则的绕过方法 构造最小化PoC 学习资源推荐 : 《代码审计--企业级Web代码安全架构》 各类CMS漏洞分析文章 OWASP代码审计指南