JSON API 的 XSS 漏洞

Posted

技术标签:

【中文标题】JSON API 的 XSS 漏洞【英文标题】:XSS vulnerability for JSON API 【发布时间】:2021-05-01 23:43:55 【问题描述】:

我有一个接受和返回 JSON 数据的 REST API。

一个示例请求响应如下

请求


    "repos": [
        "some-repo",
        "test-repo<script>alert(1)</script>"
    ]

回应


    "error": "Error Message",
    "repos": [
        "test-repo<script>alert(1)</script>"
    ]

我的 API 是否容易受到 XSS 攻击?据我了解,由于 Content-Type 设置为 application/json,因此 API 本身不受 XSS 影响。客户端需要确保对输出进行编码以防止任何 XSS 攻击。 要添加额外的安全层,我可以在 API 层中添加一些输入编码/验证。

请告诉我我的评估是否正确以及我需要注意的任何其他问题

【问题讨论】:

【参考方案1】:

我认为这里的任何 XSS 问题都是客户端的漏洞是正确的。如果客户端将 html 插入到文档中,则它有责任应用任何必要的编码。

客户端知道需要什么编码,而不是服务器。对于相同的数据,在不同的地方可能需要不同的编码,或者不需要编码。例如:

如果客户做了类似的事情:

$(div).html("<b>" + repos + "</b>");

那么它将容易受到 XSS 的攻击,因此 repos 需要在此处进行 HTML 编码。

但如果它做了类似的事情:

$(div).append($("<b>").text(repos));

那么 HTML 编码会导致 HTML 实体代码错误地显示给用户。

或者如果客户端想要对数据做一些处理,它可能希望明文数据先做处理,然后再编码输出。

输入验证也有帮助,但有效输入的规则可能与无需编码即可安全使用的规则不一致。与号、引号和括号之类的东西也可以出现在有效的文本数据中。但如果您的数据不能包含这些字符,您可以将输入视为无效而拒绝。

【讨论】:

【参考方案2】:

您的 API 不会受到 XSS 攻击,除非它还提供使用它的 UI。您的 API 客户端可能易受攻击 - 他们需要确保在任何 UI 中使用 API 中的任何数据之前正确编码。

【讨论】:

【参考方案3】:

我认为您的 api 很容易受到攻击,尽管脚本可能无法执行。谈到 XSS 预防,我们总是建议在 api 处理输入时解码/验证危险字符。有一个共同的要求“在将数据存储到数据库之前对其进行清理”。 至于你的情况,api只是响应一个json,但我们不知道json中的数据将用于何处。通常前端接受数据而不进行任何解码/验证,如果那样,就会有一个 xss。 您谈到客户端使用解码从您的 api 获得的数据。是的,我同意,但是前端总是“信任”后端,这样他们就不会解码数据。但 api 服务器不应信任来自前端的任何输入,因为这可以由(恶意)用户控制/更改。

【讨论】:

以上是关于JSON API 的 XSS 漏洞的主要内容,如果未能解决你的问题,请参考以下文章

漏洞挖掘 | 一次XSS和CSRF的组合拳进攻 (CSRF+JSON)

搜索框存在xss漏洞,怎样修复

开源 Web 应用最常见漏洞是 XSS 和 SQLI 漏洞

2016-02-03 xss漏洞

在JSON端点上利用CSRF漏洞的实践教程

漏洞赏金 XSS 漏洞网站负载