Shiro 历史漏洞复现
前言
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro 框架直观、易用,同时也能提供健壮的安全性。
环境搭建采用 vulhub 项目的 Shiro 系列:https://github.com/vulhub/vulhub
指纹信息
登录返回的响应包中 set-Cookie 包含 rememberME=deleteMe 字段可判断该网站使用 Apache Shiro 框架。
当然该值只是默认值,研发是可以修改的。
CVE-2020-1957(认证绕过)
漏洞描述
在 Apache Shiro 1.5.2 以前的版本中,在使用 Spring 动态控制器时,攻击者通过构造..;
这样的跳转,可以绕过 Shiro 中对目录的权限限制。利用 Shiro 和 Spring 对 URL 的处理的差异化,越权并成功访问。
漏洞原理
- 客户端请求URL:
/xxxx/..;/admin/
- Shrio 内部处理得到校验URL为
/xxxx/..
校验通过 - Springboot 处理
/xxxx/..;/admin/index
, 最终请求/admin/index
, 成功访问了后台请求.
影响版本
- Apache Shiro < 1.5.2
环境搭建
1 | cd vulhub/shiro/CVE-2020-1957 # 进入到目录 |
由于我这里将端口修改为 9001,故而需要访问 9001。
这个应用中对URL权限的配置如下:
1 |
|
漏洞复现
直接请求需要校验的接口 /admin/
是会被重定向登录页面的。
构造恶意的请求:/xxx/..;/admin/
1 | GET /xxx/..;/admin/ HTTP/1.1 |
利用特征
请求路径中包含 ..;/
这种字符;如 /xxx/..;/env
漏洞修复
- 将 Shiro 升级至安全版本
- 使用 waf 拦截路径
..;
参考
- https://github.com/vulhub/vulhub/blob/master/shiro/CVE-2020-1957/README.zh-cn.md
- https://xz.aliyun.com/news/7876
- https://blog.spoock.com/2020/05/09/cve-2020-1957/
- https://www.anquanke.com/post/id/226899
- http://rui0.cn/archives/1643
- Shiro 官方修复 commit
CVE-2019-12422(721 反序列化)
漏洞描述
RememberMe 默认通过 AES-128-CBC 模式对 Cookie 进行加密,易受 Padding Oracle Attack(填充机预言攻击) 攻击。
影响版本
1 | 1.2.5, |
漏洞原理
由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
Padding Oracle : 是一种通过对 DES、AES 等 block 加解密算法的 Padding 进行调控,根据解密过程是否正常,结合调控内容进行攻击,在无需知道 key 的前提下达成解密密文或加密明文的效果。
Padding : DES、AES 等 block cipher 加解密算法要求输入内容的长度为 block size 的整数倍。在加密过程中,若原始数据长度不符合该要求,则在其后添加 padding 部分以进行补足,在解密过程中,则在解密结果的末尾对 padding 部分进行移除。
环境搭建
环境下载链接:https://github.com/inspiringz/Shiro-721
1 | # 下载项目 |
漏洞复现
使用上面提示的用户名和密码进行登录,勾选 Remember Me。
登录成功之后响应包返回带有加密的 Remember 并跳转到
请求首页的数据包:
工具下载:https://github.com/frohoff/ysoserial/ ysoserial 用于生成利用不安全的 Java 对象反序列化的有效载荷的概念验证工具。
查看工具的帮助:
1 | java -jar ysoserial-all.jar # 查看帮助 |
生成恶意的序列化文件:
1 | java -jar ysoserial-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser # 生成恶意的序列化文件 |
运行脚本:
1 | # 命令格式 需要使用Python2版本 |
脚本大概跑了一个小时左右(线上环境可能需要更久),出现了构建好的 Cookie 值
漏洞修复
- 将 Shiro 升级至安全版本
参考
CVE-2016-4437(550 反序列化)
漏洞描述
Apache Shiro 1.2.4 及以前版本中,加密的用户信息序列化后存储在名为 remember-me 的 Cookie 中。攻击者可以使用 Shiro 的默认密钥伪造用户 Cookie,触发 Java 反序列化漏洞,进而在目标机器上执行任意命令。
影响版本
- Apache Shiro <= 1.2.4
漏洞原理
Shiro 1.2.4 及之前版本使用的是硬编码,AES 加密的密钥默认在代码里面。其默认密钥的 base64 编码后的值为 KPH+blxk5D2deZilxcaaaA==,这里可以通过构造恶意的序列化对象进行编码,加密,然后作为 Cookie 加密发送,服务器收到解密后并触发反序列化漏洞。
环境搭建
1 | cd vulhub/shiro/CVE-2016-4437 |
访问 9001 端口:
漏洞复现
利用工具:https://github.com/SummerSec/ShiroAttack2
尝试执行 whoami 命令:
利用特征
检测框架
将自动化工具的流量代理到 Burpsuite 即可。
枚举 KEY
当密钥爆破成功时,响应包时没有 rememberMe=deleteMe
的。
爆破利用链
当爆破利用链的时候 rememberMe 字段会有大量的 AES 加密数据:
当利用链爆破成功时,响应包时没有 rememberMe=deleteMe
的,且响应体没有内容。
命令执行
尝试执行 whoami 命令
响应体以 $$$
开头+中间为 base64 的命令执行结果 $$$
结尾。
请求体可以使用蓝队分析工具箱进行解密 (需要知道 AES 加密的 KEY)。
也可以指定 key 进行解密,但没有研判结果:
漏洞修复
- 将 Shiro 升级至安全版本或替换硬编码的密钥。
参考
- https://github.com/vulhub/vulhub/blob/master/shiro/CVE-2016-4437/README.zh-cn.md
- https://mewhz.com/posts/vul-shiro
CVE-2010-3863
年代比较久远,只做了解即可。
漏洞描述
在 Apache Shiro 1.1.0 以前的版本中,shiro 进行权限验证前未对url 做标准化处理,攻击者可以构造 /
、//
、/./
、/../
等绕过权限验证
漏洞版本
- Apache Shiro < 1.1.0
漏洞原理
Shiro 进行权限验证前未进行路径标准化,导致使用时可能绕过权限校验。
环境搭建
1 | cd vulhub/shiro/CVE-2010-3863 |
我这里修改了宿主机映射的端口为 9002:
漏洞复现
直接访问 /admin/
接口则会重定向到登录页面。
构造恶意的请求 /./admin
漏洞修复
- 对
/
、//
、/./
、/../
等进行了处理。 - 将 Shiro 升级至安全版本