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

yizhihongxing

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

相关文章

  • Vue Echarts实现图表轮播图以及图表组件封装和节流函数优化讲解

    Vue Echarts实现图表轮播图以及图表组件封装和节流函数优化讲解 本文将介绍在Vue中使用Echarts实现图表轮播图以及图表组件封装和节流函数的优化方法。本文默认您已经安装了vue和ECharts,并且已经熟悉了基本的Vue组件开发和ECharts API使用。 实现图表轮播 实现图表轮播可以让我们在一个组件中展示多张图表,用户可以通过左右箭头或者自…

    other 2023年6月25日
    00
  • Vue引入sass并配置全局变量的方法

    当使用Vue开发项目时,可以通过以下步骤引入Sass并配置全局变量: 安装依赖: 在项目根目录下打开终端,执行以下命令安装所需的依赖: npm install sass-loader node-sass –save-dev 配置webpack: 在项目根目录下找到vue.config.js文件(如果没有则创建一个),并添加以下代码: javascript …

    other 2023年7月29日
    00
  • win10操作系统下重启电脑java环境变量失效

    下面是详细的攻略: 问题描述 在Win10操作系统下重启电脑后,Java环境变量失效,导致无法使用Java命令和运行Java程序。 解决方法 方法一:手动重新配置Java环境变量 重启电脑后,Java环境变量很可能会失效。我们需要手动重新配置Java环境变量,具体步骤如下: 打开“控制面板”,并点击“系统和安全”选项。 点击“系统”选项,并在右侧点击“高级系…

    other 2023年6月27日
    00
  • AtCoder Beginner Contest 146解题报告

    AtCoder Beginner Contest 146解题报告 最近,AtCoder Beginner Contest 146(以下简称ABC 146)已经结束了,本文的目的是回顾这次比赛,分析各道题目及其解法,帮助读者更好地理解比赛。 比赛总体情况 ABC 146是一场循环赛,共有六道题目。根据官网数据,本次比赛共有2433名选手参赛,其中AC人数最多的…

    其他 2023年3月28日
    00
  • 苹果iOS9.1 Beta1开发者预览版和公共测试版已知Bug和问题大全

    苹果iOS9.1 Beta1开发者预览版和公共测试版已知Bug和问题大全 简介 苹果iOS 9.1是苹果公司发布的最新操作系统之一。随着开发者预览版和公共测试版的发布,用户可以在第一时间获取新的功能和特性,但也需要注意其中已知的Bug和问题。这份攻略将详细讲解iOS 9.1 Beta1的已知Bug和问题,以便用户更加了解系统并避免使用过程中遇到困难。 已知B…

    other 2023年6月26日
    00
  • 在Windows 下关闭21\23\25端口的方法

    在Windows系统下关闭端口有多种方法,以下是两种可行的方式: 方法一:使用Windows防火墙 步骤: 打开“控制面板” → “系统和安全” → “Windows Defender防火墙”。 点击左侧的“高级设置”。 选择“入站规则”或“出站规则”中你要关闭的端口。如要关闭21端口,可选择FTP Server(FTP 传输控制程序)一项,进行右键操作,选…

    other 2023年6月27日
    00
  • 深度解析php数组函数array_chunk

    深度解析PHP数组函数array_chunk 在PHP开发中,数组是一种非常重要的数据类型。而PHP提供了很多可以操作数组的函数,其中一个非常实用的函数就是array_chunk。 什么是array_chunk? array_chunk函数是PHP数组函数中的一个,它可以将一个数组分割成指定大小的小数组,并将这些小数组组成一个大数组。它的语法如下: arra…

    其他 2023年3月28日
    00
  • Linux中mkdir函数与Windows中_mkdir函数的区别

    Linux中的mkdir函数与Windows中的_mkdir函数虽然在功能上都是用于创建目录,但由于两种操作系统的文件系统和API实现方式不同,所以在使用时会有一些区别。 在Linux系统下,mkdir函数的原型如下: int mkdir(const char *pathname, mode_t mode); 其中,pathname参数表示新创建目录的路径,…

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