ZZCMS v8.3二阶注入之一次小心的试探
字数 1359 2025-08-18 11:37:37
ZZCMS v8.3 二阶SQL注入漏洞分析与利用
漏洞概述
ZZCMS v8.3存在一个二阶SQL注入漏洞,攻击者可以通过精心构造的Payload实现时间盲注攻击。该漏洞出现在资讯发布和查看功能中,由于对editor参数处理不当,导致存储在数据库中的恶意SQL片段在后续查询中被执行。
漏洞位置
- 资讯发布处理文件:
/user/zxsave.php(第51行) - 资讯查看处理文件:
/zx/show.php(第36行、第92行、第155行)
漏洞原理
初始输入处理
在发布资讯时,系统对POST数据使用了addslashes函数进行转义处理,但editor参数可控且未进行充分过滤:
// /user/zxsave.php 第51行
// 对POST数据使用addslashes但editor参数仍可控
二阶注入触发点
当用户查看资讯时,系统会执行以下操作:
- 查询文章ID对应的信息
- 检查用户组级别(groupid)和查看积分要求
- 如果满足条件,调用Payif函数处理积分交易
// /zx/show.php 第36行
// 根据groupid和积分要求进行判断
注入点分析
在积分处理过程中,系统构建了不安全的SQL语句:
update zzcms_user set totleRMB=totleRMB+10 where username = 'admin'
当editor参数被恶意构造时,例如:
editor=' and groupid=(select sleep(3)) -- -
实际执行的SQL语句变为:
update zzcms_user set totleRMB=totleRMB+10 where username = '' and groupid = (select sleep(3)
这导致时间盲注成为可能,通过响应时间判断注入是否成功。
漏洞利用
基本利用步骤
- 以普通用户身份发布资讯(groupid=1)
- 设置查看权限为VIP或高级会员(或通过BurpSuite修改groupid为2)
- 设置查看积分大于0
- 构造恶意editor参数:
editor=' and groupid=(select sleep(3)) -- -
- 查看资讯时观察响应时间异常
利用技巧
-
绕过积分消耗:
将and逻辑运算符替换为or,可以避免积分净损失:update zzcms_user set totleRMB=totleRMB+10 where username = 'TEag1e'' or groupid = (select sleep(3))这样既扣除10积分又增加10积分,实现零成本攻击。
-
MySQL执行特性:
- 使用
or时,如果前面条件已匹配所有记录,后面条件不会执行 - 使用
and时,如果前面条件不匹配任何记录,后面条件不会执行
- 使用
限制与绕过
-
字段长度限制:
editor字段有50字符限制,需精心构造短小有效的Payload -
逻辑漏洞:
系统未校验cookie中的Username参数,可构造积分转移攻击:- 发布资讯时将editor设为自己的用户名
- 查看时将cookie中的Username设为受害者用户名
- 实现:受害者减10分,攻击者加10分
漏洞复现
环境准备
- 下载ZZCMS v8.3
- 准备两个测试账户(攻击者和受害者)
复现步骤
-
攻击者登录并发布资讯:
- 设置groupid=2(VIP权限)
- 设置查看积分=10
- 设置editor为恶意Payload或自己的用户名
-
查看资讯:
- 对于时间盲注:观察响应延迟
- 对于积分转移:修改cookie中的Username
-
验证结果:
- 检查数据库响应时间
- 检查用户积分变化
防御建议
-
输入验证:
- 对editor参数实施严格的白名单过滤
- 限制特殊字符输入
-
输出处理:
- 使用预编译语句处理数据库查询
- 对动态生成的SQL进行参数化
-
逻辑修复:
- 校验cookie中的Username与当前会话的一致性
- 实现积分交易的原子性和一致性检查
-
其他措施:
- 设置合理的字段长度限制
- 实施最小权限原则
总结
ZZCMS v8.3的二阶SQL注入漏洞展示了即使使用addslashes等基础防护措施,不当的业务逻辑设计仍可能导致严重的安全问题。开发人员需要关注数据在整个生命周期中的安全性,从输入到存储再到使用,实施全方位的防护措施。