首页 > 其他分享 >shiro-550反序列化分析

shiro-550反序列化分析

时间:2022-12-30 17:23:48浏览次数:61  
标签:函数 550 解密 获取 进入 序列化 shiro

搭个环境 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

标签:函数,550,解密,获取,进入,序列化,shiro
From: https://www.cnblogs.com/one-seven/p/17015383.html

相关文章

  • Java 序列化,字段为null 是否返回
    java字段值为null,不返回该字段类上打注解不让null值返回前端场景:有时候我们返回给前端的数据是null的,而这些为null的值前端也不需要,我们就没必要吧null值返回给前端......
  • rdf序列化关联字段
    ##问题描述#序列化方式classOrderSerializer(serializers.ModelSerializer):classMeta:model=Orderfields="__all__"##得到的结果......
  • RESTFul Shiro
     RESTFul与服务没有关系?REST的本质是设计风格,不是技术。REST的URL还是个URL,就是个普通的URL,访问这个URL的时候,先被ServletFilter(即Shiro的Filter)拦截住,判断你有没有登......
  • 基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列
    在上篇随笔《基于SqlSugar的开发框架循序渐进介绍(23)--Winform端管理系统中平滑增加对WebAPI对接的需求 》中介绍了基于一个接口,实现对两种不同接入方式(直接访问数据库实......
  • 基于SSM与Shiro的汽车项目详情
    《伴我汽车后台项目》课程详情一.项目课程详情1.课程介绍本套课程主要是基于Spring、SpringMVC、Mybatis、Vue、js、MySQL、Shiro、BootStrap、Echarts、POI、Druid、MD5加......
  • django,多对多,序列化组件,ORM批量操作数据,自定义分页器
    django,多对多,序列化组件,ORM批量操作数据,自定义分页器多对多三种创建方式1.全自动classBook(models.Model):title=models.CharField(max_length=32)authors......
  • 图像处理程序的序列化和反序列化
       所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。这里区分4个......
  • Unity内置JSON组件反序列化JSON数据
    Json数据如下:{"data":[{"id":141,"layoutLabel":"Sameer","hasCustomProb":1},{"id":......
  • Shiro
    1.入门概述1.1.什么是Shiro?ApacheShiro是一个功能强大且易于使用的Java安全(权限)框架。Shiro可以完成:认证、授权、加密、会话管理、与Web集成、换成等。借助Shiro可以......
  • 你确定懂了Java中的序列化机制吗
    持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第4天,点击查看活动详情概述java中的序列化可能大家像我一样都停留在实现Serializable接口上,对于它里面......