Shiro反序列化(CVE-2016-4437)(二)加解密

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加密应该就不会有这个问题。



上一篇
下一篇