发生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.557public 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) 攻击语句,常见于对数据库的渗透测试或恶意攻击中。
关键特征解析
-  SLEEP(4)函数:- 在 MySQL 中,SLEEP(N)会让数据库暂停执行N秒。攻击者通过观察页面响应时间是否延迟,间接判断注入是否成功(即使没有直接回显数据)。
 
- 在 MySQL 中,
-  子查询结构: - (SELECT * FROM (SELECT SLEEP(4)) uczk):- 内层 SELECT SLEEP(4)生成一个单行单列的结果(值为0,因为SLEEP返回执行结果)。
- 外层 SELECT * FROM (...) uczk中的uczk是子查询的别名(避免语法错误)。
- 该子查询的目的是确保语法正确性,同时触发时间延迟。
 
- 内层 
 
-  OR条件与LIMIT 1:- OR用于绕过原有查询条件(如登录验证),将原查询逻辑变为永真(- OR TRUE)。
- LIMIT 1确保只返回一行结果,避免因多行数据导致应用程序报错。
 
攻击原理
- 盲注场景:当目标页面没有显式错误信息或数据回显时,攻击者通过时间差推断漏洞存在。
- 执行过程: - 攻击者将恶意负载插入输入参数(如 URL、表单字段)。
- 后端数据库执行拼接后的 SQL 语句,触发 SLEEP(4)。
- 若页面响应时间增加约 4 秒,则确认存在 SQL 注入漏洞。
 
防御建议
- 参数化查询(预编译语句):# 正确示例(使用参数化查询) cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
- 输入过滤与白名单: - 对用户输入进行严格校验(如类型、长度、格式)。
 
- 最小化数据库权限: - 避免使用高权限账户连接数据库,限制 SLEEP等危险函数的使用。
 
- 避免使用高权限账户连接数据库,限制 
- 监控与日志审计: - 记录异常查询行为,及时告警长时间执行的 SQL 语句。
 
总结
该语句通过 SLEEP 函数制造时间延迟,属于典型的 基于时间的盲注,主要针对 MySQL 数据库。开发者需加强输入校验并使用参数化查询,从根本上杜绝此类攻击。