Shiro是什么:
Apache Shiro是一款强大的Java安全框架,用于身份验证、授权、加密和会话管理等功能。它在许多 Java 应用程序中被广泛使用,以提供安全的访问控制。
序列化背景:
在 Java 中,序列化是将对象转换为字节序列的过程,反序列化则是相反的操作,将字节序列恢复为对象。这一机制方便了对象的存储和传输,例如在分布式系统中或者保存用户会话信息时会经常用到。Shiro 在某些场景下(如记住我功能)也会使用序列化来持久化用户相关的信息。
漏洞引入(过程):
shiro默认使用了CookieRememberMeManager,其处理cookie(值)的流程是:得到rememberMe(参数)的cookie值–>Base64解码–>AES解密–>反序列化
然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
( CookieRememberMeManager
主要用于处理用户的 “记住我” 功能。当用户勾选 “记住我” 选项登录后,Shiro 会通过CookieRememberMeManager
来管理相关的 Cookie 信息,以实现后续的自动登录等功能。)
什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。
漏洞位置:
http 请求包 cookie 中的 rememberMe 参数。
该漏洞对shiro<=1.2.4的版本有影响。
找一个网站进行登录,必须勾选记住密码(漏洞点)
Shiro反序列化漏洞原理:
Shiro 是 Apache 下的一个开源 Java 安全框架,执行身份认证,授权,密码和会话管理。shiro 在用户登录时除了账号密码外还提供了可传递选项 remember me。用户在登录时如果勾选了 remember me 选项,那么在下一次登录时浏览器会携带cookie 中的 remember me 字段发起请求,就不需要重新输入用户名和密码。
判断:
1.数据返回包中包含 rememberMe=deleteMe 字段。
2.直接发送原数据包,返回的数据中不存在关键字可以通过在发送数据包的
cookie 中增加字段:****rememberMe=然后查看返回数据包中是否存在关键字。
shiro-550:
shiro 反序列化漏洞利用有两个关键点,首先是在 shiro<1.2.4 时,AES 加密的密钥 Key 被硬编码在代码里,只要能获取到这个 key 就可以构造恶意数据让 shiro 识别为正常数据。另外就是 shiro 在验证 rememberMe 时使用了 readObject 方法,readObject 用来执行反序列化后需要执行的代码片段,从而造成恶意命令可以被执行。攻击者构造恶意代码,并且序列化,AES 加密,base64 编码后,作为cookie 的 rememberMe 字段发送。Shiro 将 rememberMe 进行编码,解密并且反序列
化,最终造成反序列化漏洞。
Shiro-721:
不需要 key,利用 Padding Oracle Attack 构造出 RememberMe 字段后的值结合
合法的 Remember。
Login之前开代理 用bp拦截抓包在登录
shiro修复方法:
1.升级 Shiro 版本
2.过滤和验证输入数据
3.修改序列化方式(可选)
4.加强安全监测与应急响应
5.修改Key的编码并且不公开(修改Shiro源代码AbstractRememberMeManager中的Key值,然后替换到jar包里,不公开)
6.生成随机的Key编码(在Shiro配置文件中把SecurityManage加入rememberMeManager的配置,然后调用生成Key值的方法,随机生成。)