漏洞复现-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日

相关文章

  • mysql5.6下载&安装

    以下是关于“MySQL 5.6 下载&安装”的完整攻略,包括下载、安装和两个示例。 下载 打开MySQL官网:https://dev.mysql/downloads/mysql/5.6.html 在“MySQL Community Server”下拉单选择适合您操作系统的版本。 点击“Download”按钮选择适合您操作系统的安装包进行下载。 安装 …

    other 2023年5月7日
    00
  • 什么是ssrssr有什么用如何使用使用ssr

    什么是 SSR, SSR 有什么用,如何使用 SSR? 什么是 SSR? SSR (ShadowsocksR) 是一种基于 Socks5 代理技术的网络加速工具。它通过对网络流量进行加密和伪装,可以有效地隐藏数据传输过程中的敏感信息,提高安全性和隐私保护。同时,SSR 还能够绕过国家级别的网络封锁和限制,帮助用户快速高效地访问被屏蔽的网站和服务。 SSR 有…

    其他 2023年3月29日
    00
  • python的n个小功能(高斯模糊原理及实践)

    python的n个小功能(高斯模糊原理及实践) 在图像处理中,高斯模糊是一种常用的平滑滤波器。它可以减少噪声、消除细节,并使边缘保持连续。在本文中,我们将探讨高斯模糊的原理,并使用Python的OpenCV库实现高斯模糊。 高斯模糊原理 高斯模糊是一种线性滤波器,根据二维高斯函数生成权重矩阵,将该权重矩阵应用于图像上的每个像素,从而生成模糊的图像。二维高斯函…

    2023年3月28日
    00
  • Tomcat解析XML和反射创建对象原理

    Tomcat解析XML和反射创建对象原理 1. XML解析原理 Tomcat通过解析XML配置文件来配置和管理web应用程序。在Tomcat启动时,会读取web应用程序的配置文件(如web.xml),然后根据配置文件的内容进行相应的初始化操作。 Tomcat使用标准的XML解析器(如DOM或SAX解析器)来解析配置文件。DOM解析器将整个XML文档加载到内存…

    other 2023年6月28日
    00
  • layui之弹出层

    当然,我很乐意为您提供有关“layui之弹出层”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是layui弹出层? layui弹出层是一种基于layui框架的弹出窗口组件,用于在网页中显示弹出窗口。它可以用于显示提示信息、确认对话框、输入框等。 2. layui弹出层的使用 以下是使用layui弹出层的步骤: 2.1 引入layui 在使用layui弹…

    other 2023年5月6日
    00
  • div嵌套div布局

    div嵌套div布局 在Web开发中,div元素是一种非常常用的布局元素。通过嵌套div元素,可以实现复杂布局效果。本文介绍如何使用div嵌套div实现布局,并提供两个示例说明。 基本语法 div元素是一个块级元素,可以用于创建容器。通过嵌套div元素,可以实现复杂的布局效果。以下是一个基本的div嵌套div的示例: <div class="…

    other 2023年5月7日
    00
  • oracle误drop/update操作后的数据恢复测试

    Oracle误操作数据恢复测试攻略 误操作是数据库管理中常见的问题之一,为了保证数据的完整性和可靠性,进行误操作后的数据恢复测试是非常重要的。以下是Oracle误操作数据恢复测试的完整攻略: 创建测试环境:首先,创建一个与生产环境相似的测试环境,包括数据库实例、表结构和数据。确保测试环境与生产环境一致,以便准确模拟误操作的情况。 备份数据库:在进行误操作之前…

    other 2023年10月18日
    00
  • Java11 中基于嵌套关系的访问控制优化问题

    Java11 中基于嵌套关系的访问控制优化问题攻略 在Java11中,引入了一种新的访问控制优化机制,基于嵌套关系。这个机制可以帮助开发者更好地管理类和接口之间的访问权限,提高代码的可读性和安全性。 1. 嵌套关系的概念 在Java11中,嵌套关系是指一个类或接口被定义在另一个类或接口的内部。嵌套关系可以分为两种类型:静态嵌套和非静态嵌套。 静态嵌套:一个类…

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