Shiro反序列问题修复

#引言

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

问题描述

公司的安全部门利用shiro破解工具:shiro-attack,可以暴力破解出系统shiro的AES秘钥
Shiro反序列问题修复_第1张图片

问题分析

本系统采用Shiro验权框架,而在使用Shiro时,如果使用方式不当会造成反序列化的漏洞

Shiro反序列化漏洞

加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认秘钥伪造用户Cookie,进而在目标机器上执行任意命令

漏洞原理

Apache Shiro默认使用了CookieRemenerMeManager,其处理Cookie的流程:

  1. 得到rememberMe的Cookie值
  2. Base64解码
  3. AES解密
  4. 反序列化

然后AES的秘钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列的RCE漏洞。

AES加密秘钥在Shiro 1.2.4之前使用的硬编码:kPH+bIxk5D2deZiIxcaaaA==
如果采用此版本,建议先升级Shiro版本

寻找秘钥方式

我们如何获知选择的密钥是否与目标匹配呢?有一种思路是:当密钥不正确或类型转换异常时,目标Response包含Set-Cookie:rememberMe=deleteMe字段,而当密钥正确且没有类型转换异常时,返回包不存在Set-Cookie:rememberMe=deleteMe字段。
那么具体的检测方法一般包括如下几种:

  • 第一种是利用URLDNS进行检测https://github.com/LuckyC4t/shiro-urldns/blob/master/src/main/java/luckycat/shirourldns/URLDNS.java
  • 第二种利用命令执行进行检测 通过执行ping命令来检测。
  • 第三种使用SimplePrincipalCollection序列化后进行检测(XCheck,即Xray Check)通过使用SimplePrincipalCollection序列化来进行检测,key正确情况下不返回 deleteMe ,key错误情况下返回 deleteMe
  • 最后一种就是直接利用工具Shiro-attack

漏洞关键元素

如果采用更新的版本,比如说本次项目中所有的1.5.4版本,则是使用了其他默认秘钥的问题。
在本次漏洞中,被暴力破解的秘钥是:4AvVhmFLUs0KTA3Kprsdag==
定位到代码行:
Shiro反序列问题修复_第2张图片
而此秘钥是Shiro比较常用的秘钥,可以参考文档:
https://blog.csdn.net/weixin_46137328/article/details/114986341

此方法往上继续查找
Shiro反序列问题修复_第3张图片
项目采用的是Spirng-Shiro框架,而securityManager方法就是将securityManager这个Bean注入到Spring容器中

问题修复

修改问题的思路其实也很简单,只要将此默认秘钥修改掉即可
此外,还升级了shiro到最新版本1.11.0,避免了其他一些低版本的安全问题

问题验证

下载shiro-attack

下载shiro-attack,安装jdk8运行环境
打开命令行,执行

java -jar shiro_attack-2.2.jar

运行后页面如下:
Shiro反序列问题修复_第4张图片

执行爆炸秘钥

将所要测试地址填入目标地址中,勾选AES GCM,点击“爆破秘钥”
Shiro反序列问题修复_第5张图片
无法再暴力破解出秘钥了,至此问题修复完成

你可能感兴趣的:(java,安全,网络)