JWT漏洞利用

JWT漏洞分析

JWT认证攻击详细解答:https://www.cnblogs.com/backlion/p/16699442.html

在线利用工具:https://jwt.io/

jwt工具:https://github.com/ticarpi/jwt_tool

基础使用:python3 jwt_tool.py jwt

要运行特定类型的漏洞利用,您需要选择 eXploit (-X) 选项并选择漏洞(此处使用“a”表示alg:none漏洞利用):

python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a

1.JWT的简介

JWT全称为json web token 将json对象作为载体进行传输信息,通常用于身份认证和信息交换。JWT可以使用密钥(HMAC算法)或者使用RSA或ECDSA的公钥/私钥对自身进行签名

2:JWT的格式

每当用户访问站点中的资源时,对应的请求头认证默认为Authorization:jwt JWT令牌认证以eyj开头

JWT的数据头部如下:

JWT的数据分为三部分:头部(header),有效载荷(Payload),签名(Signature)

三个部分以英文逗号隔开,JWT的内容以base64进行编码

下面举个例子:

(1):头部信息包含了JWT的配置方面,例如签名算法(alg),令牌类型(JWT)和加密算法(alg)或者算法使用的密钥文件

Head:eyJraWQiOiJrZXlzLzNjM2MyZWExYzNmMTEzZjY0OWRjOTM4OWRkNzFiODUxIiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ

{“kid”:”keys/3c3c2ea1c3f113f649dc9389dd71b851”,”typ”:”JWT”,”alg”:”RS256”}

(2):有效载荷

有效载荷用于存储用户的数据,例如用户名(test123)

payload:eyJzdWIiOiJkdWJoZTEyMyJ9

{“sub”:”dubhe123”}

(3):签名

Signature 需要使用编码后的header和payload以及我们提供的一个密钥,然后使用header中指定的签名算法通常是RS256(RSA非对称加密和私钥签名)和HS256(HMAC SHA256对称加密)算法进行签名,签名的作用是保证jwt没有被篡改过

下面是一个用HS256生成Jw=WT的代码例子

HMACSHA256(base64Encode(header) + “.” + base64urlEncode(payload),secret)

Signature:

XicP4pq_WIF2bAVtPmAlWIvAUad_eeBhDOQe2MXwHrE8a7930LlfQq1lFqBs0wLMhht6Z9BQXBRos9jvQ7eumEUFWFYKRZfu9POTOEE79wxNwTxGdHc5VidvrwiytkRMtGKIyhbv68duFPI68Qnzh0z0M7t5LkEDvNivfOrxdxwb7IQsAuenKzF67Z6UArbZE8odNZAA9IYaWHeh1b4OUG0OPM3saXYSG-Q1R5X_5nlWogHHYwy2kD9v4nk1BaQ5kHJIl8B3Nc77gVIIVvzI9N_klPcX5xsuw9SsUfr9d99kaKyMUSXxeiZVM-7os_dw3ttz2f-TJSNI0DYprHHLFw

3:JWT常见安全问题

1:签名算法可被修改为none(CVE-2015-9235)

JWT支持算法设定为“None”,如果“alg”字段设为“None”,那么签名会被置空,这样的任何token都是有效的

2:未校验签名

某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。

通过在线工具jwt.io修改payload数据

3:JWKS公钥 注入 ——伪造密钥(CVE-2018-0114)

创建一个新的 RSA 证书对,注入一个 JWKS 文件,攻击者可以使用新的私钥对令牌进行签名,将公钥包含在令牌中,然后让服务使用该密钥来验证令牌

攻击者可以通过以下方法来伪造JWT:删除原始签名,向标头添加新的公钥,然后使用与该公钥关联的私钥进行签名。

4:空签名(CVE-2020-28042)

从令牌末尾删除签名

5:敏感信息泄露

JWT的header头base64解码可泄露敏感数据如密钥文件或者密码或者注入漏洞

6:KID参数漏洞

[NSSRound#13 Basic]flask?jwt?

考察知识点:session伪造,jwt

使用工具:GitHub - noraj/flask-session-cookie-manager: :cookie: Flask Session Cookie Decoder/Encoder

随意注册一个账号

抓包:访问/getFlag

image-20240920105914385

image-20240920110101258

提取session值

.eJwlzjEOwzAIQNG7eO6AAWPIZSJjsNo1aaaqd2-kjl_6w_uUfR15Psv2Pq58lP0VZSuC5Gsmtt4xMCOl1xhZHWtt6jLdnSUYUj0npw6JWEbWpDYcpnFvAGQO1IXrnL3nUEQU6oPuEhFuKIq2KjuBNGOdYJA5KMoNuc48_hos3x-4sS5U.Zuzjow.09lgm1OqoVaAVLe76LXT-TkqWnA

kali自带python模块较为完善,可以在kali里面运行

image-20240920111524083

重新注册一下获得的第二个session值经过伪造后可以猜测其id值为3,所以我们大胆猜测admin的id值为1

原始数据:

‘{“_fresh”:true,”_id”:”623bfce25772d2ede671dae1b21158b6cbbb46d40e8bec4e8a6ddf93956152a98d1580039b037641cc77ea8222637a3c776664526829f14b3065948c090eea3d”,”_user_id”:”2”}’

小写t变成T ,id:后加个空格,不然会报错

修改数据:

“{‘_fresh’:True, ‘_id’: ‘623bfce25772d2ede671dae1b21158b6cbbb46d40e8bec4e8a6ddf93956152a98d1580039b037641cc77ea8222637a3c776664526829f14b3065948c090eea3d’, ‘_user_id’: ‘1’}”

F12查看到密码为:th3f1askisfunny

image-20240920114313425

image-20240920112609288

修改session值获取flag

image-20240920112540806

NSSCTF{216857c5-8aaa-4cfe-9990-4081f74efb4e}

[NSSRound#13 Basic]flask?jwt?(hard)

第一题的pro版,区别在于开个debug来找到密钥,其他形式和第一题无区别,注册访问/wor路由即可拿到本题所需要的密钥

image-20240920201459394

访问其/wor路由,给出一个时间,可知session里包含time,我们尝试修改session的值,获取key的值,眼睛不好可以复制到记事本里看:hardgam3_C0u1d_u_f1ndM3????

image-20240920203659645

image-20240920203837691

找到密钥之后就像第一题一样解决之后就行