JWT 签名核心机制
JWT(JSON Web Token)由 Header.Payload.Signature 三部分组成,签名是保障令牌完整性与真实性的核心:
- 作用:防止客户端篡改令牌内容,确保令牌在传输与存储过程中未被恶意修改
- 常用算法
- 对称加密:
HMAC-SHA256(HS256) - 非对称加密:
RSASSA-PKCS1-v1_5、ECDSA、RSASSA-PSS
- 对称加密:
- 关键原则:令牌在交付客户端前必须签名,服务端接收后必须先验证签名再执行其他操作
Session 与 Token 的区别:
- Session:服务器存信息,给用户一个'编号'(依赖服务器存储)
- Token:用户带信息,服务器只验真伪(不依赖服务器存储,更适合多服务器 / APP 场景)
示例:攻击者拿到自己的 JWT header.payload.signature
- 解码 payload 看到:
{"user_id":123, "role":"user"}(普通用户) - 把
role改成"admin",重新编码 payload - 构造新 Token:
原 header.篡改后的 payload.随便填(甚至把 signature 删掉) - 服务器收到后,直接解析 payload 就用,没验证签名 → 攻击者变成管理员。
- 认证方式:
Authorization头携带 JWT 令牌,且令牌采用了alg: none无签名模式。
靶场第六关:服务器未验证签名
这是一个水平越权漏洞关卡,需要以普通用户身份行使管理员权限。
- 登录普通用户(如 Tom),尝试重置投票,系统提示只有管理员可操作。
- 使用抓包工具查看响应,发现提示
"Only an admin user can reset the votes"。 - 修改 Cookie 中的 access_token。使用在线 JWT 工具解码并修改 payload。
- 将 payload 中的角色改为管理员,并设置
alg为none。 - 重新编码并替换 Cookie 中的 token。
- 发送请求,成功获得管理员权限并重置投票。



















