0x01 环境搭建
和这篇文章一致
0x02 代码分析
搜索encrypt
结合文件判断,查看AbstractRememberMeManager.java(这里有个问题,IDEA中并没有搜索到后续的关键函数)
AbstractRememberMeManager.java 中搜索
找到encrypt函数,结合入参,这个应该就是序列化后的加密函数
这个函数中,if应该是为了避免引发 NullPointerException,判断后调用了cipherService实例的encrypt方法,传入了序列化的数据和加密用的key
看一下key相关内容
一路查看声明最后发现了,这个key是一个固定值。
回到encrypt
查看generateInitializationVector函数
具体操作:1、初始化向量大小;2、判断向量大小;3、判断是否符合字节转位(8位一字节);4、生成初始化向量,并返回。
回到encrypt函数
最后返回了另一个encrypt函数的结果
注意这里
用crypt方法加密,同时,创建的用于存放结果的数组是指定长度的,避免数组越界等问题
具体操作:1、判断key的有效性;2、创建cipher实例;3、crypt加密数据
一步步的查看调用的函数
代码结合分析,采用的是AES加密算法+CBC模式。
0x03 加密算法补充
aes加密算法:一种对称加密算法 AES加密算法原理的详细介绍与实现-CSDN博客
cbc模式:与初始向量值或前段密文异或后,再加密。AES五种加密模式(CBC、ECB、CTR、OCF、CFB) – 月之星狼 – 博客园 (cnblogs.com)
0x04 漏洞相关性分析
实际上采用AES+CBC加密的问题(主要是iv重复时,加密结果相同),shiro中没有涉及,shiro的主要问题就是一开始的key值固定,攻击者可以利用key值,实现加密的操作,从而实现序列化对象的加密,如果采用随机key,并且在传输时采用非对称算法对key加密应该就不会有这个问题。