前言: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无签名模式(从响应反馈可佐证)
靶场第六关:服务器没验证签名
'未签名 Token 提权',
靶场第六关是一个投票重置关卡,我们需要以一个普通用户的身份,行使管理员权限,造成水平越权。
先登录一个普通用户 Tom 进行投票重置,系统提示需要管理员权限。
使用 Yakit 抓包,显示 "feedback": "Only an admin user can reset the votes"。
因此只需要改变 Cookie 即可。打开 https://www.jwt.io/ 对 JSON WEB 解码并验证 JWT。
运用解码网站进行修改。


进行 base 编码 Cookie:access_token=ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNzU1MDczNDY5LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0.; JSESSIONID=E414E813D2B635E7F35FD26AB0F1DF2C


使用 Yakit 修改 cookie 后,Tom 就有了管理员的权限,投票也被重置。



靶场第十一关:时间戳与'none'
这关能简单,能用易理解,我们来尝试第 13 关,可以使用同样的方法。
结账发现身份令牌无效,于是就想能不能让别人给我们付钱,我们只需要知道别人的身份令牌正好,这个网页的漏洞可以看到日志中有汤姆的身份令牌,那就尝试。
抓包,修改。






alg: none的解释
是 JSON Web Signature (JWS) 规范中定义的一种无签名算法,核心含义是:JWT(JSON Web Token)仅做 Base64 编码和结构化组织,不进行任何数字签名 / 验签,仅传递明文信息(Header + Payload),不保证数据的完整性、真实性和不可篡改。
时间戳
iat(Issued At):令牌签发时间,Unix 时间戳(秒)。exp(Expiration Time):令牌过期时间,Unix 时间戳(秒)。通常服务器会拒绝当前时间晚于exp的令牌。- 你看到的像
1701234567这样的数字,代表的是从 1970-01-01 00:00:00 UTC 到指定时间经过的秒数。 - 优点:不受时区影响(统一为 UTC),便于计算机存储和比较大小。
我们在对继续对第 11 关进行解答。



