JWT漏洞利用
JWT漏洞利用
kunkunJWT漏洞分析
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
提取session值
.eJwlzjEOwzAIQNG7eO6AAWPIZSJjsNo1aaaqd2-kjl_6w_uUfR15Psv2Pq58lP0VZSuC5Gsmtt4xMCOl1xhZHWtt6jLdnSUYUj0npw6JWEbWpDYcpnFvAGQO1IXrnL3nUEQU6oPuEhFuKIq2KjuBNGOdYJA5KMoNuc48_hos3x-4sS5U.Zuzjow.09lgm1OqoVaAVLe76LXT-TkqWnA
kali自带python模块较为完善,可以在kali里面运行
重新注册一下获得的第二个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
修改session值获取flag
NSSCTF{216857c5-8aaa-4cfe-9990-4081f74efb4e}
[NSSRound#13 Basic]flask?jwt?(hard)
第一题的pro版,区别在于开个debug来找到密钥,其他形式和第一题无区别,注册访问/wor路由即可拿到本题所需要的密钥
访问其/wor路由,给出一个时间,可知session里包含time,我们尝试修改session的值,获取key的值,眼睛不好可以复制到记事本里看:hardgam3_C0u1d_u_f1ndM3????
找到密钥之后就像第一题一样解决之后就行