Apache Shiro-550反序列化分析

Ha1ey@深蓝攻防实验室

前言

  • JDK-1.6

  • https://support.apple.com/kb/DL1572?locale=zh_CN

    官方下载地址

  • JDK 1.8.0_261

  • IDEA 2021.3.2

  • Tomcat 8.5.75

  • Shiro1.2.4

  • https://github.com/apache/shiro/tree/shiro-root-1.2.4

    Github下载

下载完后打开pom.xml,修改jstl版本增加<version>1.2version>

编译时必须要用JDK1.6(本测试环境是Mac,其他环境有其他解决办法)

图片

环境

如果mac已安装高版本的JDK则会提示无法安装,别慌下面教你解决方法

  • 首先找到Mac的脚本编辑器

图片

  • 将以下代码复制到“脚本编辑器”应用中,注意换行一定不要错

set theDMG to choose file with prompt "Please select javaforosx.dmg:" of type {"dmg"}
do shell script "hdiutil mount " & quoted form of POSIX path of theDMG
do shell script "pkgutil --expand /Volumes/Java\\ for\\ macOS\\ 2017-001/JavaForOSX.pkg ~/tmp"
do shell script "hdiutil unmount /Volumes/Java\\ for\\ macOS\\ 2017-001/"
do shell script "sed -i '' 's/return false/return true/g' ~/tmp/Distribution"
do shell script "pkgutil --flatten ~/tmp ~/Desktop/Java.pkg"
do shell script "rm -rf ~/tmp"
display dialog "Modified Java.pkg saved on desktop" buttons {"Ok"}

  • 点击“脚本编辑器”右上角三角符号

图片

  • 点击完成可以生成一个窗口,在此窗口下选择你的JDK1.6的dmg包,在桌面会生成一个新的安装包,下一步安装即可。

图片

  • 编译pom.xml,修改toolchains.xml,添加path

  <toolchain>    <type>jdk</type>    <provides>      <version>1.6</version>      <vendor>sun</vendor>    </provides>    <configuration>      <jdkHome>/Library/Java/JavaVirtualMachines/1.6.0.jdk</jdkHome>    </configuration>  </toolchain>  <toolchain>    <type>jdk</type>    <provides>      <version>1.6</version>      <vendor>sun</vendor>    </provides>    <configuration>      <jdkHome>/Library/Java/JavaVirtualMachines/1.6.0.jdk</jdkHome>    </configuration>  </toolchain>

  • 最后直接install即可,启动TomcatServer,导入war包

图片

图片

  • 最后启动服务即可

图片

图片

分析

  1. 加密

  • 通过官方的说明我们知道cookie主要由CookieRememberMeManager处理

图片

图片

图片

  • 查看到该类的父类是AbstractRememberMeManager,跟进看一下,它在这里把key硬编码

图片

  • 继承了RememberMeManager接口,跟进该接口看一下方法,跟进一下onSuccessfulLogin

图片

  • 这里onSuccessfulLogin做了一个isRememberMe判断是否勾选rememberme

图片

  • 这里判断为true,我们也是勾选了的

图片

图片

  • 条件满足后,进入rememberIdentity,存储了一些session和用户信息

图片

图片

  • 此处将信息转成字节数组,并使用了序列化方法

图片

  • 再跟一下序列化方法,判断传入的对象是否为空,不为空则跳出if,执行序列化流

图片

  • 序列化结束,继续跟一下getCipherService这个是请求aes加密服务

图片

  • 继续跟进加密服务,判断是否为空,这里肯定是不为空的,调用并且传入了序列化对象

图片

  • 进入encrypt方法获取modename为cbc

图片

  • 继续跟进getEncryptionCipherKey这个应该是获取硬编码key的

图片

  • 跟进加密完成赋给新的字节数组,到此加密阶段就完成了

图片

  1. 解密

  • 加密使用了AbstractRememberMeManager的encrypt,同类中找一下解密方法decrypt,追溯一下到convertBytesToPrincipals

图片

  • 继续查找convertBytesToPrincipals

图片

  • 跟踪到getRememberedPrincipals,在此处下一个断点

图片

  • 这里调用了convertBytesToPrincipals方法,继续跟进一下

图片

  • 这里我们强制进入一下解密过程

图片

  • 这里可以看到解密具体的实现

图片

图片

  • 回到刚才这一步

图片

  • 继续往下跟进反序列化的流程readObject

图片

  • 返回到此反序列化过程就结束了

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值