1. JWT靶场解题实战指南
最近在安全圈里流行一句话:"不会打JWT靶场的安全工程师,就像不会用筷子的厨师"。作为Web安全领域的经典题型,JWT相关漏洞在各种CTF比赛和渗透测试靶场中频繁出现。今天我就以"好靶场"平台为例,带大家系统梳理JWT题型的解题思路和实战技巧。
JWT(JSON Web Token)本质上是一种开放标准(RFC 7519),用于在网络应用环境间安全传递声明。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),通过点号连接成xxxxx.yyyyy.zzzzz的形式。在安全测试中,我们常遇到的漏洞类型包括:算法篡改、密钥爆破、KID注入、头部参数注入等。
2. JWT核心漏洞原理剖析
2.1 算法篡改攻击
最常见的漏洞是算法从RS256改为HS256的伪造攻击。RS256使用非对称加密,而HS256使用对称加密。如果服务端没有严格校验算法类型,攻击者就可以将算法改为HS256并用公钥作为密钥重新签名。
# 原始JWT头部 {"alg": "RS256", "typ": "JWT"} # 篡改后的头部 {"alg": "HS256", "typ": "JWT"}关键点:这种攻击成功的前提是服务器配置了自动验证算法类型,且公钥可被获取。实战中可以通过
/.well-known/jwks.json等路径尝试获取公钥。
2.2 KID参数注入
KID(Key ID)用于指定验证密钥的标识符。如果服务端未对KID做严格过滤,就可能存在以下风险:
- 目录遍历:
"kid": "../../../etc/passwd" - SQL注入:
"kid": "1' UNION SELECT 'key'--" - SSRF攻击:
"kid": "http://attacker.com/key"
2.3 JKU/X5U滥用
JKU(JWK Set URL)和X5U(X.509 URL)允许指定远程密钥集。如果未做白名单限制,攻击者可以托管恶意JWK集实现签名伪造。
3. 好靶场实战解题步骤
3.1 环境准备
推荐使用以下工具链:
- Burp Suite + JWT Editor插件
- Python库:PyJWT、jwt_tool
- 在线工具:jwt.io、jwtdebugger
# 安装jwt_tool git clone https://github.com/ticarpi/jwt_tool cd jwt_tool pip install -r requirements.txt3.2 基础信息收集
- 捕获目标JWT令牌(通常在Authorization头或cookie中)
- 解码分析结构:
python3 jwt_tool.py <JWT_TOKEN> - 检查敏感信息泄露(如密钥硬编码、过弱密钥)
3.3 典型攻击流程
以好靶场Level 5为例:
- 发现JWT使用RS256算法
- 从网页源码中找到公钥:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG... - 使用jwt_tool篡改算法:
python3 jwt_tool.py <JWT> -T -S hs256 -k public.key - 将生成的token替换原请求中的认证信息
4. 进阶技巧与防御方案
4.1 密钥爆破技巧
当面对HS256算法时,可以尝试:
- 常用密钥字典:secret、key、123456等
- 基于已知信息的密钥生成(如CTF中常用题目名作为密钥)
- 使用hashcat加速爆破:
hashcat -m 16500 jwt.txt wordlist.txt
4.2 防御最佳实践
开发人员应该:
- 严格校验算法类型(白名单机制)
- 禁用none算法
- 对KID/JKU等参数做严格过滤
- 使用足够的密钥长度(HS256至少32字节)
- 定期轮换密钥
5. 常见问题排查
Q:修改JWT后服务端返回"Invalid signature" A:检查是否遗漏了以下步骤:
- 正确编码所有特殊字符
- 确保头部和载荷的JSON格式正确(无多余空格/换行)
- 签名前移除base64末尾的等号
Q:如何判断目标使用哪种验证方式? A:修改JWT观察响应变化:
- 直接报错→可能校验签名
- 正常响应但无权限→可能只解析payload
- 500错误→可能存在异常处理缺陷
在最近的一次红队演练中,我们通过JKU注入成功突破了某金融系统的权限控制。关键在于发现其JWK Set端点没有验证Referer头,使我们能够托管恶意密钥集。这也提醒我们,安全防护需要全方位考虑,任何细节的疏忽都可能导致防线失守。