跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

Apache Shiro 身份验证绕过漏洞复现(CVE-2020-13933)

精选回复

发布于

0x00 漏洞描述

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。
之前Apache Shiro身份验证绕过漏洞CVE-2020-11989的修复补丁存在缺陷,在1.5.3及其之前的版本,由于shiro在处理url时与spring仍然存在差异,依然存在身份校验绕过漏洞由于处理身份验证请求时出错,远程攻击者可以发送特制的HTTP请求,绕过身份验证过程并获得对应用程序的未授权访问。

0x01 漏洞影响

Apache Shiro < 1.6.0

0x02 环境搭建

1.下载项目到本地https://github.com/l3yx/springboot-shiro
2.将pom.xml中的1.5.2替换为1.5.3,将src/main/java/org/syclover/srpingbootshiroLoginController中的后台验证/admin/page替换为/admin/{name}
1049983-20201129040427401-1379782706.png
1049983-20201129040427930-1551743954.png
3.通过IDEA编辑器重新build并运行即可,已编译好的war包将其放到tomcat下的webapps目录下运行即可
https://github.com/backlion/demo/blob/master/srpingboot-shiro-0.0.1-SNAPSHOT.war

0x03 代码说明

1.ShiroConfig.java(pringboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\ShiroConfig.java)
权限配置, 当请求/admin/* 资源时, 302 跳转到登陆页面进行身份认证:

1049983-20201129040428505-909219609.png
2.LoginController.java(springboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\LoginController.java)
/admin/{name}: 请求名为 name 的的资源(触发身份认证):

1049983-20201129040428999-1101944912.png


0x04 漏洞复现

1.不在请求路由中指定资源名称时,不触发身份验证,也无资源返回:
1049983-20201129040429362-671140752.pnghttp://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin
1049983-20201129040429828-1775851797.png


2.在请求路由中指定资源名称时,302 跳转到身份验证页面:
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/login
1049983-20201129040430280-1096894926.png


1049983-20201129040430622-1206989193.png
3.构造特定 PoC 请求指定资源时,不触发身份验证,并绕过权限(通过%3b绕过)
http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/%3bpage
1049983-20201129040431055-942501932.png


1049983-20201129040431431-1821951905.png

0x05 漏洞分析

可以看到出问题的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication,shiro1.5.3进行了修改,直接在这里下断点,然后dubug调试
1049983-20201129040431878-1254629939.png
更新后利用getServletPath和getPathInfo进行获取URL,然而真正的漏洞点并不在此
1049983-20201129040432474-1895311208.png
可以看到拼合后URL是没问题的,再看经过removeSemicolon处理后
1049983-20201129040433327-937398851.png
可以看到只保留了/admin/*,可以在控制器里添加/admin/*路由进行测试,
@GetMapping("/admin*")
    public String admin2() {
        return "please login, admin";
    }

http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/*

1049983-20201129040433923-1159712392.png
1049983-20201129040434507-452562273.png

访问是不会有权限验证的,当然,在后面添加上参数的话就需要权限了

跟进removeSemicolon

1049983-20201129040435006-1073404813.png

同样,将;后的内容截断,包括;

再看下Spring如何处理

1049983-20201129040435555-539162384.png

Spring没有问题,获取到的是/admin/;page,然后将;page作为一整个字符串,匹配/admin/{name}路由,导致越权

再看下是怎么处理URL的

`org.springframework.web.util.UrlPathHelper#decodeAndCleanUriString

1049983-20201129040436147-1903544345.png

removeSemicolonContent          # 去除;及以后部分
decodeRequestString                 # 进行urldecode解码
getSanitizedPath                        # 将//替换为/

而shiro则相反
1049983-20201129040436695-881597646.png
首先进行了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.0

0x07 参考文献


https://github.com/lyy289065406/CVE-2020-13933

https://www.cnblogs.com/ph4nt0mer/p/13535999.html

https://xz.aliyun.com/t/8223









创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。