反射 XSS(跨站点脚本)攻击是否会发生在服务于非 HTML 响应的 REST API 上

Can reflected XSS (cross site scripting) attack happen on a REST API which serves non HTML response

可以反映 XSS(跨站点脚本)攻击发生在 REST API 上,它接收 XML 请求负载,提供 XML 响应。请求或响应中没有html内容。

我已经浏览了很多关于 XSS 的文档,现在我认为这不适用于不提供 html 内容的 REST API,这是理解吗正确的? 然而,我们正在对收到的请求进行验证,以检查输入中是否有任何类型的标签 (<>),以及其他一些业务级别的验证。

关于我们服务的几点,

  1. 我们的 REST API 不接收或响应 HTML 数据。
  2. 我们没有直接从最终用户那里获得任何输入或请求 (攻击者的可能性主要来自恶意终端用户)
  3. 我们不会直接向最终用户发送 XML 响应/HTML 渲染 XSS 机会最高的系统(浏览器)。
  4. 我们接受请求并将响应传递给我们的内部服务 企业和值得信赖的(合作伙伴)。
  5. 我们发送的 XML 响应仅用于读取嵌入在 非 html env(这些是正在读取我们回复的可信服务)。

在这种情况下,XSS 的风险有多大?

(此查询背后的原因是我们收到了一个 checkmarx 高严重性错误,其中表明我们容易反射 XSS,我认为这在我们的案例中可能是误报。我们正在使用 spring启动应用程序。)

这主要取决于响应 content-type。只要它类似于 applicatiin/xmltext/xml(而不是 text/htmlapplication/xhtml),api 本身就不易受到 xss 攻击,因为现代浏览器即使显示也不会 运行 脚本。

请注意,它可能仍然容易受到 xml 注入的攻击,如果 Checkmarx 发现它是 xss,则可能存在某种可能的注入。确保用户无法在响应中创建 xml 标签或属性。这样做的方法与防止 xss 的方法非常相似。请注意,虽然您在将用户输入写入 xml 时不需要 html 对其进行编码,因为它不是 html,但您需要 xml 对值进行编码。

另请注意,验证输入很好,但通常情况下,注入攻击可通过上下文感知输出编码来防止,即。将适当的编码类型应用于值、xml 属性等。很多时候你无法在输入端完全实现这一点。 (输入验证仍然有意义,您也应该这样做,但最好通过输出编码来防止注入。)

是的,即使在仅服务于 XML 的服务中也可能发生 XSS 攻击。如果在浏览器加载的 XML 文档中包含以下内容,将执行脚本:

<script xmlns="http://www.w3.org/1999/xhtml">alert("XSS")</script>

即使该服务不打算在浏览器中使用,这也可能是一个安全漏洞。这是因为攻击者可以使受害者的浏览器加载 XML 文档,并在您的站点上注入 javascript(例如使用 iframe)和 运行 他的恶意脚本。这可能会产生各种后果:

  • 如果另一个服务运行在完全相同的域上,攻击者可以访问它。
  • 攻击者还可以为每个父域(TLD 和其他一些例外情况除外)设置 cookie,这可能会被用来尝试利用其他服务器。
  • 攻击者可以将其用于网络钓鱼,在地址栏中显示合法的 url。

也有可能 XML 注入可用于诱骗其他服务做一些意想不到的事情。有时,其他服务会在没有任何验证的情况下将用户输入传递到 API。写得不好的服务可能会在普通 HTML 网站上暴露 XSS。

无论如何,我建议您修复您发现的任何 XSS 漏洞,即使您认为它不可利用。