type
status
date
slug
summary
tags
category
icon
password
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Shiro提供了应用程序安全性API来执行以下方面:
1)身份验证:证明用户身份,通常称为用户‘登录’;
2)授权:访问控制;
3)密码术:保护或隐藏数据以防窥视;
4)会话管理:每个用户的时间敏感状态。
上述四个方面也被称为应用程序安全性的四个基石。
shiro反序列化漏洞-shiro-550
Apache Shiro < 1.2.4版本(需要获取AES秘钥)
原理
shiro框架提供了记住我(RememberMe)功能,关闭浏览器再次访问时无需再登录即可访问.
shiro默认使用了CookieRememberMeManager,用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
服务器端识别身份解密处理cookie的流程则是:
获取rememberMe cookie ->base64 解码->AES解密(加密密钥硬编码)->反序列化(未作过滤处理)。但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥(漏洞产生原因)。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。
漏洞产生的两个条件:
1,AES加密密钥硬编码
2,readObject反序列化方法未做过滤
判断
进入登录页面随便输入一个账号密码(注:点击RememberMe),然后通过burp发现请求包的 Set-Cookie 中出现 rememberMe=deleteMe,则基本可以证明它具有该反序列化漏洞
自动检测Shiro反序列化(burpsuite插件) ---- ShiroScanner
添加插件,自动发现
ShiroExploit
这里我们使用 Shiro_exploit,获取key
使用脚本出现该问题:ImportError: No module named Crypto.Cipher
注意如果安装模块出现问题,解决方式如下
第一种解决方式:
看到这一行:error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython发现少了个插件;然后就去下载;
第二种解决方式:
python安装目录下的\Lib\site-packages,将crypto文件夹的名字改成Crypto。
开始检测
代码审计
1.全局搜索:setCipherKey,因为 setCipherKey 方法是修改密钥的。查看是否存在,存在就说明有默认key
2.如果想要查看具体的密钥值,可在全局搜索:cipherKey
3.权限绕过漏洞在代码审计中,可在项目中找到shiro的配置文件,然后找到shiro的过滤器配置文件。
4.shiro过滤器中,anon表示匿名访问也就是无需认证即可访问,authc表示需要认证才可访问,所以我们可以看下有没有authc,是否可能存在未授权访问的问题。
5.观察登录时,响应包是否存在rememberMe标记,或修改登陆包。在Cookie中修改为rememberMe=deleteMe,同样观察回包是否存在rememberMe标记。如果存在,基本确定采用Shiro框架进行的认证或权限控制。
修复
1,升级最新版本
2,使用算法生成随机key
Shiro rememberMe反序列化漏洞(Shiro-721)
Apache Shiro <= 1.4.1(需要一个合法的登录账号,基于Padding Oracle attack-填充提示攻击 来实现的攻击)
原理
rememberMe cookie通过AES-128-CBC模式加密的rememberMe字段存在问题,易受到Padding Oracle(填充提示)攻击。用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。( rememberMe cookie 作为 Padding Oracle 攻击的前缀)
Tip:在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。
利用条件:
合法登录的账号,正常登录获取一个有效的rememberMe cookie ,并记录下这个rememberMe的值
攻击流程
使用任意账户登陆目标网站,以获取一个合法的 RememberMe Cookie
将获取的值作为POA的前缀
加密反序列化的payload来构造恶意RememberMe Cookie
将构造好的恶意数据填充到 RememberMe Cookie 字段中并发送
漏洞指纹
修复建议
1.更新版本Apache Shior到最新版本:
升级至安全版本
关闭rememberMe持久化登录功能。
临时防范建议:
在安全设备尝试拦截爆破流量,及时阻止攻击者进行尝试性攻击。
a. 升级Shiro到最新版
b.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
c.WAF拦截Cookie中长度过大的rememberMe值
d.WAF拦截访问过于频繁的IP, 因为该漏洞需要爆破Cookie
shiro550和721的区别
shiro550使用硬编码key解密AES构建恶意代码;
在1.2.4版本后,shiro已经更换 AES-CBC 为 AES-GCM ,无法再通过 Padding Oracle 遍历 key ,721使用合法账号的rememberMe cookie作为恶意代码的前缀进行攻击.
也就是说550需要破解解密rememberMe cookie,721不需要破解解密rememberMe cookie
550不需要登录核发账号,只需要在登录请求中构建即可.
721需要登录合法账号,rememberMe cookie需要能够通过认证才能构建.
工具:shiro550/721漏洞检测工具 Final by 飞鸿
参考链接:https://www.jianshu.com/p/ecad95ce9de0
https://cloud.tencent.com/developer/article/2070021
https://blog.csdn.net/web18296061989/article/details/124020931