当前位置: 首页 > article >正文

【渗透测试】基于时间的盲注(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 数据库。开发者需加强输入校验并使用参数化查询,从根本上杜绝此类攻击。


http://www.kler.cn/a/579390.html

相关文章:

  • elasticsearch是哪家的
  • 物联网中如何解决网络复杂性的问题
  • 爬虫去重:数据采集时如何进行去重,及去重优化策略
  • 2025最新Postman、Apipost和Apifox API 协议与工具选择方案解析
  • PG vs MySQL 主从复制的异同点
  • hom_mat2d_to_affine_par 的c#实现
  • hadoop集群HDFS读写性能测试
  • 使用mergekit合并大型语言模型
  • 使用chroot预安装软件到ubuntu22中
  • 【学习笔记】【DeepSeek AI 医生】2-2 AI家庭医生课程内容介绍
  • vscode的终端无法运行vue或者node等命令解决方案
  • 在uni-app中使用SQLite实现离线下数据同步:从封装到实践
  • 框架基本知识总结 Day15
  • 字母异位词分组 力扣49
  • UI自动化测试Selenium安装教程(1)
  • 解决VScode 连接不上问题
  • Python Flask 使用不同的 HTTP 方法类型处理请求
  • 华为OD机试-数组去重和排序(Java 2024 C卷 100分)
  • React 项目中 SVG 图标的调试和预览方法
  • Go红队开发—格式导出