JWT(Json Web Token)

JWT(Json Web Token)

简介:是实现token验证的一种方式,将用户信息保存在一个json字符串中,编码后得到一个token。 认证流程:客户端向服务端发送请求–>验证用户凭据,成功后生成jwt–>token包括在登录响应中,返回给客户。在之后的请求中,http请求头中包含token供应用程序验证,首先验证签名,验证成功则处理请求。 jwt令牌结构:由三个部分组成:header.payload.signature header: 固定包含算法和token类型,对此json进行base64url加密,这就是token的第一段。{ “alg”:”HS256”, “typ”:”JWT”} 这里的HS256为设定的加密算法。 payload: 包含一些数据,对此json进行base64url加密,这就是token的第二段 signature: 把前两段的base密文通过.拼接起来,然后对其进行HS256加密,再然后对hs256密文进行base64url加密,最终得到token的第三段 Signature = HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload),”secret”) secret保存在后端,用于验证

使用burpsuite官方的靶场进行复现:

1、Lab: JWT authentication bypass via unverified signature

没有验证签名。

首先用给的用户名进行登录。然后再次访问,在这个页面抓包

session=…..那里就是jwt。burp可以自动解码jwt信息

把payload中的wiener改为administrator,上面的jwt会随着更改,复制到请求头,发包。回到页面看到多了一个 admin panel链接。继续带着改过的jwt访问,可以看到两个用户名,靶场要求我们删除carlot用户,也是带着jwt删掉即可。

2、Lab: JWT authentication bypass via flawed signature verification

没有禁用空加密,相当于可以不签名。

还是那个页面抓包,把alg改为none(代表没有签名算法),然后把sub后面改成administrator。去掉最后的signature部分,发包。其余操作和1一样。

3、Lab: JWT authentication bypass via weak signing key

后端密钥为弱密钥,可以通过爆破得到。

使用hashcat工具: hashcat -a 0 -m 16500 jwt wordlist wordlist为字典 得到密钥为secret1。然后再jwt.io上面改。

剩余的操作和上两道题一样。

4、Lab: JWT authentication bypass via jwk header injection

jwk标签头注入JSON Web Signature规范描述了一个可选的jwk标头参数,服务器可以使用该参数以 JWK 格式将其公钥直接嵌入到令牌本身中。简单来说就是jwk表示一个加密密钥。正常情况下,服务器只使用公钥白名单来验证JWT签名,但是由于某些原因,服务器会用JWK参数中嵌入的任何密钥进行验证。

这一关直接用burpsuite插件做了(Jwt Editor Keys),这个地方点击attack

找到Embedded JWK。用户名改为administrator。把新的JWT发过去就行了。

5、Lab: JWT authentication bypass via jku header injection(暂时未复现成功)

6、Lab: JWT authentication bypass via kid header path traversal

服务器可能会使用多个加密密钥来为不同类型的数据进行签名,出于这个原因,在JWT头部有时会包含一个kid参数,以避免服务器验证签名时出现错误。如果kid参数受到目录遍历的影响,可以把任意文件的文件名当做密钥利用。

先生成一个Symmetric Key,把k的值改为AA==,base64解码就是null。

抓包改kid和sub。kid改为”../../../../../dev/null” 表示空设备文件,sub改为administrator。然后回到repeater点击sign选择OCT8 的密钥攻击

成功登录administrator