某cms 用户中心存在时间盲注
字数 937 2025-08-29 08:32:30

ZZCMS 用户中心时间盲注漏洞分析与利用

漏洞概述

ZZCMS 用户中心存在时间盲注漏洞,该漏洞位于 /inc/function.php 文件的 markit() 函数中,由于未对 $_SERVER['REQUEST_URI'] 进行过滤就直接拼接进 SQL 语句,导致 SQL 注入漏洞。

漏洞分析

漏洞位置

漏洞核心代码位于 /inc/function.phpmarkit() 函数:

function markit(){
    $userip=$_SERVER["REMOTE_ADDR"]; 
    $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    echo $url;
    query("insert into zzcms_bad (username,ip,dose,sendtime)values('".$_COOKIE["UserName"]."','$userip','$url','".date('Y-m-d H:i:s')."')") ;     
}

漏洞成因

  1. $_SERVER['REQUEST_URI'] 直接拼接进 SQL 语句,未做任何过滤
  2. 虽然 /inc/stopsqlin.php 中有针对 XSS 的过滤,但对 SQL 注入无效:
    if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
        die ("无效参数");
    }
    

触发条件

漏洞触发需要满足以下条件:

  1. 修改 Cookie 中的 UserName
  2. 使查询出来的 $row["editor"] 值与 $username 不同
  3. $_POST['id'] 的值必须在对应表中存在

漏洞复现

复现步骤

  1. 找到调用 markit() 函数的地方,如 /user/del.php
  2. 修改 Cookie 中的 UserName
  3. 构造恶意请求,在 URL 中注入 SQL 语句
  4. 使用时间盲注技术判断注入结果

示例注入

由于注入点位于 URL 中,需要使用 ? 进行连接:

http://target.com/user/del.php?id=1' AND (SELECT * FROM (SELECT(SLEEP(5)))a)-- 

修复建议

  1. $_SERVER['REQUEST_URI'] 进行严格过滤
  2. 使用参数化查询或预处理语句
  3. 对用户输入进行转义处理
  4. 限制特殊字符的输入

技术要点

  1. 时间盲注技术:通过 SLEEP() 函数和条件判断来获取数据
  2. 注入点构造:需要理解 URL 参数如何被拼接进 SQL 语句
  3. 绕过技巧:虽然有针对 XSS 的过滤,但对 SQL 注入无效

注意事项

  1. 复现时需要确保 $_POST['id'] 的值在数据库中存在
  2. 需要修改 Cookie 中的 UserName 值才能进入注入分支
  3. 注入语句需要根据实际环境进行调整

参考链接

  • 源码下载地址:http://www.zzcms.net/download/zzcms2019.zip
  • 原始漏洞报告:http://www.a.com/asdsabdas (示例链接)
ZZCMS 用户中心时间盲注漏洞分析与利用 漏洞概述 ZZCMS 用户中心存在时间盲注漏洞,该漏洞位于 /inc/function.php 文件的 markit() 函数中,由于未对 $_SERVER['REQUEST_URI'] 进行过滤就直接拼接进 SQL 语句,导致 SQL 注入漏洞。 漏洞分析 漏洞位置 漏洞核心代码位于 /inc/function.php 的 markit() 函数: 漏洞成因 $_SERVER['REQUEST_URI'] 直接拼接进 SQL 语句,未做任何过滤 虽然 /inc/stopsqlin.php 中有针对 XSS 的过滤,但对 SQL 注入无效: 触发条件 漏洞触发需要满足以下条件: 修改 Cookie 中的 UserName 值 使查询出来的 $row["editor"] 值与 $username 不同 $_POST['id'] 的值必须在对应表中存在 漏洞复现 复现步骤 找到调用 markit() 函数的地方,如 /user/del.php 修改 Cookie 中的 UserName 值 构造恶意请求,在 URL 中注入 SQL 语句 使用时间盲注技术判断注入结果 示例注入 由于注入点位于 URL 中,需要使用 ? 进行连接: 修复建议 对 $_SERVER['REQUEST_URI'] 进行严格过滤 使用参数化查询或预处理语句 对用户输入进行转义处理 限制特殊字符的输入 技术要点 时间盲注技术 :通过 SLEEP() 函数和条件判断来获取数据 注入点构造 :需要理解 URL 参数如何被拼接进 SQL 语句 绕过技巧 :虽然有针对 XSS 的过滤,但对 SQL 注入无效 注意事项 复现时需要确保 $_POST['id'] 的值在数据库中存在 需要修改 Cookie 中的 UserName 值才能进入注入分支 注入语句需要根据实际环境进行调整 参考链接 源码下载地址:http://www.zzcms.net/download/zzcms2019.zip 原始漏洞报告:http://www.a.com/asdsabdas (示例链接)