JWT特征
JWT
生成的token
由.
连接的三段字符串组成,即{HEADER}.{PAYLOAD}.{SIGNATURE}
。
HEADER
HEADER
是对算法和token
类型进行base64Url
加密。如以下JSON
对应的HEADER
为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
,这是token
的第一部分。1
2
3
4{
"alg": "HS256",
"typ": "JWT"
}
PAYLOAD
PAYLOAD
是对传输的数据进行base64Url
加密。如以下JSON
对应的PAYLOAD
为eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY2MTg0NDUyNiwiZXhwIjoxNjYxODQ0NTg2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19
,这是token
的第二部分。1
2
3
4
5
6
7
8
9
10
11
12
13{
"iss": "WebGoat Token Builder",
"aud": "webgoat.org",
"iat": 1661844526,
"exp": 1661844586,
"sub": "tom@webgoat.org",
"username": "Tom",
"Email": "tom@webgoat.org",
"Role": [
"Manager",
"Project Administrator"
]
}SIGNATURE
SIGNATURE
是对HEADER
和PAYLOAD
的密文用.
连接后,对该字符串使用HMACSHA256
加密,然后再进行base64Url
加密,这是token
的第三部分。
攻击方式
空加密算法
JWT
支持使用空加密算法,在HEADER
中的alg
指定为None
,设置SIGNATURE
为空即可。如果使用了空加密算法,任何token
都可以通过验证,但需要服务器开启空加密算法。爆破密钥
在获得
token
的情况下,我们已经知道了加密算法,这样就可以通过爆破的方式进行破解。但如果密钥复杂,则无法爆破成功。修改
kid
参数kid
参数用于指定密钥文件,如果该变量可控,可能会导致任意文件读取和SQL注入的问题。