发布于2022年11月5日3年前 0x00 漏洞描述Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。之前Apache Shiro身份验证绕过漏洞CVE-2020-11989的修复补丁存在缺陷,在1.5.3及其之前的版本,由于shiro在处理url时与spring仍然存在差异,依然存在身份校验绕过漏洞由于处理身份验证请求时出错,远程攻击者可以发送特制的HTTP请求,绕过身份验证过程并获得对应用程序的未授权访问。0x01 漏洞影响Apache Shiro < 1.6.00x02 环境搭建1.下载项目到本地https://github.com/l3yx/springboot-shiro2.将pom.xml中的1.5.2替换为1.5.3,将src/main/java/org/syclover/srpingbootshiroLoginController中的后台验证/admin/page替换为/admin/{name}3.通过IDEA编辑器重新build并运行即可,已编译好的war包将其放到tomcat下的webapps目录下运行即可https://github.com/backlion/demo/blob/master/srpingboot-shiro-0.0.1-SNAPSHOT.war0x03 代码说明1.ShiroConfig.java(pringboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\ShiroConfig.java)权限配置, 当请求/admin/* 资源时, 302 跳转到登陆页面进行身份认证:2.LoginController.java(springboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\LoginController.java)/admin/{name}: 请求名为 name 的的资源(触发身份认证):0x04 漏洞复现1.不在请求路由中指定资源名称时,不触发身份验证,也无资源返回:http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin2.在请求路由中指定资源名称时,302 跳转到身份验证页面:http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/login3.构造特定 PoC 请求指定资源时,不触发身份验证,并绕过权限(通过%3b绕过)http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/%3bpage0x05 漏洞分析可以看到出问题的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication,shiro1.5.3进行了修改,直接在这里下断点,然后dubug调试更新后利用getServletPath和getPathInfo进行获取URL,然而真正的漏洞点并不在此可以看到拼合后URL是没问题的,再看经过removeSemicolon处理后可以看到只保留了/admin/*,可以在控制器里添加/admin/*路由进行测试,@GetMapping("/admin*") public String admin2() { return "please login, admin"; }http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/*访问是不会有权限验证的,当然,在后面添加上参数的话就需要权限了跟进removeSemicolon同样,将;后的内容截断,包括;再看下Spring如何处理Spring没有问题,获取到的是/admin/;page,然后将;page作为一整个字符串,匹配/admin/{name}路由,导致越权再看下是怎么处理URL的`org.springframework.web.util.UrlPathHelper#decodeAndCleanUriStringremoveSemicolonContent # 去除;及以后部分 decodeRequestString # 进行urldecode解码 getSanitizedPath # 将//替换为/而shiro则相反首先进行了urldecode,接着才去去除,从而导致了漏洞漏洞 DEBUG 位置:shiro-web-1.5.3.jar// org.apache.shiro.web.util.WebUtils.java // line 111 public static String getPathWithinApplication(HttpServletRequest request) { return normalize(removeSemicolon(getServletPath(request) + getPathInfo(request))); }pring-web-5.2.5.RELEASE.jar// org.springframework.web.util.UrlPathHelper.java // line 459 private String decodeAndCleanUriString(HttpServletRequest request, String uri) { uri = removeSemicolonContent(uri); uri = decodeRequestString(request, uri); uri = getSanitizedPath(uri); return uri; }0x06 漏洞修复目前官方已发布漏洞修复版本,更新 Apache Shiro >= 1.6.00x07 参考文献https://github.com/lyy289065406/CVE-2020-13933https://www.cnblogs.com/ph4nt0mer/p/13535999.htmlhttps://xz.aliyun.com/t/8223
创建帐户或登录后发表意见