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 theDMGdo 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包


-
最后启动服务即可


分析
-
加密
-
通过官方的说明我们知道cookie主要由CookieRememberMeManager处理



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

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

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

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


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


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

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

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

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

-
进入encrypt方法获取modename为cbc

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

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

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

-
继续查找convertBytesToPrincipals

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

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

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

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


-
回到刚才这一步

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

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

1841

被折叠的 条评论
为什么被折叠?



