漏洞复现-CVE-2016-4437-Shiro反序列化

漏洞复现-CVE-2016-4437-Shiro反序列化

概述

Apache Shiro是一个开源的安全框架,为Java应用程序提供安全功能。在Apache Shiro 1.2.4之前的版本中,存在一种可导致远程代码执行的漏洞,该漏洞由序列化和反序列化不当引起,其中,攻击者通过构造恶意的序列化数据,可以在未经授权的情况下执行任意的Java代码。

该漏洞的漏洞编号为CVE-2016-4437,本文将介绍如何复现该漏洞以及如何进行修复。

环境准备

本次漏洞复现采用Docker搭建环境,具体环境搭建方式如下:

docker pull zer0ne/cve-2016-4437
  • 运行镜像
docker run -d -p 8080:8080 zer0ne/cve-2016-4437

漏洞复现

漏洞分析

漏洞复现之前,我们先来了解一下 Shiro 框架中的两个类:

  • Subject:表示一个执行主体,当前应用与客户端之间的交互都会在 Subject 中进行;
  • Session:一个会话对象,保存 Subject 对象在应用程序上下文中的状态。

接下来,我们分析一下漏洞的具体实现方式。

通过分析,我们可以发现漏洞的原因在于 Shiro 框架对 Session 对象的序列化和反序列化。在默认情况下,Shiro 将会把 Session 对象写入 Cookie 中,导致该 Cookie 被篡改,成功实现了会话劫持。

复现步骤

为了复现该漏洞,我们需要模拟攻击者向受害者发送恶意数据,实现代码执行。受害者本来预期操作只是访问某个页面,但却被攻击者利用该漏洞执行了恶意代码。

具体步骤如下:

  1. 打开 NetCat 连接漏洞目标,我们需要提交恶意请求,尝试执行Payload。执行以下命令:
nc 127.0.0.1 8080
  1. 设置 Cookie:我们需要将恶意Cookie添加到 HTTP 头中。HTTP 头信息包含3个参数:UID、rememberMe、JSESSIONID。其中 JSESSIONID 是下文关键,也就是 Shiro 会话硬编码的前缀。
GET /shiro HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: UID=test;rememberMe=deleteMe;JSESSIONID=1ohaol8q3ixe712levf23lt6of

  1. Payload 工具:受害者当前访问的页面地址为 /shiro,而 Shiro 框架在执行 URL 认证时会将 Cookie 中的 JSESSIONID 对应值作为 org.apache.shiro.subject.support.DefaultSubjectContext_SECURITY_MANAGER_SESSION_KEY 的 “键”。而在 DefaultSessionManager 中生成了一个 Session 对象,将它序列化后打包进 Cookie 并返回给浏览器。也就是说,在受害者访问 /shiro 这个地址时,将会触发反序列化攻击:
$ python shiro_cve-2016-4437.py 127.0.0.1 8080
  1. 实验结果

如果实验成功,我们将在控制台看到返回的 bash 标志表示已经进入了反弹 shell。此外,我们可以在另一个终端窗口中执行:

nc -lvp 1234

当受害者与服务器建立了反向 shell 之后,服务器将会将 shell 输出至控制台,并在终端窗口中启动一个本地监听器,以便我们输入命令。

修复方案

针对该漏洞,Apache Shiro 官方也已发布了修复方案,修复方式如下:

在 Shiro 框架中,可以通过在 shiro.ini 配置文件中增加 SessionStorageEvaluator 配置,来替换默认配置:

# 配置自定义 Session 存储
 [main]
 sessionDAO = com.demo.WarriorSessionDAO
 securityManager.sessionManager.sessionDAO = com.demo.WarriorSessionDAO

通过这种方式,自定义的 Session 存储会替换默认的 Cookie 存储方式,从而解决该漏洞。

总结

