Context Path ByPass

CVE-2016-6802

影响版本:shiro < 1.3.2

Shiro使用非根servlet上下文路径中存在安全漏洞。远程攻击者通过构造的请求,利用此漏洞可绕过目标servlet过滤器并获取访问权限。

上一个请求路径未标准化类似

getPathWithinApplication先后获取到上下文路径和请求路径,若请求路径以上下文路径开头,截断后并返回;否则返回整个请求路径

跟进getContextPath

request.getContextPath()实际上是tomcat内部去解析的,逻辑在org.apache.catalina.connector#getContextPath

获取Application Context和请求的URL,对URL进行如下操作

  • 去除开头的斜杠,只保留一个

  • 获取第二个斜杠前面的内容作为candidate

  • 去除请求参数、URL解码、标准化(处理/./、/../、//等),判断candidateApplication Context是否相等,若不等则继续获取下一个斜杠之前的内容

假设Application Context/taco,若我们请求的路径为////hello/try/../../taco/admin/put

  • 保留首个斜杠 => /hello/try/../../taco/admin/put

  • /hello不匹配/taco,获取下一个斜杠前面的内容

  • /hello/try不匹配/taco

  • /hello/try/..标准化后/hello不匹配/taco

  • /hello/try/../..标准化后/不匹配/taco

  • /hello/try/../../taco标准化后/taco,成功匹配,返回/hello/try/../../taco

Shiro 1.0.0之后的版本对Request uri进行了标准化,而getContextPath()返回的是没有标准化的,可以利用此绕过

显然后面版本的修复就是对getContextPath()进行normalize标准化。

Shiro这波感觉有点自己造轮子了。

getContextPath()可以直接调用request.getServletContext().getContextPath()

Last updated