【SRC】基础思路篇15:JWT安全测试完全指南

📅 2026/7/27 17:59:10
【SRC】基础思路篇15:JWT安全测试完全指南
文章目录前言一、JWT基础与识别1. 什么是JWT2. JWT识别特征3. JWT在线解析工具二、JWT安全测试三件套三、弱密钥爆破1. 原理2. 测试方法3. 密钥泄露点审计四、算法篡改攻击1. None算法攻击2. RS256转HS256算法切换攻击3. 算法混淆攻击五、签名绕过与验签缺失1. 直接修改Payload保留原签名2. 截断Token测试3. 空签名测试六、KID注入攻击1. KID字段简介2. SQL注入3. 命令注入4. 文件读取七、Token替换与响应篡改1. 响应包Token替换2. Match and Replace自动化篡改3. Payload字段篡改重点八、嵌套加密处理1. 识别嵌套加密2. 完整伪造链条九、JWT与其他漏洞的组合利用1. JWT 信息泄露2. JWT 前端鉴权绕过3. JWT OAuth劫持十、实战心得1. 遇到JWT必测三件套2. 框架默认密钥是高危点3. 密钥来源多元化4. 前端源码辅助权限推测5. 嵌套加密需要完整还原6. 测试高权限接口验证真实权限7. 多种算法尝试十一、结语核心要点回顾防御建议⚠️本博文所涉安全渗透测试技术、方法及案例仅用于网络安全技术研究与合规性交流旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前必须获得目标网络 / 系统所有者的明确且书面授权严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。前言JSON Web TokenJWT是现代Web应用中广泛使用的身份认证机制。它通过将用户信息编码在Token中实现了无状态的身份验证。然而JWT的实现方式多种多样许多开发者在密钥管理、算法选择和签名验证等环节存在安全疏忽导致JWT成为SRC漏洞挖掘中的高频突破口。本文将系统性地介绍JWT的安全测试方法论帮助读者建立完整的JWT渗透测试思维体系。一、JWT基础与识别1. 什么是JWTJWT由三部分组成通过点号.分隔Header.Payload.SignatureHeader声明签名算法和Token类型Payload包含用户身份信息和声明Signature对Header和Payload的签名2. JWT识别特征快速识别方法JWT Token以eyJ开头Base64编码的{包含两个点号分隔的三段结构常见于Authorization: Bearer请求头中常见存放位置HTTP请求头Authorization: Bearer tokenCookietokenjwt响应体{token: jwt, accessToken: jwt}URL参数?tokenjwt3. JWT在线解析工具jwt.io最权威的JWT在线解析和调试平台支持手动修改Header和Payload其他在线解码工具Base64解码后查看明文结构二、JWT安全测试三件套在SRC漏洞挖掘中遇到JWT身份凭证时建议按照以下顺序进行系统化测试测试顺序测试类型核心方法成功率第一步弱密钥爆破使用工具爆破签名密钥中高第二步算法篡改将alg改为none或切换算法中第三步验签缺失修改Payload后保留原签名低但危害大核心理念由易到难逐步验证先爆破、再改算法、最后测试不验签。三、弱密钥爆破1. 原理JWT使用对称密钥HMAC算法或非对称密钥RSA/ECDSA算法进行签名。当使用HMAC算法HS256/HS384/HS512时如果密钥强度不足短密钥、常见单词、默认密钥攻击者可以通过爆破获取密钥进而伪造任意Token。2. 测试方法步骤1识别算法将JWT复制到jwt.io解析查看Header中的alg字段如果为HS256、HS384、HS512则存在弱密钥爆破的可能步骤2选择工具TscanPlus内置JWT弱密钥爆破功能轻武器模块可快速检测hashcat高性能密码爆破工具支持JWT格式jwt_tool专门的JWT安全测试工具c-jwt-crackerC语言编写的高速JWT爆破工具步骤3执行爆破使用常见密钥字典top1000、top10000针对目标特征构造定制化字典公司名称、产品名、域名变体关注框架默认密钥如secret、your-256-bit-secret、jwt-secret步骤4验证利用获取密钥后在jwt.io中修改Payload中的身份字段使用密钥重新签名替换原Token测试是否生效3. 密钥泄露点审计除了爆破还应主动寻找密钥泄露代码仓库搜索GitHub/Gitee搜索目标项目源码重点检查example.env、README、config文件中的默认硬编码密钥搜索关键词JWT_SECRET、SECRET_KEY、jwt.key、token_key前端源码审计反编译小程序/APK后搜索密钥相关字符串分析前端JS Bundle中的配置信息配置文件泄露通过信息收集发现的配置文件中可能包含JWT密钥如application.yml、config.js、.env等四、算法篡改攻击1. None算法攻击原理将JWT Header中的alg字段改为none表示不使用签名算法。如果服务端未正确校验算法类型将接受无签名的Token。测试步骤解码原JWT的Header和Payload将Header中的alg改为none修改Payload中的身份字段如user_id、role重新Base64编码Header和Payload移除Signature部分None算法不需要签名组合为新的Token新Header.新Payload.注意末尾的点号自动化脚本可使用Python的PyJWT库构造None算法攻击Token设置algorithmNone和keyNone即可生成无签名Token。注意事项部分服务端会过滤none大小写敏感可尝试None、nOne、NONE某些JWT库的实现会拒绝none算法但自定义实现可能存在漏洞2. RS256转HS256算法切换攻击原理当服务端使用RS256RSA非对称算法时理论上应该使用私钥签名、公钥验证。但如果服务端在验证时未严格校验算法类型攻击者可以将算法改为HS256HMAC对称算法并使用服务端公开的公钥作为HS256的对称密钥进行签名。攻击条件服务端使用RS256/ES256等非对称算法攻击者能够获取服务端的公钥通常可从证书、JWKS端点获取服务端验证时未固定算法类型测试步骤获取服务端的公钥从证书、.well-known/jwks.json、源码中提取将JWT Header中的alg从RS256改为HS256修改Payload中的身份字段使用公钥作为HS256的对称密钥进行HMAC签名发送伪造的Token测试服务端是否接受3. 算法混淆攻击测试思路尝试将alg改为其他算法如HS384、HS512如果服务端使用多算法支持库可能存在算法混淆漏洞观察服务端对不同算法的响应差异五、签名绕过与验签缺失1. 直接修改Payload保留原签名测试方法解码JWT的Payload部分修改身份字段如user_id、role、isAdmin重新Base64编码Payload保留原Signature不变组合为原Header.新Payload.原Signature成功条件服务端未验证签名或验证逻辑存在缺陷。2. 截断Token测试测试方法移除Signature部分只发送Header.Payload.观察服务端是否接受不完整的Token3. 空签名测试测试方法将Signature部分替换为空字符串或随机字符串观察服务端的验证行为六、KID注入攻击1. KID字段简介KIDKey ID是JWT Header中的一个可选字段用于指定服务端应该使用哪个密钥进行验证。如果服务端根据KID值动态加载密钥且未对KID值进行严格校验可能存在注入漏洞。2. SQL注入原理如果服务端将KID值直接拼接到SQL查询中攻击者可以通过KID字段注入恶意SQL。测试Payloadxxx_key UNION SELECT mykey FROM INFORMATION_SCHEMA.SYSTEM_USERS --关键点xxx_key必须是不存在于数据库中的Key ID通过UNION SELECT注入自定义密钥注入的密钥可以是任意字符串也可进行Base64编码测试方法分析正常JWT的KID值格式构造带有SQL注入Payload的KID值结合时间盲注或布尔盲注确认注入点3. 命令注入原理如果服务端使用KID值执行系统命令如通过脚本读取密钥文件可能存在命令注入。测试方法在KID值中拼接系统命令如| whoami观察服务端响应是否存在命令执行痕迹某些语言如Ruby通过open函数读取文件时可能执行管道命令4. 文件读取原理如果服务端根据KID值读取本地文件作为密钥攻击者可以通过路径遍历读取任意文件。测试方法将KID值设为文件路径如/etc/passwd使用路径遍历如../../../../../etc/passwd指向/dev/null获取空密钥配合None算法攻击七、Token替换与响应篡改1. 响应包Token替换测试方法使用正常账号登录抓包获取JWT在jwt.io中使用爆破出的密钥或发现的密钥伪造高权限Token拦截登录响应包将响应中的Token替换为伪造的高权限Token观察前端是否以高权限身份加载界面和功能关键观察前端根据Token中的角色字段渲染界面后端API是否真正校验权限前端显示管理员界面不代表后端允许操作需要进一步测试高权限接口是否可实际调用2. Match and Replace自动化篡改工具使用使用BurpSuite的Match and Replace功能配置规则自动替换响应中的Token字段实现自动化的权限切换测试3. Payload字段篡改重点常见可篡改字段user_id、uid、sub用户身份标识role、roles、authority角色权限isAdmin、admin管理员标志username、email用户名/邮箱exp、iat过期时间/签发时间尝试延长有效期前端源码辅助通过分析前端源码中的条件渲染逻辑如ng-ifrole ! admin推测系统中存在的高权限角色名称为Token篡改提供目标角色值八、嵌套加密处理1. 识别嵌套加密特征JWT的Payload中包含额外加密的字段如{user_id:123,info:AES加密后的Base64字符串}2. 完整伪造链条处理步骤获取JWT签名密钥爆破或泄露分析嵌套加密字段的加密算法AES、DES等从源码中提取嵌套加密的密钥和IV解密嵌套字段修改身份信息重新加密嵌套字段重新签名JWT关键原则JWT的伪造不只是修改Payload当存在嵌套加密时需要完整还原整个加解密链。九、JWT与其他漏洞的组合利用1. JWT 信息泄露攻击链信息泄露源码/配置文件→ 获取JWT密钥 → 伪造Token → 权限提升2. JWT 前端鉴权绕过攻击链伪造高权限JWT → 替换响应包中的Token → 前端渲染管理员界面 → 调用高权限API3. JWT OAuth劫持测试思路不要只测试主站隐藏SSO/子站的JWT配置可能更弱对主站和子站分别测试JWT的安全性通过跨平台跳转行为发现非暴露的认证入口十、实战心得1. 遇到JWT必测三件套弱密钥爆破 → 算法篡改 → 验签缺失由易到难逐步验证。不要只测试一种就放弃。2. 框架默认密钥是高危点许多框架如ThinkPHP、Spring Boot等的示例配置中使用了默认JWT密钥开发者未修改直接上线。通过框架识别可以快速定位可能的默认密钥。3. 密钥来源多元化除了爆破还应主动从代码仓库、前端源码、配置文件、API文档中寻找密钥泄露。4. 前端源码辅助权限推测通过分析前端源码中的条件渲染逻辑可以推测系统中存在的高权限角色名称为Token篡改提供精确目标。5. 嵌套加密需要完整还原当JWT Payload中存在额外加密字段时单纯修改JWT签名无法完成攻击需要完整还原嵌套加密的密钥和算法。6. 测试高权限接口验证真实权限前端显示管理员界面不代表后端允许操作必须实际调用高权限API验证权限是否真正提升。7. 多种算法尝试none、None、nOne、NONE都要尝试不同JWT库对大小写的处理可能不同。RS256转HS256时公钥的格式PEM/DER/JWKS需要正确转换。十一、结语JWT安全测试是SRC漏洞挖掘中的一个重要方向。从弱密钥爆破到算法篡改从签名绕过到KID注入每一种测试方法都可能发现高危漏洞。本文系统性地介绍了JWT的识别方法、安全测试三件套、弱密钥爆破、算法篡改、签名绕过、KID注入和Token替换的完整方法论希望能帮助读者建立系统化的JWT渗透测试思维体系。核心要点回顾1. JWT识别以eyJ开头的三段结构常见于Authorization头、Cookie、响应体中2. 安全测试三件套弱密钥爆破优先级最高算法篡改None攻击、RS256转HS256验签缺失测试3. 密钥获取途径爆破使用专业工具定制化字典代码仓库搜索GitHub/Gitee前端源码审计反编译小程序/APK配置文件泄露4. KID注入SQL注入通过UNION SELECT注入自定义密钥命令注入通过管道符号执行系统命令文件读取通过路径遍历读取任意文件5. 组合利用JWT 信息泄露 → 快速获取密钥JWT 前端鉴权绕过 → 权限提升防御建议对于防守方来说JWT的安全防护需要从多个层面入手强密钥策略使用足够长度的随机密钥至少256位禁止使用默认密钥算法固定服务端验证时固定允许的算法类型拒绝none算法严格验签每个请求都必须验证JWT签名不依赖前端传入的算法声明KID校验对KID值进行严格的白名单校验禁止路径遍历和特殊字符密钥轮换定期轮换JWT签名密钥最小权限Token中只包含必要的身份字段不存储敏感权限信息过期控制设置合理的Token过期时间配合刷新Token机制