代码审计之zzcms
字数 2071 2025-08-05 00:15:37
ZZCMS 2020 代码审计与漏洞分析教学文档
0x00 前言
本文档基于对ZZCMS 2020版本的代码审计结果编写,详细分析了该CMS中存在的多个安全漏洞,包括重装漏洞、XSS漏洞、SQL注入漏洞等。通过本教程,读者可以学习到PHP代码审计的基本方法和常见漏洞的挖掘技巧。
0x01 环境准备
- 目标系统: ZZCMS 2020 (最后更新于2020-7-26)
- 测试环境:
- PHPStudy (PHP 5.6.27 + Apache + MySQL)
- Windows 7 64位
- 源码下载: http://www.zzcms.net/about/6.htm
0x02 目录结构分析
/install 安装程序目录
/admin 默认后台管理目录
/user 注册用户管理程序
/skin 用户网站模板
/template 系统模板
/inc 系统包含文件
/area 各地区显示文件
/zs 招商程序
/pp 品牌
/dl 代理
/zh 展会
/company 企业
/job 招聘
/zx 资讯
/special 专题
/ask 问答
/zt 注册用户展厅页程序
/one 单页面存放目录
/ajax ajax程序处理页面
/reg 用户注册页面
/3 第三方插件存放目录
/cache 缓存文件
/uploadfiles 上传文件存放目录
/dl_excel 代理信息excel表格上传目录
/image 图片和swf文件
/js js文件
/html 静态页存放目录
0x03 漏洞分析
1. 重装漏洞
漏洞文件: /install/index.php
漏洞分析:
- 通过
switch($step)控制安装步骤 step1.php检查install.lock文件是否存在- 直接传入
step=2可跳过文件检测
利用方法:
直接访问/install/index.php?step=2可绕过安装检测,导致重装漏洞。
2. 前台反射型XSS漏洞
漏洞文件: uploadimg_form.php
漏洞参数:
imgid参数noshuiyin参数
利用方法:
构造XSS闭合语句:
"><script>alert(1)</script>
3. 后台反射型XSS漏洞
漏洞文件: /admin/ad_manage.php
漏洞分析:
- 通过
REQUEST获取keyword参数并直接输出 - GET方式提交被
stopsqlin.php拦截 - POST方式可绕过检测
绕过方法:
- GET方式使用大写关键词绕过
- 直接使用POST方式提交
4. 后台SQL注入漏洞
漏洞文件: /admin/ask.php
漏洞分析:
$_COOKIE["askbigclassid"]未用引号包裹直接带入SQL- 当
do=add时调用漏洞代码 - 默认SQL关键词被
stopsqlin.php拦截
绕过方法:
在URI中包含siteconfig.php、label或template.php可绕过检测
利用方法:
构造数据包:
GET /admin/ask.php?do=add&siteconfig.php=1 HTTP/1.1
Cookie: askbigclassid=1 AND 1=1
5. 存储型XSS漏洞
后台存储XSS
漏洞文件: /admin/siteconfig.php
漏洞分析:
- 使用
stripfxg()函数处理sitecount参数 - 处理后写入
/inc/config.php - 在首页输出该内容
利用方法:
在后台配置中插入XSS代码,访问首页触发。
前台存储XSS
漏洞文件: /zt/show.php + /user/manage.php
漏洞分析:
manage.php可修改zzcms_user表的content字段show.php读取并输出该字段- 使用
stripfxg()函数处理内容
利用方法:
- 构造POST请求修改用户信息:
POST /user/manage.php?action=modify HTTP/1.1
content=<script>alert(1)</script>
- 访问
/zt/show.php?id=[用户ID]触发XSS
0x04 关键函数分析
1. zc_check()函数
位置: /inc/stopsqlin.php
功能:
- 对输入参数进行安全处理
- 使用
trim()、htmlspecialchars()和addslashes()处理 - 防止SQL注入和XSS攻击
2. stripfxg()函数
位置: /inc/function.php
功能:
- 使用
stripslashes()移除反斜杠 - 当
$htmlspecialchars_decode=true时还原HTML实体 - 与
zc_check()功能相反,会抵消安全处理效果
0x05 防御机制与绕过
1. stopsqlin.php防御机制
检测方式:
- 黑名单检测SQL关键词
- 检测URI中的危险参数
绕过方法:
- 在URI中包含
siteconfig.php、label或template.php - 使用POST方式提交
- 使用大写关键词
0x06 审计技巧总结
- 安装目录检查:优先检查
/install目录是否存在重装漏洞 - 参数输出追踪:查找未过滤的
echo、print等输出函数 - 数据库操作追踪:查找直接拼接SQL语句的位置
- 函数调用分析:特别关注
stripfxg()等可能抵消安全措施的函数 - 防御机制分析:理解系统的防御机制及其绕过方法
- 全局搜索关键词:如
stripslashes、htmlspecialchars_decode等
0x07 修复建议
- 安装完成后删除或重命名
/install目录 - 对所有用户输入进行严格的过滤和转义
- 统一使用预处理语句执行SQL查询
- 移除或限制
stripfxg()函数的使用 - 完善输入检测机制,不依赖URI检测
- 对Cookie值进行严格验证
通过本教程的学习,读者可以掌握基本的PHP代码审计方法和常见漏洞的挖掘技巧,在实际审计工作中可参考类似的思路和方法。