shiro是什么?
Apache shiro是常见的java写的安全框架,用来处理身份验证、授权、加密、缓存和会话管理等问题
shiro的Cookie RememberMeManager是什么?
它是表单中“记住我”的一种功能,在用户登入时自动获取之前存储的Cookie信息,可以快速恢复用户的身份认证状态
Cookie RememberMeManager的工作原理
当勾选“记住我”功能发送请求时,shiro框架首先调用的是Realm对象来验证用户的身份,并生成唯一的标识符token,如果验证通过,shiro就会生成Cookie RememberMeManager token对象,并且保存到对象中,然后被反序列化为一个加密Cookie,通过响应头发送给客户端,这个Cookie包含了token信息、过期时间及其他数据,当用户关闭浏览器并重新打开时,shiro会自动解码和反序列化Cookie,获取其中的token信息并进行身份认证,并将Subject对象标记为已授权状态,由于上次认证的信息以及被记录下来,所以可以避免用户重新输入账户密码的操作
Apache Shiro处理cookie的流程
由于ASE是硬解码,没法改变,可以构造恶意数据将其编码为base64然后注入到rememberMe cookie中,当用户再次访问时,恶意数据发送到服务器上,然后进行反序列化,在反序列化的过程中就会导致执行构造的恶意数据,达到RCE
漏洞原理
shiro在session反序列化中,没有对反序列化的数据进行安全检查和过滤,就导致反序列化中构造的恶意代码会被执行
漏洞复现(vulfocus的靶场)
探索yi'xi下log in
一个表单功能,抓包登入
发送
可以看到响应头有rememberMe的字眼
这个是由于shiro的key错误才会显示,如果shiro的key正确则不会显示
这里是存在shiro反序列化漏洞
这里使用检测工具检测一下
检测成功,开始爆破利用连
发现利用链,开始执行命令
成功执行了
是root权限
流量特征
1、数据包的大小异常:在反序列化过程中数据包会有大量恶意代码,所以数据包大小比正常大小多很多
2、反序列化错误:构造的恶意反序列化数据和应用程序中更多的是无效请求,从而反序列化失败,导致大量错误出现
3、请求中的(java序列化对象和base64编码)和rememberMe、_shiro_session等字眼
4、恶意类名和方法:会使用自定义的恶意类名和方法名,这些类名和方法名和正常的正常的服务操作不同,可以通过检查日志或者审计来识别
5、异常的java运行:如果存在RCE攻击,则会出现java的运行行为,可以在系统日志中检测
防御
1、避免使用Apache Shiro的默认RememberMeManager实现,应该使用自定义的RememberMeManager实现,包括不同的加密算法或密钥来避免硬编码密钥漏洞
2、对所有的数据进行严格的验证和过滤,服务器要对cookie检查是不是有效的用户会话生成的,服务器还要确保cookie中不包含其他数据
3、对用户输入的内容做验证和过滤,可能会被尝试其他方式注入恶意数据
4、将服务器配置禁用默认的RememberMeManager实现,要使用自定的RememberMeManager来保证更强大的安全性
5、升级shiro版本
6、有效检查反序列化的数据
问有惑不解,关注公众号联系作者
工具
也
可以
联系我