#JWT的攻击方法
jwt介绍
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,之后用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
一个JWT例子如下,是一个很长的字符串,中间用点`.`分隔成三个部分,分别是头部、负载、签名。eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcyODU3MDg2MywiZXhwIjoxNzI4NTc4MDYzLCJuYmYiOjE3Mjg1NzA4NjMsInN1YiI6InVzZXIiLCJqdGkiOiI1NWQ3ZDBlNjI2YzFjMjk2NTY5MGEwZWFlYTk3ZjJlZSJ9.L7RdUb-HcLH4-MTea7n4S7iuwFhuAPnbCSQlpwtKFx0
jwt在安全中我认为最重要的就是签名部分,通过某个保存在服务器的密钥(secret),使用 Header 里面指定的签名算法(如HMAC SHA256)产生签名。所以如果知道了密钥就可以篡改jwt。当然如果alg显示是None代表没有签证直接篡改jwt即可,可使用 https://www.jwt.io/
一般jwt的签名算法有以下系列:
| 算法系列 | 算法标识 | 描述 |
|---|---|---|
| HMAC | HS256, HS384, HS512 |
使用 SHA-256/384/512 的哈希消息认证码。这是对称加密,签名和验证使用同一个密钥。 |
| RSA (PKCS#1 v1.5) | RS256, RS384, RS512 |
使用 SHA-256/384/512 的 RSASSA-PKCS1-v1_5 签名。这是非对称加密,使用私钥签名,公钥验证。 |
| RSA (PSS) | PS256, PS384, PS512 |
使用 SHA-256/384/512 和 MGF1 的 RSASSA-PSS 签名,是 RSA 的一种更安全的填充模式。 |
| ECDSA | ES256, ES384, ES512 |
使用 P-256/384/521 曲线和 SHA-256/384/512 的椭圆曲线数字签名算法。 |
| EdDSA | EdDSA |
基于 Ed25519 椭圆曲线的数字签名算法,提供高性能和安全性。 |
| 无签名 | none |
表示 JWT 未经过签名。此算法应谨慎使用,仅当令牌通过其他方式(如 TLS)受到保护时才可接受,否则会带来严重安全风险。 |
攻击:
首先要知道jwt的签名的加密算法,当怀疑目标使用了对称密钥(如 HS256)且强度不足时,可以借助 jwt_tool 进行离线爆破。
下载地址:https://github.com/ticarpi/jwt_tool
成功下载后:

是这个样子的
常用操作参数:
这些参数通常与其他模式组合使用。
| 参数 | 作用 | 典型组合 |
|---|---|---|
-d <dict> |
指定字典/词表文件路径 | 与 -C 搭配爆破密钥:-C -d /usr/share/wordlists/rockyou.txt |
-t <URL> |
目标 URL,将伪造的 token 发送到该地址验证 | 与 -M at 搭配:-t https://target/my-account -rc "session=<JWT>" -M at |
-rc <cookies> |
指定包含 JWT 的请求 Cookie | 与 -t 搭配使用 |
-rh <header> |
添加额外的请求头 | 如 Authorization: Bearer <JWT> |
-pc <claim> |
指定要修改的 payload 声明(支持点号访问嵌套对象) | 与 -pv、-I 搭配:-pc user.phone -pv true -I |
-pv <value> |
指定声明的新值 | 与 -pc 搭配使用 |
-I |
修改后立即重新签名 | 与 -pc、-pv、-S 搭配 |
-S <alg> |
指定签名算法 | 如 -S hs256 或 -S es256 |
-k <key> |
指定签名密钥或密钥文件 | 与 -S 搭配使用 |
假设爆破的jwt为: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3MTk5NjQ0MSwiZXhwIjoxNzcyMDAzNjQxLCJuYmYiOjE3NzE5OTY0NDEsInN1YiI6InVzZXIiLCJqdGkiOiI2MGM2M2RmMjdmOTFiZDg5MjU3ODc1OTA2ZjBhZWNiNCJ9.-0Wyh-_OgzWt5ub-sP6XNtXxwEoeYudMD1wzcFNYBEI
我们找个字典kali上有自带的我们直接先用kail的先:
密钥就是123456.
之后再更新怎么用脚本。
评论