freeBuf
主站

分类

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

特色

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

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Web框架系列漏洞(1) Shiro 授权绕过漏洞 (CVE-2022-32532)
z5bra 2022-11-18 19:02:04 254970
所属地 北京

漏洞介绍

Spring SecurityCVE-2022-22978思路相同,通过java的正则缺陷绕过授权模块。
此漏洞利用条件较为苛刻,且只能针对shiro的身份验证,无法绕过后端程序中的其他验证。

影响版本

Apache shiro < 1.9.1

基本原理

Java中的正则默认情况下.并不包含\r\n字符,因此某些情况下正则规则可以被绕过

String regex = "a.*b";
Pattern pattern = Pattern.compile(regex);
boolean flag1 = pattern.matcher("aaabbb").matches();
// true
System.out.println(flag1);
boolean flag2 = pattern.matcher("aa\nbb").matches();
// false
System.out.println(flag2);

漏洞复现

vulfocus镜像:vulfocus/shiro-CVE-2022-32532
github地址:Lay0us1/CVE-2022-32532

利用场景:

  • 配置了/permit/{value}这样从路径取参数的路由

  • 配置了/permit/*这样的通配路由

思路:/permit/any的目录访问需要token,根据漏洞原理在其中加入\n\r的url编码字段%0a%0d即可绕过shiro的鉴权

POC:/permit/any%0d

image.png
image.png

漏洞分析

shiroRegExPatternMatcher存在正则绕过安全风险

public class RegExPatternMatcher implements PatternMatcher {
    // ...
    public boolean matches(String pattern, String source) {
        if (pattern == null) {
            throw new IllegalArgumentException("pattern argument cannot be null.");
        }
        // no DOTALL flag
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(source);
        return m.matches();
    }
}

RegExPatternMatchershiro向开发者提供的一个Matcher实现,在整个shiro项目中都没有出现,需要用户自行配置
image.png

具体继承实现看参考链接

自行配置Filter使用RegExPatternMatcher的例子

@Override
protected AbstractShiroFilter createInstance() {
    SecurityManager securityManager = this.getSecurityManager();
    FilterChainManager manager = new DefaultFilterChainManager();
    manager.addFilter("myFilter",new MyFilter());
    // my filter
    manager.addToChain("/permit/.*", "myFilter");
    // todo: add other filters

    PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
    chainResolver.setFilterChainManager(manager);
    // set RegExPatternMatcher
    chainResolver.setPathMatcher(new RegExPatternMatcher());
    return new SpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
}
public MyPermissionsAuthorizationFilter(boolean regexExp) {
    super();
    this.regexExpMatcher = regexExp;
    if (regexExp) {
        pathMatcher = new RegExPatternMatcher();
    }
}
protected boolean pathsMatch(String pattern, ServletRequest request) {
    String requestURI = getPathWithinApplication(request);
    if (request instanceof HttpServletRequest) {
        String queryString = ((HttpServletRequest) request).getQueryString();
        if (regexExpMatcher && !(queryString == null || queryString.length() == 0))
            requestURI += ("?" + queryString);
    }
    String regex = pattern;
    if (regexExpMatcher)
        regex = MyPathMatchingFilterChainResolver.replacePattern(pattern);
    return pathsMatch(regex, requestURI);
}

漏洞总结

利用条件

shiro版本处于1.9.1以下
目标配置了RegExPatternMatcher情况下且正则规则中包含了“.”则存在漏洞

DREAD评估

3(D),3(R),2(E),1(A),0(D)
评估为中危漏洞

修复方案

  1. 升级到shiro 1.9.1版本及以上

  2. 使用DOTALL属性

String regex = "a.*b";
// add DOTALL flag
Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
boolean flag1 = pattern.matcher("aaabbb").matches();
// true
System.out.println(flag1);
boolean flag2 = pattern.matcher("aa\nbb").matches();
// true
System.out.println(flag2);

参考链接

浅谈Shiro CVE-2022-32532--先知/4ra1n
Lay0us1/CVE-2022-32532
NVD-CVE-2022-32532 Detail

# 漏洞 # 渗透测试 # web安全 # 内网渗透 # 漏洞分析
本文为 z5bra 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
漏洞知识库
z5bra LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 2 关注者
Web APP 系列漏洞(1)戴尔OMSA文件读取漏洞(CVE-2020-5377)
2022-10-28
零基础教你搭建一个自己的靶场!
2021-06-22
文章目录