DNS pinning 不能防止复杂的 DNS 重新绑定攻击。
考虑一个攻击者在其 Web 服务器前面设置防火墙的场景。您请求他们的网站,attacker.com,这会导致 DNS 查询返回他们的 IP 地址。DNS 结果的 TTL(生存时间)为 1 秒。通常,这意味着浏览器应该在 1 秒后发出另一个 DNS 请求,但是,DNS 固定指示浏览器忽略 TTL 并添加一些时间单位(比如一小时)。所以现在,您的浏览器在 1 小时 1 秒内不会对该主机名进行另一个 DNS 查询。在 DNS 查询完成后,您的 HTTP 请求将被发送,攻击者将使用 javascript 代码发回您请求的网站,这将发起攻击。
现在,攻击者的 Javascript 设置了一个 AJAX 请求,该请求在触发前等待两秒钟。然后它会自动再次请求攻击者网站上的一些资源。但是,请求失败。这是因为攻击者已经设置了防火墙规则来阻止你的浏览器请求。现在我们处于以下状态:
- 第一次 DNS 请求时 TTL 已过期,但 DNS 固定仍然有效
- 您通过他们的 JS AJAX 调用向攻击者的网站发出请求
- 请求被攻击者的防火墙丢弃
尽管您使用的是 DNS 固定,这三件事将导致您的 Web 浏览器发送另一个 DNS 查询。实际上,攻击者通过使用防火墙并在 TTL 之外发送第二个请求,轻松击败了您的 DNS 固定策略。DNS pinning 不是一种有效的策略,因为有很多正当的理由可以导致某人的服务器宕机;如果有另一个 DNS 记录将解析到正确的机器(例如,在服务器迁移、停机等情况下),您的浏览器将被迫进行第二次 DNS 查询。基本上,您的浏览器无法知道它是否真的在这里受到了攻击;据它所知,服务器已合法关闭,因此它必须发出另一个 DNS 请求。
那么......为什么有第二个DNS请求很重要?
攻击者通常使用第二个 DNS 请求来为 DNS 记录返回错误的 IP 地址。浏览器具有所谓的“同源”策略,可防止网页请求它们不拥有的资源。基本上相同来源的工作方式是它说http://hostname.com只能请求http://hostname.com. 但它实际上使用 hostname.com 的 IP 地址,而不是人类可读的主机名本身。因此,在 DNS 重新绑定攻击中,当您的浏览器进行我之前描述的第二次 DNS 查询时,攻击者将在 DNS 查询结果中返回一个“假”IP 地址。然后你的浏览器会认为,例如,IP 地址 1.1.1.1 属于攻击者.com,即使它确实属于 google.com。这允许攻击者利用浏览器的同源策略;现在攻击者的 javascript 可以通过 AJAX 从 google.com 请求内容。此外,他们可以读取和设置 cookie 和其他恶意内容。这通过欺骗浏览器信任返回的第二个 DNS 记录来利用同源策略。现在浏览器认为 hostname.com 与 IP 地址 1.1.1.1 相关联,即使它确实不是 吨。浏览器有什么用?DNS 没有内置这种身份验证。:(
防止 DNS 重新绑定攻击
有很多方法可以防止它,我很确定现代浏览器已经实现了针对这些攻击的保护。防止它的一种简单方法(作为 Web 所有者)是检查请求的 HTTP 主机标头。例如,如果您是 google.com,那么您会收到一个请求,但主机标头仍会显示攻击者.com。显然,这不是您的域的一部分,因此您可以通过丢弃请求来防止攻击。为什么有人要开始这样做?好吧,广告中的点击欺诈。一次从多台机器上抓取搜索引擎。从公司内部网络上的网站窃取有价值的数据。等等。