【发布时间】:2015-04-20 15:50:35
【问题描述】:
虽然将 CSP 用于稍微不同的目的(沙盒),但我意识到一个非常简单的自动点击链接似乎绕过了相对严格的 CSP。我所描述的内容如下:
内容安全政策:
default-src 'none'; script-src 'unsafe-inline';
还有身体:
<a href="http://www.google.com">test</a>
<script>
document.querySelector("a").click();
</script>
显然,在真正的攻击中,您会首先将 cookie 信息包含到 href 字段中,并可能将其包装在一个隐藏的自嵌入 iframe 中,或者使域将您重定向回您的来源(可能带有额外的 url 参数因此创建了一种绕过connect-src的XMLHttpRequest),但这个基本示例确实显示了问题。
有什么方法可以通过 CSP 来防止这种情况(它仍然允许执行 Javascript)?
类似的攻击
同样的事情显然也可以用其他一些导航方法来完成。我之所以专门询问这种方法,实际上与我的次要目标有关,而不是 XSS 漏洞利用。无论哪种方式,都可以接受任何和所有真正的解决方案。
无关的侧面说明
由于所有的混乱,即使没有script-src: 'unsafe-inline',这仍然适用。想象一下以下名为api.ext的文件
print URLParameters.method
[...]
然后可以像api.ext?method=<script src='api.ext?method=alert("test")//'></script><!-- 一样调用此文件(除非您需要额外的 URL 编码和其他东西,这只是为了说明问题)。发现这样的漏洞很困难,而且很少见,但即使在这些情况下,似乎也存在像 connect-src 这样的东西来防止信息泄露。
【问题讨论】:
-
您可能希望将鼠标悬停在 csp 标签上。TLA(三个字母的首字母缩写词)太多了,而您选择了错误的...
-
没有
unsafe-inline怎么办? -
@levi 如果你有一个 XSS 漏洞,你可以控制第一个字符的全部内容(很少见,但不是看不见),你可以简单地将自己嵌入到外部嵌入中,并将你的 javascript 放在内部嵌入。但无论哪种方式,这只是一个旁注,
connect-src的存在表明 CSP 也关心 Javascript 评估 XSS 漏洞。 -
@MarcB 啊,我的错,我粗心,在我的另一篇文章中正确理解了它,不知道为什么我误写了这篇文章。
-
@JacobBundgaard 如果您已经阅读了整个问题或 cmets,您会看到 1) 即使没有
unsafe-inline,攻击仍然可以执行,并且 2) CSP 关注以下攻击由connect-src的存在证明。
标签: javascript xss content-security-policy