ZZCMS v8.3二阶注入之一次小心的试探
字数 1359 2025-08-18 11:37:37

ZZCMS v8.3 二阶SQL注入漏洞分析与利用

漏洞概述

ZZCMS v8.3存在一个二阶SQL注入漏洞,攻击者可以通过精心构造的Payload实现时间盲注攻击。该漏洞出现在资讯发布和查看功能中,由于对editor参数处理不当,导致存储在数据库中的恶意SQL片段在后续查询中被执行。

漏洞位置

  1. 资讯发布处理文件:/user/zxsave.php (第51行)
  2. 资讯查看处理文件:/zx/show.php (第36行、第92行、第155行)

漏洞原理

初始输入处理

在发布资讯时,系统对POST数据使用了addslashes函数进行转义处理,但editor参数可控且未进行充分过滤:

// /user/zxsave.php 第51行
// 对POST数据使用addslashes但editor参数仍可控

二阶注入触发点

当用户查看资讯时,系统会执行以下操作:

  1. 查询文章ID对应的信息
  2. 检查用户组级别(groupid)和查看积分要求
  3. 如果满足条件,调用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)

这导致时间盲注成为可能,通过响应时间判断注入是否成功。

漏洞利用

基本利用步骤

  1. 以普通用户身份发布资讯(groupid=1)
  2. 设置查看权限为VIP或高级会员(或通过BurpSuite修改groupid为2)
  3. 设置查看积分大于0
  4. 构造恶意editor参数:
editor=' and groupid=(select sleep(3)) -- -
  1. 查看资讯时观察响应时间异常

利用技巧

  1. 绕过积分消耗
    and逻辑运算符替换为or,可以避免积分净损失:

    update zzcms_user set totleRMB=totleRMB+10 where username = 'TEag1e'' or groupid = (select sleep(3))
    

    这样既扣除10积分又增加10积分,实现零成本攻击。

  2. MySQL执行特性

    • 使用or时,如果前面条件已匹配所有记录,后面条件不会执行
    • 使用and时,如果前面条件不匹配任何记录,后面条件不会执行

限制与绕过

  1. 字段长度限制
    editor字段有50字符限制,需精心构造短小有效的Payload

  2. 逻辑漏洞
    系统未校验cookie中的Username参数,可构造积分转移攻击:

    • 发布资讯时将editor设为自己的用户名
    • 查看时将cookie中的Username设为受害者用户名
    • 实现:受害者减10分,攻击者加10分

漏洞复现

环境准备

  1. 下载ZZCMS v8.3
  2. 准备两个测试账户(攻击者和受害者)

复现步骤

  1. 攻击者登录并发布资讯:

    • 设置groupid=2(VIP权限)
    • 设置查看积分=10
    • 设置editor为恶意Payload或自己的用户名
  2. 查看资讯:

    • 对于时间盲注:观察响应延迟
    • 对于积分转移:修改cookie中的Username
  3. 验证结果:

    • 检查数据库响应时间
    • 检查用户积分变化

防御建议

  1. 输入验证:

    • 对editor参数实施严格的白名单过滤
    • 限制特殊字符输入
  2. 输出处理:

    • 使用预编译语句处理数据库查询
    • 对动态生成的SQL进行参数化
  3. 逻辑修复:

    • 校验cookie中的Username与当前会话的一致性
    • 实现积分交易的原子性和一致性检查
  4. 其他措施:

    • 设置合理的字段长度限制
    • 实施最小权限原则

总结

ZZCMS v8.3的二阶SQL注入漏洞展示了即使使用addslashes等基础防护措施,不当的业务逻辑设计仍可能导致严重的安全问题。开发人员需要关注数据在整个生命周期中的安全性,从输入到存储再到使用,实施全方位的防护措施。

ZZCMS v8.3 二阶SQL注入漏洞分析与利用 漏洞概述 ZZCMS v8.3存在一个二阶SQL注入漏洞,攻击者可以通过精心构造的Payload实现时间盲注攻击。该漏洞出现在资讯发布和查看功能中,由于对editor参数处理不当,导致存储在数据库中的恶意SQL片段在后续查询中被执行。 漏洞位置 资讯发布处理文件: /user/zxsave.php (第51行) 资讯查看处理文件: /zx/show.php (第36行、第92行、第155行) 漏洞原理 初始输入处理 在发布资讯时,系统对POST数据使用了 addslashes 函数进行转义处理,但 editor 参数可控且未进行充分过滤: 二阶注入触发点 当用户查看资讯时,系统会执行以下操作: 查询文章ID对应的信息 检查用户组级别(groupid)和查看积分要求 如果满足条件,调用Payif函数处理积分交易 注入点分析 在积分处理过程中,系统构建了不安全的SQL语句: 当 editor 参数被恶意构造时,例如: 实际执行的SQL语句变为: 这导致时间盲注成为可能,通过响应时间判断注入是否成功。 漏洞利用 基本利用步骤 以普通用户身份发布资讯(groupid=1) 设置查看权限为VIP或高级会员(或通过BurpSuite修改groupid为2) 设置查看积分大于0 构造恶意editor参数: 查看资讯时观察响应时间异常 利用技巧 绕过积分消耗 : 将 and 逻辑运算符替换为 or ,可以避免积分净损失: 这样既扣除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 等基础防护措施,不当的业务逻辑设计仍可能导致严重的安全问题。开发人员需要关注数据在整个生命周期中的安全性,从输入到存储再到使用,实施全方位的防护措施。