發生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 數據庫。開發者需加強輸入校驗并使用參數化查詢,從根本上杜絕此類攻擊。