描述
Apache Shiro 在1.2.5之前,当密钥没有配置为“ remember me”特性时,允许远程攻击者通过一个未指定的请求参数执行任意代码或绕过预期的访问限制。
影响版本
Apache Shiro ≤ 1.2.4
复现过程
1.启动环境:
![](api/attachments/uWvNiJSEK2sY/image/image.png)
2. 访问 /,使用username=admin&password=vulhub登录,并确认Remeber me,然后放行
![](api/attachments/KbvSm8KajtyS/image/image.png)
3.再次访问/,并把请求发至repeater
![](api/attachments/f55JpMHxW3nY/image/image.png)
4.接着使用ysoserial构造CommonsBeanutils1利用链
![](api/attachments/WXgHa2BZOrC0/image/image.png)
5.使用shiro内置的AES进行加密
![](api/attachments/0POVN0igWpSy/image/image.png)
6.然后将输出的那些密文覆盖掉上面添加到repeater中的报文里面的rememberMe,并将JESSIONID删掉,如果留着这个cookie,shiro就会认为用户已经登录,就不会对remeberMe进行反序列化,就无法触发漏洞。
![](api/attachments/HmUl7TojzrM5/image/image.png)
7.漏洞复现成功
![](api/attachments/jyHql4z7Kts8/image/image.png)
原理分析
1.通过一步一步调试,发现shiro1.2.4的默认加密密码是固定值
![](api/attachments/hm7Ds8W6wAkV/image/image.png)
再加上shiro1.2.4使用的相关库的漏洞有CommonsBeanutils1利用漏洞,通过shiro的Remember me反序列化可以成功实现RCE
官方修复方法
使用generateNewKey()在每次启动服务时自动生成随机的密钥,注意1.4.1及之前的版本中的AesCipherService类中的构造方法存在CVE-2019-12422漏洞(Shiro-721)。
![](api/attachments/oku6gpkFQ8rS/image/image.png)
客户修复方案
更新Apache Shiro ≥ 1.2.5。