shiro-550反序列化分析

搭个环境 root/secret

原理

shiro反序列化产生原因是因为 shiro 接受了 Cookie 里面 rememberMe 的值,然后去进行 Base64 解密后,再使用 aes 密钥解密后的数据,进行反序列化。

加密过程

在AbstractShiroFilter#doFilterInternal的executeChain下断点。在第359行this.createSubject(request, response)这里,会创建subject,并对cookie进行解密。

一直跟到可以进入到AuthenticatingFilter#executeLogin,用来处理登录

步入53行login函数,经过相关判断后,登陆成功

跟进onSuccessfulLogin函数会来到rememberMeSuccessfulLogin(注意要填正确的账户密码才会进onSuccessfulLogin (token, info, loggedIn))

获取到RememberMeManager不为空,进入AbstractRememberMeManager#onSuccessfulLogin

跟进forgetIdentity函数,它处理了request和response请求

再跟进forgetIdentity

继续跟进removeFrom,该函数会获取了各种配置信息

返回到AbstractRememberMeManager#onSuccessfulLogin ,isRememberMe(token)检查是否登陆时选择Remember Me选项!

继续跟rememberIdentity

一直到这里首先转为bytes,跟convertPrincipalsToBytes函数首先进行序列化,在getCipherService获取到的加密不为空后进入encrypt进行加密

进入encrypt函数,会获取密码服务,在cipherService不为空时进入getEncryptionCipherKey

getEncryptionCipherKey获取的就是kPH+bIxk5D2deZiIxcaaaA==

获取到key后将进入cipherService.encrypt函数,初始化向量后进入各种加密函数

完成后,会回到rememberIdentity函数,rememberSerializedIdentity实现了记住序列化身份功能

在rememberSerializedIdentity里面,进行base64后,将信息加入到cookie中

之后层层返回,直到AuthenticatingFilter#executeLogin处理登录,返回成功登陆

解密过程

在AbstractShiroFilter.class#doFilterInternal的createSubject函数断点,一直跟到DefaultSecurityManager#createSubject

在从resolvePrincipals函数进入getRememberedIdentity,获取RememberMeManager不为空后进入rmm.getRememberedPrincipals(subjectContext)

在其中有两个函数getRememberedSerializedIdentity和convertBytesToPrincipals

先跟进getRememberedSerializedIdentity函数,他会获取cookie的值返回,并进行base64解密

跟进readValue,会将cookie中的remember字段值赋予value并返回

返回到getRememberedSerializedIdentity中,byte[] decoded = Base64.decode(base64)将获取到的value值base64解密,最后return返回

进入另一个convertBytesToPrincipals函数,会先进行解密,然后再进行反序列化

进getCipherService,会获取解密服务AES/CBC/PKCS5Padding

解密服务不为空后进入decrypt,获取CipherService解密服务

跟cipherService.decrypt,会先获取getDecryptionCipherKey(就是kPH+bIxk5D2deZiIxcaaaA==),然后进入JcaCipherService#decrypt进行各种解密

返回到convertBytesToPrincipals函数,在进入deserialize(bytes),其中存在readObject,这就触发了该漏洞

漏洞复现

借用p师傅的poc,最后执行calc.exe

将生成的payload填入rememberMe最后成功执行

小结

从中详细了解到了shiro反序列化的过程,后面会在学习下shiro-721。
新手上路,有什么不对的地方可以指点下

参考链接
https://www.anquanke.com/post/id/228889
https://www.cnblogs.com/liangzai6/p/14505494.html

posted @ 2022-12-30 17:13  one-seven  阅读(537)  评论(0编辑  收藏  举报