JWT 原理与设计上的缺陷及利用

article/2025/6/25 6:46:27

JWT 原理与设计上的缺陷及利用

基本概念

JSON Web Token (JWT)是一个开放标准 ( RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全传输信息。此信息可以验证和信任,因为它是数字签名的。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
不理解上述解释没有关系,在解释 JWT 具体是个啥之前,先看看它会被用在什么地方。

跨域认证

在HTTP/HTTPS协议中,由于其是无状态协议,所以其中对于用户身份的认证过程一般是这样的:

基于 session 的认证

  1. 用户向服务器提供用户名与密码进行用户认证。
  2. 服务器收到验证用户身份合法后,为了避免该用户下次再次请求还需要重新认证(无状态协议不会记录),服务器会在当前会话(session)里面保存相关与用于身份有关的数据(用户身份等)。
  3. 服务器根据该session生成一个session_id用于唯一标识该session,并将其放入Cookie中返回给用户。
  4. 随后用户的每次请求都会带上该Cookie,服务器便可从该 Cookie 中获取到该用户的session_id以便对应之前保存在服务端的数据得知用户的身份。
    但这种方式存在的一些缺点:
    ● 随着用户的增多,服务端将保存大量session,增大开销 解决方案1:启用Session Ticket参数,将加密的session通过服务端的密钥加密后保存于客户端本地进行验证。
    ● 扩展性不好,不适用于分布式站点的单点登录(SSO)的场景:若是存在服务器集群,比如最简单的一家公司有两个网站,要求两个网站实现单点登录的功能(即:登录一个网站另一个关联网站也自动登录),此时若采用session认证,就需要两个网站共享session,在并发量大的情况下,不可能直接传输,而是应当将session持久化保存在本地(比如说数据库中),再向其请求,但这样工程量较大,而且一旦数据库持久化出问题单点登录将会失败(所有用户的单点登录)。
    ● 易受CSRF等攻击。

基于 JWT 的认证

在这里插入图片描述

  1. 首先用户通过浏览器向服务器发起一个POST请求,其中携带着username和password进行认证。
  2. 服务器验证用户身份后,会生成具有该用户标识信息的一个JWT对象,为了防止其中关于用户的信息在传输过程中被篡改,再用自己生成的一个secret对其加上签名并将其发给用户。
  3. 之后用户再次请求时,只需要带上这个JWT对象(类似于一个token),服务器即可验证其身份。 客户端得到JWT对象字符串后,一般将JWT对象字符串放在HTTP请求的头信息的Authorization字段中(也可以放在Cookie中,但放在Cookie中是无法跨域的 )发给服务器。

JWT 对象结构

这里可直接通过其官网进行Debugger,官方网站:https://jwt.io/
以官网提供的例子为例,JWT对象长这样:
在这里插入图片描述

一个 JWT 对象由三个部分组成,以.进行分隔,所以上面这个JWT对象可以分为三部分:

`Header.Payload.Signature`

● Header(头部)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
● Payload(负载)eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
● Signature(签名)SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Header(头部)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9是一个Base64URL 编码后的数据,解码后得到的内容为:

{  "alg": "HS256",  "typ": "JWT"}

Header部分是一个JSON对象,描述JWT的元数据,其中有这几个参数:
● alg签名使用的算法 默认为HMAC SHA256( 简写为HS256)
● typ用于标识该令牌(token)的类型为JWT

Payload(负载)

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ同样为Base64URL 编码后的数据。

{  "sub": "1234567890",  "name": "John Doe",  "iat": 1516239022}

但此处有一个特殊的地方在于,此处使用Base64URL编码与Base64有点小区别,编码后的数据,会将其用于填充的==去掉。
Base64有三个字符+/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略+替换成-/替换成_这就是Base64URL算法。

在这里插入图片描述
Payload部分也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段供选用:
● iss (issuer):签发人
● exp (expiration time):过期时间
● sub (subject):主题(jwt所面向的用户)
● aud (audience):受众( 接收jwt的一方 )
● nbf (Not Before):生效时间
● iat (Issued At):签发时间(Unix 时间格式)
● jti (JWT ID):编号(jst的唯一标识,主要用来作为一次性 token ,从而避免重放攻击)
这些只是官方的字段,若像定义,还可以定义私有的字段。
JWT 默认是不加密的,任何人都可以控制,将私密信息放到此处将会被泄露。
Signature(签名)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c此处并不是Base64编码的数据。
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c计算过程:
首先,需要指定一个secret,这个密钥由服务器生成,只有服务器才知道,不能泄露给用户。然后,使用Header里面指定的签名算法(默认是HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

用于对前两部分加一个签名,防止前两部分的数据被篡改(被篡改后计算所得值不同)。

JWT 特点

JWT默认是不加密,但也是可以加密的。生成原始Token以后,可以用密钥再加密一次。
JWT 的缺点
由于服务器不保存session状态,因此无法在使用过程中废止某个token,或者更改token的权限。也就是说,一旦JWT签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑,建议:
● JWT不应该使用HTTP协议明码传输,要使用HTTPS协议传输。
● JWT的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

针对 JWT 相关的攻击

例如:使用JWT_TOOL进行漏洞检测
python3 jwt_tool.py [jwt] -X a
使用jwt_tools的“-T”参数进行调试,生成新JWT.
在这里插入图片描述
验证一下:
在这里插入图片描述

未经验证的签名绕过 JWT 身份验证

由于后端没有对JWT的签名进行验证,可导致Payload字段遭到修改,以达到越权访问的目的。
这里使用Burp官方提供的Lab: JWT authentication bypass via unverified signature靶场。

实验链接:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-unverified-signature
在这里插入图片描述
题目要求:
为我们提供了一个常规用户的账户与密码wiener:peter让我们越权使用 admin 账户,并用其删除carlos账户。

1:登录后抓包

注意之后的所有操作中若在Burp中对JWT的对象属性进行修改后,都要点击Apply changes否则修改不会对应在原报文中。
● 通过wiener:peter进行账户登录后,启动Burp挂上代理并点击My account进行抓包。
在这里插入图片描述
从中可以看到用于验证客户端浏览器身份的JWT对象字符串,此处是放在Cookie中进行传输通过对其中Payload段进行Base64URL解密,可以获得其Payload携带的信息(见截图右下角)。
在这里插入图片描述

此处也可以使用Burp的插件JSON Web Token来查看JWT对象的结构。
在这里插入图片描述

2:改包越权访问 administrator 账户

由于后端没有对JWT对象做签名的验证,所以此处可以直接修改其中的sub字段为administrator,并修改登录的id为adminisrator。
在这里插入图片描述

之后便会访问到administrator的界面,点击其特有的Admin panel管理界面并抓包。
在这里插入图片描述
此时再次修改请求发出用于确认身份的JWT对象中sub属性为administrator。
在这里插入图片描述
成功访问,删除用户即可。
若对上述过程还存疑,可看该视频:https://youtu.be/Xy0pvy8ZdvU

爆破 Secret 进行越权

使用hashcat对JWT服务端的secret进行破解。
这里使用Burp官方提供的Lab: JWT authentication bypass via weak signing key靶场。

实验链接:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-weak-signing-key
在这里插入图片描述

题目要求:
本实验使用基于 JWT 的机制来处理会话。它使用极弱的密钥来签署和验证令牌。这可以很容易地使用一个常见的秘‍密词表暴力破解。其余账户与要完成的任务与上一题相同。

1:正常登录获取 JWT token

此处与上一题的过程相同,首先抓包获取JWT token。
在这里插入图片描述

2:爆破 secret

此处使用Burp官方提供的一个字典文件通过hashcat来暴力破解其secret值。

hashcat -a 0 -m 16500 JWT_token JWTsecretDirectory

● JWT_token要破解的刚刚抓包获取的JWT token
● JWTsecretDirectory官方提供的secret字典
最终破解得到secret = secret1
在这里插入图片描述

JWT弱密钥爆破字典路径

D:\渗透测试和安服工程师修炼之路\工具库,脚本–渗透测试利用工具集合\暴力破解工具(JWT加解密工具)\SecLists(暴力破解字典)\Passw cret = secret1 ords\Common-Credentials\10k-most-common.txt
在这里插入图片描述
hashcat.exe -a 0 -m 16500 eyJraWQiOiJkZmFjNjVlNi04YTUxLTQ5ZTItOWE3Ni0yMzU3OWJmNGM2YjAiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc0NzgyMDA3OSwic3ViIjoid2llbmVyIn0.jzqxK6nd7UHe7WfigPupGq2mQRWSG3oKhWpqNm52vDw D:\渗透测试和安服工程师修炼之路\工具库,脚本–渗透测试利用工具集合\暴力破解工具(JWT加解密工具)\SecLists(暴力破解字典)\Passwords\Common-Credentials\10k-most-common.txt
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

最终破解得到弱密钥为secret1。

3:计算 administrator 的 JWT token

在这里插入图片描述
之后的操作就简单了,和前一题类似。

改包越权访问 administrator 账户

由于后端没有对JWT对象做签名的验证,所以此处可以直接修改其中的sub字段为administrator,并修改登录的id为adminisrator。
在这里插入图片描述
之后便会访问到administrator的界面,点击其特有的Admin panel管理界面并抓包。
在这里插入图片描述
此时再次修改请求发出用于确认身份的JWT对象中sub属性为administrator。
在这里插入图片描述
成功访问,删除用户即可。

参考文章

1.http://book.fsec.io/201-%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86%E4%B8%8E%E5%B7%A5%E5%85%B7/201-A-%E6%BC%8F%E6%B4%9E%E5%8E%9F%E7%90%86/201-A24-JWT%E6%BC%8F%E6%B4%9E.html
2.https://www.4hou.com/posts/zlK2
3.https://jwt.io/
4.https://portswigger.net/web-security/jwt
5.https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
6.https://www.freebuf.com/articles/web/337347.html

漏洞利用工具

1、jwt.io
https://jwt.io/:一个在线工具,可以解析和调试 JWT,帮助开发者查看 JWT 的内容和签名算法,识别常见问题。
2、jwt_tool:
https://github.com/ticarpi/jwt_tool:用于分析、生成和攻击 JWT 的工具,支持算法混淆攻击等多种手段。
3、jwtcrack:
https://github.com/Sjord/jwtcrack:字典枚举破解 HS256, HS384 或 HS512 加密算法的JWT


http://www.hkcw.cn/article/NvrQQLBFGU.shtml

相关文章

Jmeter requests

1.Jemter元件和组件 1.1 元件和组件的概念 元件:多个功能相似的的组件的容器,类似于一个工具箱。 组件:实现某个特定功能的实例,类似于工具箱中的螺丝刀,十字扳手... 1.2 作用域和执行顺序 1.2.1 作用域 例子&#…

力扣HOT100之动态规划:300. 最长递增子序列

这道题之前刷代码随想录的时候也刷过,现在又给忘完了。自己尝试着写了一下,发现怎么写都写不对,直接去看视频了。。我自己写的时候的定义是:考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度,后面发现在写递推…

姜老师MBTI课程:ISTP和ISFP

文稿: 今天我们讲两个非常奇怪的人格特质组合。就是如果他又内向又严谨,他还可能P吗?可能愿意去接受风险,去尝鲜探索未知吗?对,咱们今天就讲的是ISP。 首先我们来看ISTP,一个人很内向&#xf…

Cursor奇技淫巧篇(经常更新ing)

Dot files protection :Cursor当开启了Agent模式之后可以自动帮我们写文件,但是一般项目中的一些配置文件(通常以.开头的)都是非常重要性,为了防止Cursor在运行的过程中自己修改这些文件,导致风险&#xff…

现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态

本文全面剖析现代数据湖架构的核心组件,深入探讨对象存储(OSS/S3)、表格式(Iceberg/Hudi/Delta Lake)、计算引擎(Spark/Flink/Presto)及元数据服务(HMS/Amoro)的协作关系,并提供企业级选型指南。 一、数据湖架构演进与核心价值 数据湖架构演进历程 现代数据湖核心价…

Python训练营打卡Day41(2025.5.31)

知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch归一化层…

MySQL--day10--数据处理之增删改

(以下内容全部来自上述课程) 增删改 0. 储备工作 #0.储备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_date DATE, salary DOUBLE(10,2) );1. 插入数据 1.1 一条一条添加 # (1)…

新版智慧景区信息化系统解决方案

该智慧景区信息化系统解决方案以云 + 大数据 + 物联网技术为核心,秉持 “汇聚联合,突显数据隐性价值” 理念,通过数据融合、业务融合、技术融合,构建 “营销、服务、管理” 三位一体模式。方案涵盖智慧票务、智能入园、精准营销、景区管理(如用电安全监测、森林防火、客流…

VAE在扩散模型中的技术实现与应用

VAE在扩散模型中的技术实现与应用 技术概述 在生成式AI领域,VAE(变分自编码器)与扩散模型的结合代表了当前最先进的技术方向之一。这种结合不仅解决了扩散模型在处理高维数据时的效率问题,还提供了更稳定的训练过程和更好的生成质…

C#中实现两个对象部分相同属性值的复制

在C#中实现两个对象部分相同属性值的复制,可通过以下方案实现: 一、手动赋值(基础方案) 直接通过属性名逐个赋值,适用于属性较少且明确的情况: // 示例类定义 public class Source { public int Id …

SOC-ESP32S3部分:22-分区表

飞书文档https://x509p6c8to.feishu.cn/wiki/F9PdwnOKhiTRDWk4cr1cIZsvneh 无论是前面我们说到的NVS,还是后面用到的文件系统,他们都必须有存储的载体,例如NVS,我们说过它是存储在Flash中的,那具体是Flash的哪个位置呢…

华为OD机试真题——找出两个整数数组中同时出现的整数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《找出两个整数数组中同时出…

KWIC—Implicit Invocation

KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation📝KWIC—Implicit Invocation🧩KWIC🧩核心组件🧩ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 🌟 总结 &#x…

JWT 入门

一、JWT 概述 1. 扩展(Cookie、Session、Token) 灵魂拷问:为什么你的淘宝账号关闭后,购物车还在?其实这是Cookie 在搞事情。它就像是一种入场券,有该入场券就可以随意进出关卡。但这有个致命的弱点,Cookie是存在客户…

传统液晶瓶颈待破?铁电液晶如何实现显示技术逆袭

一、传统液晶显示:繁华背后的技术枷锁 在消费电子与专业显示领域,液晶技术(LCD)凭借成熟的产业链和性价比优势,长期占据主流地位。然而,随着 VR/AR、车载显示、高端投影等新兴场景的崛起,传统液…

Mybatis:灵活掌控SQL艺术

在前面的文章中,小编分享了spring中相关的知识,但是没有分享到,如何去更高效操作数据库。 操作数据库传统的方法就是通过JDBC来进行操作。 这个传统方法使用上可谓是够麻烦的 1.首先创建一个数据源对象 2.设置该数据源的属性(…

STM32CubeMX定时器配置

STM32CubeMX定时器配置 一,Mode界面1,Slave Mode (从模式)2,Trigger Source (触发源) 三,Channelx(通道模式)1,Input Capture2,Output Compare3,PWM Generation4&#xf…

可灵2.1 vs Veo 3:AI视频生成谁更胜一筹?

在Google发布Veo 3几天后,可灵显然感受到了压力,发布了即将推出的视频模型系列可灵 2.1的早期体验版。 据我了解,有三种不同的模式: 可灵 2.1 标准模式: 720p分辨率 仅支持图像转视频(生成更快,一致性更好) 5秒视频仍需20积分 可灵 2.1 专业模式: 1080p分辨率 仅在图…

推荐几个不错的AI入门学习视频

引言:昨天推荐了几本AI入门书(AI入门书),反响还不错。今天,我再推荐几个不错的AI学习视频,希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的,也有免费的。我今天只推荐免费的。 我们按…

【机器学习】支持向量机

文章目录 一、支持向量机简述1.概念2.基本概念3.算法介绍4.线性可分5.算法流程 二、实验1.代码介绍2.模型流程3.实验结果4.实验小结 一、支持向量机简述 1.概念 支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其…