Apache Shiro 是一个功能强大的 Java 安全框架,提供认证、授权、加密和会话管理等功能。
Shiro-550漏洞原理
Apache Shiro内的RememberMe 功能 存在反序列化漏洞(CVE-2016-4437,也称为 Shiro-550),在特定条件下可能导致远程代码执行(RCE)。
在shiro框架中,当用户登陆成功后会获得一个加密的cookie,这个cookie的key是RememberMe,Value的值是依次经过了序列化、AES加密和Base64加密后生成的一串字符,因此当服务端接收到一个这样的cookie后,会:
对RememberMe中的Value值进行base64解密;
进行AES解码
进行反序列化
Shiro-550漏洞的关键就是在Shiro框架的某些早期版本(特别是1.2.4及之前版本)中,rememberMe Cookie的AES加密密钥默认值是硬编码的,其Base64编码形式为kPH+bIxk5D2deZiIxcaaaA==,这个默认的密钥是固定不变的,因此可以直接利用该密钥构造payload,过程为:
恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie
漏洞指纹
去检测cookie,发送一个含RememberMe=123
的cookie,观察响应包的header部分是否包set-cookie:RememberMe=deleteMe
这个字段(这是登录失败的流量特征)。
使用条件
Apache Shiro<1.2.4,因为该版本默认使用了硬编码密钥,极易被利用,后续版本则通过动态密钥的方式修复了这个默认密钥的问题。
漏洞复现
这里将采用Shiro-attack工具进行演示,下载地址:
https://github.com/SummerSec/ShiroAttack2
就像该图,它存在有明显的Shiro漏洞指纹特征
之后我们就可以使用我们的工具,这里出现+就是密钥爆破成功了
然后就可以进行命令执行了,这里是处于靶场环境,不存在未授权测试。
Shiro-721漏洞简单扩展
此是shiro的另一个反序列化漏洞,如果说Shiro-550是由于默认密钥硬编码导致的,那么Shiro-721漏洞主要由算法问题引起的,shiro-721本身采用的是动态密钥的方式。
由于密钥是随机生成的且仅在用户登录后生成有效的rememberMe Cookie,攻击者需要先通过合法账户登录获取Cookie。接着,利用Padding Oracle攻击技术,攻击者可以爆破密钥,构造恶意数据并替换Cookie内容。当服务器解密并反序列化篡改后的数据时,会触发漏洞,导致任意代码执行。关键点在于攻击需要登录并依赖密钥爆破,门槛较高且耗时较长。
关键点:
必须登录:即只有合法用户才能拿到 RememberMe Cookie,这导致攻击门槛较高
依赖爆破:必须爆破大量的密钥,这可能需要耗时很久。