第 6 章 · 05 认证与 JWT(令牌伪造 + 弱口令) 本节摘要:认证失败的两种最常见形态本节合并讲解:JWT/OIDC 失败——令牌伪造、令牌混淆、跨服务接受、持久账户接管,根因是「校验未绑定到签发者(iss)、受众(aud)、密钥与上下文」;弱口令/凭据爆破——默认凭据、撞库、可预测的系统生成口令、无速率限制的爆破,根因是「弱口令策略 + 缺 MFA + 缺速率限制」。前者从令牌内部攻破签名/头部/claim;后者从登录面外部用字典与爆破攻破。两者最终都指向「账户接管」:JWT 路径伪造任意身份、跨服务横行;弱口令路径拿下真实账户、横向移动。
本节摘要:认证失败的两种最常见形态本节合并讲解:JWT/OIDC 失败——令牌伪造、令牌混淆、跨服务接受、持久账户接管,根因是「校验未绑定到签发者(iss)、受众(aud)、密钥与上下文」;弱口令/凭据爆破——默认凭据、撞库、可预测的系统生成口令、无速率限制的爆破,根因是「弱口令策略 + 缺 MFA + 缺速率限制」。前者从令牌内部攻破签名/头部/claim;后者从登录面外部用字典与爆破攻破。两者最终都指向「账户接管」:JWT 路径伪造任意身份、跨服务横行;弱口令路径拿下真实账户、横向移动。本节讲透 JWT 攻击面(端点侦察、token 头部/claim/格式)、关键漏洞(RS256→HS256 混淆、
none算法、kid/jku/x5u/jwk 头部滥用、claim 校验缺口、access vs ID token 混淆、刷新与会话)、弱口令攻击面(登录面、默认/硬编码、撞库、可预测口令、爆破)、工具(jwt_tool、ffuf、nmapNSE*-brute),以及把「弱口令 + 缺 MFA」打包成严重发现的完整链路。
内容来源:原项目知识包
strix/skills/vulnerabilities/{authentication_jwt,weak_password_detection}.md,汉化并套用体系化模板合并。
⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。
阅读完本节,你应当能够:
/.well-known、/jwks.json、token 头部/claim/格式)。none 算法、kid/jku/x5u/jwk 头部滥用、claim 校验缺口、token 混淆、刷新与会话缺陷。jwt_tool、ffuf、nmap NSE *-brute 等工具实施令牌攻击与凭据爆破。两条路径的攻击面截然不同。
端点(well-known):/.well-known/openid-configuration、/oauth2/.well-known/openid-configuration;密钥:/jwks.json、轮换 key 端点、租户特定 JWKS;认证:/authorize、/token、/introspect、/revoke、/logout、device code 端点;应用:/login、/callback、/refresh、/me、/session、/impersonate。
token 特征:
{"alg":"RS256","kid":"...","typ":"JWT","jku":"...","x5u":"...","jwk":{...}}{"iss":"...","aud":"...","azp":"...","sub":"user","scope":"...","exp":...,"nbf":...,"iat":...}"b64":false)与 critical 头("crit")。端点识别:标准登录表单(/login、/signin、/auth);管理面板(/admin、/console);API 认证(/api/v1/token、/oauth/token、GraphQL login mutation);服务端口(SSH 22、FTP 21、SMB 445、RDP 3389、MySQL 5432、Redis 6379、MongoDB 27017)。
认证机制判定:表单 POST、Basic 认证、bearer token/JWT(password grant)、API key、多步认证、CAPTCHA 类型、速率限制指示(429、锁定消息、延迟)。
💡 核心心法:JWT 不要信任头部、claim 或 token 不透明——校验必须绑定到正确的 iss、aud、key 与客户端上下文。弱口令不要信任用户选的密码——默认凭据先试、用户名先枚举、小字典先于大字典、缺 MFA 即严重。
/.well-known、/jwks.json。admin/root/test/guest/support);从公司域名推导邮箱格式。签名校验:
alg 改成 HS256,用 RSA 公钥当 HMAC secret(若算法未固定)。none 算法接受:设 "alg":"none" 并去掉签名(若库接受)。头部操纵:
../../../../keys/prod.key;key 查找里的 SQL/命令/模板注入;或指向全局可读文件。密钥与缓存:
claim 校验缺口:
iss/aud/azp 未强制:跨服务 token 复用;接受任意签发者或错误受众。scope/roles 全盘信任:服务端不重新推导授权;签名弱时经 claim 编辑提权。exp/nbf/iat 未强制或时钟偏差容忍过大:接受长期过期或未生效 token。typ/cty 未强制:在需要 access token 处接受 ID token(token 混淆)。令牌混淆与 OIDC:
redirect_uri 与 client 混淆,client A 的 token 在 client B 兑换。code_verifier。刷新与会话:
传输与存储:
localStorage/sessionStorage:易被 XSS 外带;cookie vs header 的 SameSite/CSRF 权衡。cnf 绑定 → 可从他设备重放。微服务与网关:受众不匹配——内部服务校验签名却忽略 aud → 接受他服务 token;头部信任——边缘/网关注入 X-User-Id,后端信任它胜过 token claim;异步消费者——worker 用 bearer token 处理消息却不在重放时复查。
JWS 边界:未编码 payload(b64=false)+ crit 头——库误处理校验路径;嵌套 JWT(JWT-in-JWT)校验顺序错——外层接受而内层 claim 被忽略。
SSO 联邦:多 IdP/SP 间信任配置错误、混合元数据、陈旧 key → 接受外来 token。
弱口令策略:无最小长度/复杂度;允许常见口令(password/123456/qwerty/admin/letmein);不查泄露库(HIBP);大小写不敏感存储;无口令历史;最大长度过短(暗示明文或弱哈希)。
默认与硬编码:厂商默认(admin/admin、root/root、guest/guest);框架默认(django/admin、tomcat/tomcat、weblogic/weblogic);IoT/路由器/摄像头厂商特定默认;数据库默认(postgres/postgres、sa/sa、root/(空));硬编码在源码/配置/文档。
撞库(Credential Stuffing):跨服务口令复用;泄露凭据表(COMB、Collection #1-5)支撑大规模接管;无 MFA 即可直接访问;缺泄露检测或强制轮换。
可预测系统生成口令:顺序/模式(Password1、Welcome2025!、CompanyName123);基于时间(注册时间戳派生);弱随机(可猜 PRNG 种子);重置 token 兼作临时口令且过期短。
爆破漏洞:登录无速率限制;无或无效账户锁定(仅客户端,易绕);基于 IP 的封锁却无会话/用户关联(经代理轮换 IP);CAPTCHA 可绕或仅过度尝试后触发;并行登录尝试不跟踪(计数器竞态);冗长错误泄露合法用户名。
定向口令表:从公司名/产品名/域名、地理/行业词、季节+年(Summer2025!)、键盘走位与 leet、目标域历史泄露口令生成;爬目标站点构建内容派生表。
撞库工作流:按目标域过滤泄露库;测邮箱:口令对(邮箱匹配目标域);测用户名:口令对(常见用户名推导);在触发 MFA 前用会话端点验证登录成功。
多步认证绕过:用户名枚举 → 第二步口令爆破;步骤间会话固定;经直接 URL 跳到后续阶段;响应操纵绕过校验。
API/移动专项:GraphQL login mutation——经数组输入批量爆破;移动 API 常缺速率限制;JWT password grant 流程爆破 /token;OAuth2 password grant 测弱凭据。
服务级爆破:
ffuf -w users.txt:USER -w passwords.txt:PASS -u https://target.com/login -X POST -d "username=USER&password=PASS" -fr "Invalid" nmap -p 22 --script ssh-brute --script-args userdb=users.txt,passdb=passwords.txt target.com
可用的 NSE *-brute 脚本:ssh-brute、ftp-brute、smb-brute、telnet-brute、mysql-brute、pgsql-brute、mongodb-brute、redis-brute、http-brute、http-form-brute。
none;否则聚焦头部 key 控制(kid/jku/x5u/jwk)。💡 绕过的本质:JWT——校验逻辑常在不同栈/服务间分歧,任一接受路径缺绑定即可伪造;弱口令——速率限制常按 IP/连接/请求计,而非按「真实账户意图」,分布式与喷洒可绕。
常见误报:
两类认证失败最终都指向账户接管,影响等量齐观:
⚠️ 弱口令 + 缺 MFA = 严重发现;JWT 任一签发/校验路径缺绑定 = 可伪造任意身份。两者都不要止步于「拿到一个账户」——测跨服务复用、测提权、测持久化。
/jwks.json、token 头部(alg/kid/jku/x5u/jwk)/claim(iss/aud/azp/sub/exp/scope)/格式(JWS/JWE/b64/crit)。none 算法、kid 路径穿越/注入、jku/x5u/jwk 头滥用(攻击者控制 key)、JWKS 缓存/轮换竞态、iss/aud/exp/scope 校验缺口、access vs ID token 混淆、OIDC mix-up/PKCE 降级、refresh 不轮换。jwt_tool -t <url> -rh "Authorization: Bearer <token>" -M at(全攻击矩阵)、jwt_tool <token> -C -d <wordlist>(爆破 HMAC secret);弱口令——ffuf(Web 登录)、nmap NSE *-brute(服务级)、自定义 Python(requests + 线程 + 抖动 + 代理轮换)。下一节,我们看业务逻辑与竞争——当业务规则在并发、重放、乱序下失效,「免费领钱」「超额退款」「突破限额」就成为可能。