freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Shiro CVE-2022-32532 正则路径匹配绕过
Magic7 2025-02-03 17:04:26 74629
所属地 广东省

漏洞描述

Apache Shiro before 1.9.1, A RegexRequestMatcher can be misconfigured to be bypassed on some servlet containers. Applications using RegExPatternMatcher with .in the regular expression are possibly vulnerable to an authorization bypass.

[1]

漏洞条件

  • shiro < 1.9.1

  • 配置了RegExPatternMatcher

  • 配置路径(pattern)中有"."号

漏洞复现

环境配置

shiro : 1.8.0
springboot: 2.7.4

shiro

//先执行
@Bean
    ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean bean = new MyShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager);
        bean.setLoginUrl("/login");
        bean.setSuccessUrl("/loginSuccess");
        bean.setUnauthorizedUrl("/unauthorized");


        //[urls]
        //url --> filter1,filter2....
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        map.put("/admin/.*", "authc");
        map.put("/login","authc");
        bean.setFilterChainDefinitionMap(map);

        return bean;
    }


    private class MyShiroFilterFactoryBean extends ShiroFilterFactoryBean{

        //后执行
        @Override
        public AbstractShiroFilter createInstance() throws Exception{

            SecurityManager securityManager = getSecurityManager();

			//确保上面的路径配置能够生效
            FilterChainManager manager = createFilterChainManager();


            //反射访问pathMatcher
            PathMatchingFilter filter = (FormAuthenticationFilter) manager.getFilters().get("authc");
            Field pathMatcher = PathMatchingFilter.class.getDeclaredField("pathMatcher");
            pathMatcher.setAccessible(true);
            pathMatcher.set(filter,new RegExPatternMatcher());

            // 默认路径"/**"不符合正则表达规范,会报错,所以要去除。可以替换为 "/.*"
            ((DefaultFilterChainManager) manager).getFilterChains().remove("/**");


            PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
            chainResolver.setFilterChainManager(manager);
            //匹配规则更改为RegEx风格
            chainResolver.setPathMatcher(new RegExPatternMatcher());


            return new SpringShiroFilter((WebSecurityManager) securityManager, chainResolver);

        }

    }

    class SpringShiroFilter extends AbstractShiroFilter {
        public SpringShiroFilter(WebSecurityManager securityManager, FilterChainResolver filterChainResolver) {
            setSecurityManager(securityManager);
            setFilterChainResolver(filterChainResolver);
        }


    }

上图中标红处,"getChain()"是匹配过滤链的,而匹配到对应链后,由于每个filter是单例的,内部还要再匹配一次其管理的appliedPaths,因此不仅chainResolver需要配置,filter也要配置。

由于"authc"对应的Filter是PathMatchingFilter的子类,其patternMatcher固定为AntPathMatcher,且无法直接访问故需要反射设置。

image


controller

@GetMapping("/admin/{param}")
    public String adminInfo(@PathVariable String param) {
        if (!param.isEmpty()){
            return "admin info: " + param;
        }

        return "admin info: no param";
    }

测试

  • 正常访问:"/admin/7878"
    image
    无法访问,重定向到登入页面

  • 恶意访问:"/admin/78%0a78" ,其中"%0a"是换行符
    image
    用回车符%0d效果相同:
    image
    image

补充

当controller路径配置为”/admin/info"这种固定的路径时,尽管绕过了shiro,以上两个payload都无法生效(spring无法匹配)

漏洞分析

image

public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
        FilterChainManager filterChainManager = getFilterChainManager();
        if (!filterChainManager.hasChains()) {
            return null;
        }

        final String requestURI = getPathWithinApplication(request);
        final String requestURINoTrailingSlash = removeTrailingSlash(requestURI);

        //the 'chain names' in this implementation are actually path patterns defined by the user.  We just use them
        //as the chain name for the FilterChainManager's requirements
        for (String pathPattern : filterChainManager.getChainNames()) {
            // If the path does match, then pass on to the subclass implementation for specific checks:
            if (pathMatches(pathPattern, requestURI)) {
                if (log.isTraceEnabled()) {
                    log.trace(...);
                }
                return filterChainManager.proxy(originalChain, pathPattern);
            } else {

                // in spring web, the requestURI "/resource/menus" ---- "resource/menus/" bose can access the resource
                // but the pathPattern match "/resource/menus" can not match "resource/menus/"
                // user can use requestURI + "/" to simply bypassed chain filter, to bypassed shiro protect

                pathPattern = removeTrailingSlash(pathPattern);

                if (pathMatches(pathPattern, requestURINoTrailingSlash)) {
                    if (log.isTraceEnabled()) {
                        log.trace(...);
                    }
                    return filterChainManager.proxy(originalChain, pathPattern);
                }
            }
        }

        return null;
    }

正则模式匹配器:

package org.apache.shiro.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExPatternMatcher implements PatternMatcher {
    public RegExPatternMatcher() {
    }

    public boolean matches(String pattern, String source) {
        if (pattern == null) {
            throw new IllegalArgumentException("pattern argument cannot be null.");
        } else {
            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(source);
            return m.matches();
        }
    }
}

image.png
根据测试点号"."是不匹配 \n\r的,因此无法匹配pattern,造成绕过

要想让其能够匹配则必须要多一个参数:Pattern.DOTALL

Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);

漏洞修复

将参数带上即可:[2]

imageimage

Reference


[1] Security Reports | Apache Shiro

# 漏洞分析 # Shiro # Java代码审计
本文为 Magic7 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
漏洞分析:shiro
Magic7 LV.5
这家伙太懒了,还未填写个人描述!
  • 22 文章数
  • 8 关注者
Tomcat CVE-2024-50379 条件竞争导致命令执行
2025-02-27
shiro-core 框架分析
2025-02-16
Shiro CVE-2023-46749 路径穿越导致验证绕过
2025-02-06
文章目录