本文介绍了 Apache Shiro 中的一个反序列化漏洞,在了解了漏洞的原理之后,实现了漏洞的复现,并介绍了漏洞的修复方案。该漏洞揭示了反序列化漏洞的危害性,提醒我们编写的程序要避免反序列化漏洞的发生。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:漏洞复现-CVE-2016-4437-Shiro反序列化 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • Go语言依赖管理三要素示例解析

    Go语言依赖管理三要素示例解析攻略 介绍 Go语言是一种现代化的编程语言,具有强大的依赖管理系统。在Go语言中,依赖管理的三个要素是:go.mod文件、go.sum文件和go get命令。本攻略将详细讲解这三个要素,并提供两个示例说明。 1. go.mod文件 go.mod文件是Go语言项目的模块定义文件,用于管理项目的依赖关系。它包含了项目的模块路径、版本…

    other 2023年9月7日
    00
  • Java多线程揭秘之synchronized工作原理

    Java多线程揭秘之synchronized工作原理 Java多线程编程中,synchronized关键字是最基础和最常用的并发控制手段之一,也是Java内置的重量级锁实现。本文将详细讲解synchronized关键字的工作原理,以及如何正确使用synchronized。 synchronized基本概念 synchronized是Java中的一个关键字,它…

    other 2023年6月27日
    00
  • rasrc4aes加密md5

    以下是关于RSA、RC4、AES加密和MD5哈希算法的完整攻略,包括算法原理、加密过程、示例说明等。 1. RSA加密算法 RSA加密算法是一种公钥加密法,它使用一对公钥和私钥来进行加密和解密操作。以下是RSA加密算法加密过程: 密钥:生成一对公钥和私钥。 加密:使用公钥对明文进行加密。 解密:使用私钥对密文进行解密。 以下是一个使用RSA加密算的示例说明:…

    other 2023年5月7日
    00
  • Android 对话框(Dialog)大全详解及示例代码

    Android 对话框(Dialog)大全详解及示例代码 什么是 Android 对话框(Dialog)? Android 对话框(Dialog)是一种常用的用户界面元素,用于向用户显示重要信息、接收用户输入或进行用户确认。对话框通常以弹出窗口的形式出现,覆盖在当前活动或片段之上。 常见的 Android 对话框类型 1. 提示对话框(AlertDialog…

    other 2023年8月23日
    00
  • 使命召唤战区闪退、卡机怎么办 Dev致命错误解决方法

    “使命召唤战区闪退、卡机怎么办 Dev致命错误解决方法”攻略 问题描述 在玩使命召唤战区时,可能会遇到闪退、卡机等问题,同时可能会出现Dev致命错误的提示。这些问题可能会影响到用户的游戏体验,因此需要及时解决。 解决方法 卡机问题 卡机问题通常是由于游戏占用过多的系统资源导致的。如果你的电脑配置较低,那么很容易遇到卡机问题。下面是一些解决方法: 降低游戏画质…

    other 2023年6月26日
    00
  • ue4世界坐标自下而上

    UE4世界坐标自下而上 在Unreal Engine 4中,世界坐标系是非常重要的一个概念。本文将介绍UE4中世界坐标系的一些特点,主要是其自下而上的性质。 什么是世界坐标系 在Unreal Engine 4中,每个Actor都有一个相对于世界坐标系的位置。世界坐标系是整个场景的参考系,它是一个三维笛卡尔坐标系,通常被称为X,Y,Z轴。 X轴指向场景右边,Y…

    其他 2023年3月28日
    00
  • C++类与对象的详细说明2

    C++类与对象的详细说明2 1. 构造函数和析构函数 1.1 构造函数 构造函数是一种特殊的成员函数,它会在对象被创建时自动调用。构造函数可以用来初始化类的成员变量,或进行一些必要的初始化操作。在C++中,类可以拥有多个构造函数,这些构造函数的名称与类名相同,但可以拥有不同的参数列表。 下面是一个简单的示例代码,展示了如何声明和定义一个构造函数: class…

    other 2023年6月26日
    00
  • 浅谈JavaScript面向对象–继承

    浅谈JavaScript面向对象 – 继承 什么是继承 在面向对象编程中,继承是指一个对象直接使用另一个对象的属性和方法的能力。被继承的对象称为父类或超类,继承它的对象称为子类或派生类。子类可以继承父类的所有公共方法和属性,同时还可以根据需求添加新的属性或方法。 JavaScript中的继承是基于原型(Prototype)实现的,每个对象都可以拥有原型,并继…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部