目录

渗透测试基于时间的盲注Time-Based-Blind-SQL-Injection

【渗透测试】基于时间的盲注(Time-Based Blind SQL Injection)

发生ERROR日志告警

查看系统日志如下:

java.lang.IllegalArgumentException: Illegal character in query at index 203: https://api.weixin.qq.com/sns/jscode2session?access_token=90_Vap5zo5UTJS4jbuvneMkyS1LHwHAgrofaX8bnIfW8EHXA71IRZwsqzJam9bo1m3zRcSrbgCsG-ydmu2HYWZiJEnR-jTzTKW&js_code=" OR (SELECT*FROM(SELECT(SLEEP(4)))uczk) limit 1#&secret=75c3afd41c5216fb652a00f3&grant_type=authorization_code&appid=wxf84e2db9e488888


用户登录及注册失败-微信小程序 code:0evbf4ac2ml2slzSF2Ybxm6 err:错误代码40029, 错误信息code 无效微信原始报文{"errcode":40029,"errmsg":"invalid code, rid: 67cae4aa-724ecdd5-123302e1"}mdc:{"RequestId":""}timestamp:2025-03-07 20:20:58.557


public class UserLoginReq {

    /**
     * 微信小程序appid
     */
    @NotNull(message = "微信小程序appid不能为空")
    @Schema(name = "Appid", title = "微信小程序appid")
    private String appid;

    /**
     * 授权code  
     */
    @NotNull(message = "授权code不能为空")
    @Schema(name = "Code", title = "授权code")
    private String code;

    /**
     * 授权作用域
     */
    @NotNull(message = "授权作用域不能为空")
    @Schema(name = "Scopes", title = "授权作用域")
    private Set<String> scopes;
}

通过上述可以看出渗透者通过调用登录接口请求参数传递code参数值 OR (SELECT*FROM(SELECT(SLEEP(4)))uczk) limit 1
进行渗透测试
需要加强对code参数的校验

(SELECT*FROM(SELECT(SLEEP(4)))uczk) limit 1

以上代码是一个典型的 基于时间的盲注(Time-Based Blind SQL Injection) 攻击语句,常见于对数据库的渗透测试或恶意攻击中。

关键特征解析

  1. SLEEP(4) 函数

    • 在 MySQL 中, SLEEP(N) 会让数据库暂停执行 N 秒。攻击者通过观察页面响应时间是否延迟,间接判断注入是否成功(即使没有直接回显数据)。
  2. 子查询结构

    • (SELECT * FROM (SELECT SLEEP(4)) uczk)
      • 内层 SELECT SLEEP(4) 生成一个单行单列的结果(值为 0 ,因为 SLEEP 返回执行结果)。
      • 外层 SELECT * FROM (...) uczk 中的 uczk 是子查询的别名(避免语法错误)。
      • 该子查询的目的是确保语法正确性,同时触发时间延迟。
  3. OR 条件与 LIMIT 1

    • OR 用于绕过原有查询条件(如登录验证),将原查询逻辑变为永真( OR TRUE )。
    • LIMIT 1 确保只返回一行结果,避免因多行数据导致应用程序报错。

攻击原理

  • 盲注场景 :当目标页面没有显式错误信息或数据回显时,攻击者通过时间差推断漏洞存在。
  • 执行过程
    1. 攻击者将恶意负载插入输入参数(如 URL、表单字段)。
    2. 后端数据库执行拼接后的 SQL 语句,触发 SLEEP(4)
    3. 若页面响应时间增加约 4 秒,则确认存在 SQL 注入漏洞。

防御建议

  1. 参数化查询(预编译语句)

    # 正确示例(使用参数化查询)
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
  2. 输入过滤与白名单

    • 对用户输入进行严格校验(如类型、长度、格式)。
  3. 最小化数据库权限

    • 避免使用高权限账户连接数据库,限制 SLEEP 等危险函数的使用。
  4. 监控与日志审计

    • 记录异常查询行为,及时告警长时间执行的 SQL 语句。

总结

该语句通过 SLEEP 函数制造时间延迟,属于典型的 基于时间的盲注 ,主要针对 MySQL 数据库。开发者需加强输入校验并使用参数化查询,从根本上杜绝此类攻击。