无聊日记4-JAVA-shiro反序列化漏洞
漏洞原理
shiro在登录处提供了Remember Me这个功能,来记录用户登录的凭证,然后shiro使用了CookieRememberMeManager类对用户的登陆凭证,也就是Remember Me的内容进行一系列处理:
使用Java序列化 ---> 使用密钥进行AES加密 ---> Base64加密 ---> 得到加密后的Remember Me内容
同时在识别用户身份的时候,需要对Remember Me的字段进行解密,解密的顺序为:
Remember Me加密内容 ---> Base64解密 ---> 使用密钥进行AES解密 --->Java反序列化
问题出在AES加密的密钥Key被硬编码在代码里,这意味着攻击者只要通过源代码找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化,AES加密,Base64编码,然后将其作为cookie的Remember Me字段发送,Shiro将RememberMe进行解密并且反序列化,最终造成反序列化漏洞。
防御方法
1. 生成新的秘钥加密
2. 在shiro的配置文件里,引用GenerateCipherKey的generateNewKey方法随机生成秘钥

浙公网安备 33010602011771号