CVE-2016-6802

https://xz.aliyun.com/t/11633#toc-13

https://su18.org/post/shiro-2/#cve-2016-6802

https://github.com/apache/shiro/commit/b15ab927709ca18ea4a02538be01919a19ab65af

0x00 概述

Shiro未对ContextPath做路径标准化导致权限绕过,原理与CVE-2010-3863相同,并且位置在同一处。

影响范围:

  • shiro < 1.3.2

0x01 漏洞分析

org.apache.shiro.web.util.WebUtils#getPathWithinApplication

之前我们关注的是 getRequestUri,这一次是getContextPath

image-20231107103009604

我们可以看到这里是没有对 ContextPath 进行标准化的,直接url 解码之后就返回了。

image-20231107103233990

这里用 vulhub 中 1.2.4 shiro 的环境代码做一个演示,需要做一些改动:

  • 给 springboot 设置 contextpath
    • 因为如果不设置的话,request.getContextPath不会获取到值
  • 配置一下shiro 权限设置

image-20231107114754649

image-20231107114805585

此时如果想要访问/admin需要请求/myapp1/admin,正常逻辑,应该是在getPathWithinApplication中将前置的 contextPath去除掉然后返回路径和配置中的模式进行匹配,但是当前因为没有对 contextPath进行标准化,就导致前置路径没有去除掉,直接和过滤器中模式进行匹配。

如图可以看到此时请求路由为/soft98/../myapp1/admin,这个是可以被正常解析的,但是 shiro 这里的处理,导致StringUtils.startsWithIgnoreCase(requestUri, contextPath)失败,所以直接返回了/myapp1/admin,这样就和/**的模式进行了匹配,所以直接就不需要认证就访问了。

image-20231107115252269

image-20231107115929948

image-20231107115958022

在 su18 师傅的文章里,他对request.getContextPath()进行了分析,实际在取值时,会根据/进行逐级递加,然后将标准化之后的路径和配置中存在的contextPath进行匹配,匹配成功会返回对应的值。

0x02 修复分析

修复的方法和CVE-2010-3863也一样,就是对路径进行规范化。

image-20231107123325519