0x00 前言

DNS注入是指让数据库携带所需信息去访问某一共享文件,而DNS解析会留下日志,因此可以利用DNS日志获取到数据库中的信息。

当盲注太慢,或者遇到waf阻拦等情况时,可以尝试DNS注入。

0x01 原理

在mysql中,可以使用load_file()函数进行DNS注入:

load_file():用于读取某一特定文件,并将读取结果作为字符串输出

不同的数据库,使用的函数也不相同 : (引用)

Microsoft SQL Server

master..xp_dirtree (用于获取所有文件夹的列表和给定文件夹内部的子文件夹)

master..xp_fileexist(用于确定一个特定的文件是否存在于硬盘)

master..xp_subdirs(用于得到给定的文件夹内的文件夹列表)

Oracle

GET_HOST_ADDRES (用于检索特定主机的IP)

UTL_HTTP.REQUEST (从给定的地址检索到的第1-2000字节的数据)

Mysql

load_file (读取文件内容并将其作为字符串返回)

PostgreSQL

COPY(用于在文件系统的文件和表之间拷贝数据)


UNC路径:

UNC路径是Windows系统的特性,当我们访问某一台主机的共享文件时,可以使用UNC路径,类似于

file://Win/Users/Administrator/Document/flag.txt

形式获取所需信息。

举例

访问dnslog.cn

获取一个Subdomain

DNS注入1.png

ustawe.dnslog.cn

当我们通过浏览器访问 test.ustawe.dnslog.cn 时,就能看到被访问的子域名

DNS注入2.png

同样,在mysql中执行SQL语句:

DNS注入3.png

也会获取到记录:

DNS注入4.png

因此我们可以使用concat()等字符串拼接函数,将SQL语句拼接进去,让数据库带着执行结果产生DNS日志,获取数据库中的信息。

0x02 使用条件(mysql)

1、需要支持load_file()函数

2、secure_file_priv的值为空

Tips:一个站点如果存在DNS注入,说明读取文件的函数可以使用,因此可以尝试读取服务器上的一些敏感文件。