JWT 的定义
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间安全地传递声明的紧凑且自包含的方式。它以 JSON 对象的形式传输信息,并通过数字签名或加密确保数据的完整性和可信性。
JWT 的结构
JWT 由三部分组成,用点号(.)分隔:
- Header:包含令牌类型(如 JWT)和签名算法(如 HMAC SHA256 或 RSA)。
{ "alg": "HS256", "typ": "JWT" }Header是JWT的第一个部分,是一个JSON对象,主要声明了JWT的签名算法,如"HS256”、"RS256"等,以及其他可选参数,如"kid"、"jku"、"x5u"等
alg字段通常用于表示加密采用的算法。如"HS256"、"RS256"等
typ字段通常用于表示类型
还有一些其他可选参数,如"kid"、"jku"、"x5u"等
- Payload:存储声明(claims),包括用户身份、权限和其他元数据。声明分为三类:
- Registered claims:预定义字段(如
iss签发者、exp过期时间)。 - Public claims:自定义公开字段。
- Private claims:双方约定的私有字段。
{ "sub": "1234567890", "name": "John Doe", "admin": true }Payload是JWT的第二个部分,这是一个JSON对象,主要承载了各种声明并传递明文数据,用于存储用户的信息,如id、用户名、角色、令牌生成时间和其他自定义声明。
iss:该字段表示jwt的签发者。
sub:该jwt面向的用户。
aud:jwt的接收方。
exp:jwt的过期时间,通常来说是一个时间戳。
iat:jwt的签发时间,常来说是一个时间戳。
jti:此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表, 当客户端携带jwt访问的时候需要在jti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉, 毕竟jwt所宣称的优点就是无状态访问
- Registered claims:预定义字段(如
- Signature:对前两部分 Base64 编码后的字符串进行签名,防止篡改。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key )Signature是对Header和Payload进行签名,具体是用什么加密方式写在Header的alg 中。同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。
对Header和Payload进行签名,具体是用什么加密方式写在Header的alg中。
同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。
第一部分:对 JSON 的头部做 base64 编码处理得到
第二部分:对 JSON 类型的 payload 做 base64 编码处理得到
第三部分:分别对头部和载荷做base64编码,并使用.拼接起来
使用头部声明的加密方式,对base64编码前两部分合并的结果加盐加密处理,作为JWT
在线解析:https://jwt.io/
BURP插件:Hae 或 JSON Web Tokens
靶场测试
1.None无签名认证
进入靶场显示

尝试抓包获取信息
转发发现admin
将JWT放到官网解析

重新编码,将user改为admin
重发得到flag
2.None算法绕过签名
重复上述操作,无回显,将算法修改为none
重复得到flag
3.弱口令密钥获取

抓包显示JWT为三部分,存在签名

使用JWT_tool破解密码为123456
在官网将 user 改为admin后重新发包获得flag

1498

被折叠的 条评论
为什么被折叠?



