DNS注入
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路径,类似于
1 | file://Win/Users/Administrator/Document/flag.txt |
形式获取所需信息。
举例:
获取一个Subdomain
ustawe.dnslog.cn
当我们通过浏览器访问 test.ustawe.dnslog.cn 时,就能看到被访问的子域名
同样,在mysql中执行SQL语句:
也会获取到记录:
因此我们可以使用concat()等字符串拼接函数,将SQL语句拼接进去,让数据库带着执行结果产生DNS日志,获取数据库中的信息。
0x02 使用条件(mysql)
1、需要支持load_file()函数
2、secure_file_priv的值为空
Tips:一个站点如果存在DNS注入,说明读取文件的函数可以使用,因此可以尝试读取服务器上的一些敏感文件。