Shiro反序列化漏洞实战突破WAF长度限制的攻防艺术在渗透测试的实战中遇到Web应用防火墙(WAF)拦截是再常见不过的情况。最近一次针对使用Apache Shiro框架的系统的安全评估中我遭遇了一个有趣的挑战——WAF对请求包长度进行了严格限制导致常规的反序列化攻击payload无法正常传输。本文将详细记录从发现问题到最终绕过防御的全过程重点分享技术思路而非工具使用。1. 初识长度限制当工具遭遇拦截那天早上接到一个常规的渗透测试任务目标系统使用了Apache Shiro框架。通过简单的密钥检测确认存在默认密钥漏洞这本该是一个轻松拿下的目标。然而当我使用常见的Shiro反序列化利用工具发起攻击时却接连遭遇失败。最初以为是利用链选择的问题尝试了多个工具和不同利用链后发现一个规律当payload长度超过约2100个字符时请求就会被拦截。通过对比分析成功请求的平均长度2100字符失败请求的平均长度2900字符WAF明显特征基于长度的硬性拦截POST /login HTTP/1.1 Host: target.com Cookie: rememberMeBase64EncodedPayload...提示在遇到WAF拦截时首先应该确定拦截规则是基于什么特征长度、关键词还是行为模式。2. 深度分析WAF与中间件的解析差异了解WAF的工作原理是绕过的关键。现代WAF通常部署在反向代理层而应用服务器则有自己的一套解析逻辑。这种差异往往就是突破点。通过测试我发现几个有趣的现象HTTP方法的影响当使用非标准HTTP方法时WAF有时会直接放行标头顺序变化调整HTTP标头的顺序可以绕过某些基于正则的检测编码差异不同层面对URL编码的处理可能存在差异# 测试不同HTTP方法的简单脚本 import requests methods [GET, POST, PUT, DELETE, CUSTOM, SHIRO] for method in methods: try: r requests.request(method, http://target.com, headers{Cookie: rememberMetest}) print(f{method}: {r.status_code}) except Exception as e: print(f{method}: Error - {str(e)})3. 绕过技术实战从理论到实现基于上述分析我尝试了多种绕过技术最终找到可行的方案3.1 非常规HTTP方法通过使用非标准HTTP方法如SHIRO、CUSTOM等发现WAF对这些方法的处理存在漏洞WAF可能不会检查非常规方法的请求体后端服务器仍会处理Cookie头SHIRO / HTTP/1.1 Host: target.com Cookie: rememberMeBase64EncodedPayload...3.2 请求包变形技术通过Burp Suite等工具手动修改请求包尝试以下变形标头重排将Cookie头放在第一个位置空白字符注入在关键位置插入制表符或空格分块传输编码使用Transfer-Encoding: chunked技术成功率备注非常规方法80%依赖WAF配置标头重排40%对某些WAF有效分块传输60%需要服务器支持3.3 多阶段payload传递当单次请求无法传递完整payload时可以考虑将payload分割存储在服务器上通过多个请求逐步组装最后触发反序列化// 伪代码分阶段payload组装 String stage1 getParameter(stage1); String stage2 getParameter(stage2); String fullPayload stage1 stage2; deserialize(fullPayload);4. 自动化工具与手工结合的艺术虽然手工测试能够深入理解原理但在实际渗透中效率同样重要。我最终采用的方案是使用工具生成标准payload通过Burp Suite拦截并修改请求应用绕过技术变形请求自动化测试多个利用链# 使用ysoserial生成payload并通过curl发送变形请求 java -jar ysoserial.jar CommonsBeanutils1 command payload.bin base64 payload.bin | tr -d \n payload.txt curl -X CUSTOM -H Cookie: rememberMe$(cat payload.txt) http://target.com注意自动化工具虽然方便但理解底层原理才能在特殊情况下灵活应变。建议在掌握手工测试方法后再依赖工具。5. 防御视角如何有效防护Shiro反序列化从防御者角度看这次绕过尝试揭示了几个关键点多层防御单一WAF规则容易被绕过深度检测不应仅依赖长度等表面特征及时更新保持Shiro框架和依赖库的最新版本对于系统管理员我建议采取以下措施定期更换Shiro加密密钥实现自定义的RememberMe解析逻辑在应用层增加额外的反序列化防护6. 深入理解Shiro反序列化的底层机制要真正掌握这类漏洞的利用和防御必须理解Shiro处理RememberMe cookie的完整流程请求到达服务器Shiro过滤器检查RememberMe cookieBase64解码并AES解密反序列化处理对象验证用户身份// Shiro处理RememberMe的核心代码片段 byte[] serialized Base64.decode(rememberMeCookie); byte[] decrypted decrypt(serialized, encryptionKey); ObjectInputStream ois new ObjectInputStream(new ByteArrayInputStream(decrypted)); Object principal ois.readObject();这个流程中WAF通常只能看到加密后的Base64字符串而应用服务器则会完整执行整个流程。正是这种不对称性创造了绕过可能。7. 实战中的经验与教训在这次测试过程中有几个关键经验值得分享保持耐心绕过WAF往往需要多次尝试和调整记录细节每个失败的尝试都可能包含重要线索理解系统深入了解目标系统架构能帮助预测哪些绕过可能有效工具局限没有万能工具必须能够手工调整和验证在一次特别棘手的案例中我花了近三天时间才找到有效的绕过方法。关键在于注意到WAF对GET和POST方法的处理差异最终通过混合使用非常规HTTP方法和精心设计的标头顺序成功突破防御。对于安全研究人员来说这类挑战正是技术成长的催化剂。每次成功的绕过不仅增加了实战经验更深化了对Web安全机制的理解。记住在渗透测试中遇到阻碍不是终点而是深入学习的起点。