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