是否可以通过适当的 JavaScript 字符串转义来 XSS 利用 JSON 响应?

新手上路,请多包涵

可以通过覆盖 Array 构造函数或者如果敌对值不是 JavaScript 字符串转义来利用 JSON 响应。

让我们假设这两个向量都以正常方式寻址。谷歌通过在所有 JSON 前加上类似以下内容的前缀来捕获 JSON 响应直接来源:

 throw 1; < don't be evil' >

然后是 JSON 的其余部分。所以 Dr. Evil 不能,使用 这里 讨论的那种漏洞。通过在他的网站上放置以下内容来获取您的 cookie(假设您已登录):

 <script src="http://yourbank.com/accountStatus.json">

至于字符串转义规则,如果我们使用双引号,我们需要在每个反斜杠前加上一个反斜杠,在每个反斜杠前加上另一个反斜杠等。

但我的问题是,如果你正在做所有这些怎么办?

Burp Suite (自动安全工具)检测在 JSON 响应中返回的未 HTML 转义的嵌入式 XSS 尝试,并将其报告为 XSS 漏洞。我有一份报告说我的应用程序包含此类漏洞,但我不相信。我试过了,但我无法使漏洞发挥作用。

所以我认为这是不正确的。

有一个特定的案例,我认为 IE MIME 类型的嗅探可能会导致漏洞利用。毕竟,IE 7 仍然具有不管 Content-Type 标头如何执行嵌入在图像评论中的脚本标签的“功能”。让我们先把这种明显愚蠢的行为放在一边。

根据旧的默认 jQuery 行为,JSON 肯定会被本机 JavaScript 解析器(Firefox 中的 Window.JSON)或 eval() 。在这两种情况下,以下表达式都不会导致执行警报:

 {"myJSON": "legit", "someParam": "12345<script>alert(1)</script>"}

我是对还是错?

原文由 Chris Mountford 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

作为记录,虽然我接受了一个答案,但对于我问的确切的字面问题,我是对的,并且由于 JSON 值中存在非 HTML 转义但正确的 JSON 转义 HTML,所以没有漏洞。如果在没有客户端转义的情况下将该值插入到 DOM 中,则可能存在错误,但 Burpsuite 几乎没有机会仅通过查看网络流量就知道是否会发生这种情况。

在确定这些情况下什么是安全漏洞的一般情况下,认识到虽然它可能感觉不是好的设计,但可以合法地知道 JSON 值的响应内容肯定不包含用户输入并且旨在已经呈现的 HTML 可以安全地插入 DOM 中,不会转义。正如我在另一条评论中提到的那样,转义它将是一个(非安全)错误。

原文由 Chris Mountford 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用正确的 Content-Type 可以避免这种潜在的 xss 漏洞。基于 RFC-4627 ,所有 JSON 响应都应使用 application/json 类型。以下代码 不存在xss漏洞,继续测试吧:

 <?php
header('Content-type: application/json');
header("x-content-type-options: nosniff");
print $_GET['json'];
?>

nosniff 标头用于在旧版本的 Internet Explorer 上禁用内容嗅探。另一种变体如下:

 <?php
header("Content-Type: application/json");
header("x-content-type-options: nosniff");
print('{"someKey":"<body onload=alert(\'alert(/ThisIsNotXSS/)\')>"}');
?>

当浏览器查看上述代码时,系统会提示用户下载 JSON 文件, JavaScript 不会在现代版本的 Chrome、FireFox 和 Internet Explorer 上执行。 这将违反 RFC。

如果您使用 JavaScript eval() 上面的 JSON 或将响应写入页面,那么它就变成了 基于 DOM 的 XSS 。基于 DOM 的 XSS 通过在处理此数据之前清理 JSON 在客户端上进行修补。

原文由 rook 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题