WS 无效 URI 解析
日期
2017 年 8 月 28 日
描述
在 AsyncHttpClient 的 URI 解析中发现了一个低严重性漏洞,该库被 Play WS 客户端和 play-ws-standalone 库使用。
如果 URI 后面跟着 `#`,该库会导致 WS API 错误地解析 URI 的 authority 部分。例如,传递 `http://example.com#@evil.com/foo.txt` 实际上会向 `evil.com` 发出请求。
AsyncHttpClient 问题也在 AsyncHttpClient 问题 1455 中描述。
影响
如果用户被允许传递任意 URI 字符串,此漏洞可用于绕过主机名的白名单或黑名单。符合 RFC 的解析器会正确解析 `http://example.com#@evil.com/foo.txt`。请注意,此问题不会影响像 `http://example.com/#@evil.com/foo.txt` 这样的 URI,因为路径开头有斜杠。
受影响的版本
- Play 2.6.0-2.6.3
- play-ws-standalone 1.0.0-1.0.6
- Play 2.5.0-2.5.16
- 所有之前的 2.x 版本
解决方法
使用符合标准的解析器(如 `java.net.URI`)解析 URI。如果路径为空,请将空路径替换为单个斜杠。
修复
升级到 play-ws-standalone 1.0.7,或者,如果使用 Play 2.5.x,升级到 async-http-client 2.0.35。Play 2.4.x 及更早版本中使用的 AsyncHttpClient 中尚未修复此问题。
Play 2.6.4 及更高版本以及 Play 2.5.17 及更高版本将自动提供正确的版本。
致谢
感谢 Agarri 的 Nicolas Grégoire 发现 AsyncHttpClient 中的此漏洞。