虽然将 CSP 用于稍微不同的目的(沙盒),但我意识到一个非常简单的自动点击链接似乎可以绕过甚至相对严格的 CSP。我所描述的是以下内容:
内容安全政策:
default-src 'none'; script-src 'unsafe-inline';
和 body :
<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 - 但如果你真的必须防止此类攻击,它可能是你唯一的选择。在使用这样的东西之前,请确保确实没有办法禁用内联脚本(应该涵盖大多数攻击)。此外,您应该将您的反馈发送到带有 [CSP2] 主题的 public-webappsec@w3.org 邮件列表。
这是我的(不完整的)想法:
function guardMethods(clazz, methodNames, urlGetter, allowFilter, reportViolation) {
var prototype = clazz.prototype;
methodNames.forEach(function (methodName) {
var originalMethod = prototype[methodName];
if (originalMethod) {
Object.defineProperty(prototype, methodName, {
value: function () {
var url = urlGetter.apply(this, arguments) || '';
if (allowFilter(url)) {
return originalMethod.apply(this, arguments);
} else {
reportViolation(url);
}
}
});
}
})
}
function allowFilter(url) {
// todo: implement
}
function reportViolation(url) {
console.error('Redirection prevented:', url);
}
guardMethods(HTMLAnchorElement, ['click', 'dispatchEvent', 'fireEvent'], function () {return this.href}, allowFilter, reportViolation);
您必须为 location、location.href、window.open 和其他允许重定向到其他页面的函数/属性/事件实现类似的保护措施。如果你只错过一个,那么你仍然很脆弱。 CSP 本身可以涵盖表单、XHR 和大多数其他资源。据我所知,原型(prototype) hack 在某些旧版浏览器中不起作用。
再一次,我不推荐使用这个。您犯错或它在某些浏览器中不起作用或添加可用于重定向的新 API 的可能性太高了。
关于javascript - 使用 CSP 防止自动点击链接 XSS 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752566/