Shiro 权限绕过漏洞复现(CVE-2020-11989)
影响范围
Apache Shiro 1.5.3弹簧框架中仅使用Shiro身份验证
环境搭建
1git克隆https://github.com/l3yx/springboot-shiro.git
将项目导入想法,本地演示环境是Mac OS,并配置Maven:
/USR/local/cellar/maven/3.6.3_1/libexec/conf/settings.xml
添加当地镜子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
镜子
idalimaven/id
镜面/镜像
namealiyun maven/name
urlhttp://maven.aliyun.com/nexus/content/repositories/central//url
/镜子
!
! - 中央仓库1-
镜子
IDREPO1/ID
镜面/镜像
namehuman此镜子可读名称。/name
urlhttp://repo1.maven.org/maven2//url
/镜子
! - 中央仓库2-
镜子
IDREPO2/ID
镜面/镜像
namehuman此镜子可读名称。/name
urlhttp://repo2.maven.org/maven2//url
/镜子

在IDEA中更改Maven主目录和用户设置文件配置:

生成战争包:

在Tomcat中部署包装的战争包。漏洞有两个成功开发的条件。
该应用程序不能部署在根目录中,即需要上下文路径,server.servlet.context-path=/shiro。如果是根目录,则上下文路径为空,并且URL将由CVE-2020-1957的贴片格式化。值得注意的是,如果Shiro版本小于1.5.2,则不需要此条件。
弹簧控制器中没有其他权限验证代码
脆弱环境的权限配置如下,其中/管理员的路由需要登录至访问:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@豆
ShirofilterFactoryBean ShirofilterFactoryBean(){
ShirofilterFactoryBean bean=新的ShirofilterFactoryBean();
bean.setsecuritymanager(securityManager());
Bean.SetLoginurl('/login');
bean.setsuccessurl('/index');
bean.setunauthorizedUrl('/ununtoRatorizedUrl');
mapstring,String Map=new LinkedHashMap();
map.put('/dologin','anon');
map.put('/admin/*','authc');
Bean.SetFilterChainDefinitionMap(MAP);
返回豆子;
}
---
@getMapping('/admin/page')
公共字符串admin(){
返回“管理页面”;
}
漏洞复现
如果您直接访问/shiro/admin/page,则将返回302并跳跃以需要登录。
直接访问/;/test/admin/page,您可以直接绕过shiro的权限验证和访问/管理员路由中的信息
