环境搭建
漏洞影响版本是 1.2.5 <= Apache Shiro <= 1.4.1
环境下载
所以我们下载对应漏洞版本的源码即可
shrio1.4.1复现的对应源码:
plain
https://archive.apache.org/dist/shiro/1.4.1/shiro-root-1.4.1-source-release.zip
下载shiro对应的war依赖包:
plain
https://github.com/jas502n/SHIRO-721/blob/master/samples-web-1.4.1.war
tomcat 8.5.76 下载地址:
plain
E:\JavaSecurity_Learn\java\code\Shiro721\apache-tomcat-8.5.76
过程
首先IDEA 点击Open 打开Shiro-root-1.4.1的源码的项目,如图路径

Ctrl+Shift+S如图进行配置JDK版本

Ctrl+Alt+S来到进行配置Tomcat服务器
不可以中文路径

最后来到这里进行配置运行

然后如图进行点击

首先来到这里配置war包

这里可以修改访问的路径

在来到服务器这里

然后点击Run就可以看见运行成功了

idea设置自动下载源码和文档

漏洞原理
密钥生成
Ctrl+Alt+B查看相关的实现类

这是Shiro550,可以看见 AbstractRememberMeManager 类 中的密钥不是动态生成的,而是硬编码

Shiro721对比Shiro550,密钥的生成位置变了

通过断点调试 ,可以看到这个方法的主要功能是:
plain
根据指定的算法名称,使用JDKKeyGenerator生成一个适合此CipherService的新密钥(基于algorithmName)
参数:keyBitSize一用于创建密钥的位数大小
返回:创建的、适用于此CipherService的密钥。

可以看见 KeyGenerator 对象调用了init方法

这里调用了下面的双参数init方法,并且获取了一个随机数发生器 SecureRandom

然后步入到这里,可以看见这里生成了一串16字节的随机序列,然后返回了一个SecretKeySpec对象

然后在调用getEncoded()方法来获取16字节的序列。这也是所谓的密钥序列
漏洞利用
工具-ShiroAttack2
ShiroAttack2:https://github.com/SummerSec/ShiroAttack2
利用exp工具直接打即可,我们已经知道这个是Shiro框架网站了

直接输入目标地址

可以看到命令执行成功

参考链接&致谢:
https://goodapple.top/archives/217
https://zhuanlan.zhihu.com/p/73731154
https://goodapple.top/archives/261
难点是如何构造密码爆破,以及工具编写