JSON劫持与JSONP注入不同吗?

信息安全 json
2021-08-16 17:40:06

在理解这两个漏洞时,我很困惑。JSONP 相关漏洞与 JSON 劫持有何不同?

1个回答

JSON劫持与JSONP注入不同吗?

的,它们是不同的攻击。虽然 JSON 劫持是过去的威胁,现在已在所有主要浏览器中消除,但 JSONP 注入仍然是 Web 应用程序的安全威胁。这两种攻击的共同点是它们的目标是从不受信任的来源读取 JSON 响应。

JSONP 注入

使用 JSONP(带填充的 JSON),应用程序故意在函数回调中提供 JSON 响应(或有时作为分配),通常是为了克服跨域边界。

例如,该站点https://example.com/mySecrets?callback=saveSecrets可能会返回当前登录用户的一些“秘密”,响应如下所示:

saveSecrets({"userSecrets": [123, 456, 789]})

在这种情况下,攻击者可以定义自己的回调函数saveSecrets

<script>
function saveSecrets(secrets) {
    alert(secrets);
}
</script>
<script src="https://example.com/mySecrets?callback=saveSecrets"></script>

(还有很多其他的 JSONP 攻击场景。你可以在这里找到更多的详细解释。)

JSON劫持

JSON 劫持遵循与泄露 JSON 响应相同的想法。但是在这种情况下,应用程序并没有提供方便的回调函数。相反,攻击依赖于修改原生 JS 对象。幸运的是,这在当前的浏览器中已经不可能了。

教科书示例是 Array 中的 JSON,例如:

[{"userSecrets": [123, 456, 789]}]

多年前,当浏览器允许脚本重新定义原生 JS 对象时,提取秘密的方法是定义自己的Array构造函数或使用 eg 劫持 Object 原型,Object.__defineSetter__然后将 URL 作为外部脚本引用,类似于上面的 JSONP 示例.

(您可以在此博客文章我的回复中阅读有关 JSON 劫持的更多信息。)