Play 框架安全公告

JavaScript 路由器 XSS

日期

2016 年 6 月 22 日

描述

在 Play 的 JavaScript 反向路由器中发现了一个跨站点脚本 (XSS) 漏洞。这影响了 Play 从 2.0.0 到 2.4.7 的所有版本。默认情况下,主机设置为 Host 标头的值,该值在生成的 JavaScript 中没有转义。由于存在已知的漏洞允许攻击者伪造 Host 标头,因此这实际上会导致反射型 XSS。

影响

在某些环境中,攻击者可能能够伪造 Host 标头,例如通过缓存中毒攻击。在这种情况下,攻击者可以插入包含要在不知情的用户机器上执行的 JavaScript 的任意字符串。

受影响的版本

Play 2.0.0 - 2.4.7

解决方法

Routes.javaScriptRouterJavaScriptReverseRouter.apply 方法也有一个接受主机的备用版本。您可以使用此版本和显式、已清理的主机来确保攻击者无法执行攻击,例如

@Html(play.api.routing.JavaScriptReverseRouter(
  name = "Router",
  ajaxMethod = Some("jQuery.ajax"),
  host = "example.com", // should either be constant or sanitized value
  routes.javascript.Users.list,
  routes.javascript.Application.index
).body.replace("/", "\\/"))

修复

升级到 Play 2.4.8 或 2.5.x。

致谢

感谢 LinkedIn 的 Luca Carettoni 和 Detectify 的 Frans Rosén 发现此漏洞。