Apache Shiro 反序列化漏洞 [org.apache.shiro.web.mgt.CookieRememberMeManager]

Apache Shiro 反序列化漏洞

2021-02-06 02:34:09,886 [http-bio-8000-exec-18] WARN  [org.apache.shiro.mgt.DefaultSecurityManager] - Delegate RememberMeManager instance of type [org.apache.shiro.web.mgt.CookieRememberMeManager] threw an exception during getRememberedPrincipals().
org.apache.shiro.io.SerializationException: Unable to deserialze argument byte array.
    at org.apache.shiro.io.DefaultSerializer.deserialize(DefaultSerializer.java:82)
    at org.apache.shiro.mgt.AbstractRememberMeManager.deserialize(AbstractRememberMeManager.java:514)

 

1)、Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
在服务端接收cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cookie 的值
2、Base 64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)

在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

意思就是说shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值>>>Base64解码>>>AES解密>>>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

2)、Apache Shiro 使用公开 AES 秘钥加密传输 使用默认 AES 秘钥的服务器容易遭受反序列化攻击,攻击者能在服务端执行任意代码。 Apache Shiro 在 1.2.4 之前版本中使用 AES 硬编码秘 钥,存在严重的反序列化漏洞,攻击者可以在远程主机上执行任意指令 ,建议 检查 Shiro 版本信息,若 <=1.2.4请升级至 1.2.5 及以上版本 。

3)、也可以自定义key替换默认的来避免,生成key代码如下

 
  1. //密钥生成java代码(直接拷贝到main允许即可)

  2. KeyGenerator keygen = KeyGenerator.getInstance("AES");

  3. SecretKey deskey = keygen.generateKey();

  4. System.out.println(Base64.encodeToString(deskey.getEncoded()));

猜你喜欢

转载自blog.csdn.net/zhaofuqiangmycomm/article/details/113710254