web渗透之jwt 安全问题
前言
JWT 全称 JSON Web Token,是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。原始的 Token 只是一个 uuid,没有任何意义。
JWT 包含了部分业务信息,减少了 Token 验证等交互操作,效率更高
JWT组成
JWT 由三部分组成,分别为:
Header — 头部
Payload — 负载
Signature — 签名
它们之间由三个 . 分隔,由 Base64 加密而来。我们以下面这一个 JWT 作为例子进行说明
eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm8sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ.SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA
Header 部分
Header 部分就像是货车的标志,告诉了我们这辆车上面装了什么易爆品啊,还是易燃品。
在 JWT 中 Header 部分存储的是 Token 类型和令牌的加密算法
{
"alg": "HS256", // 也可以是 HS512, RS256 等等
"typ": "JWT"
}
Payload 部分
Payload 这个词中文意思为负载,也就是我们大货车上面的货物。Payload 里面存具体的业务数据比如用户 id 等等。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Signature 部分
Signature 部分意为签名,这批货送到了,需要对方签收一下,这就是签名。Signature 是具体的数字签名密文信息,这部分的密文信息是手动设置的,一般在 Java 开发的配置文件当中设置。像这样

JWT 基础安全问题
JWT 所产生的安全问题,是设计上与逻辑上不恰当的设计所造成的。
其中,如果服务器未对签名进行校验,则可以任意修改数据,若进行了校验,则无法修改,需要我们通过其他手段进行辅助攻击。
1. 未对签名进行验证
前文我们说到,JWT 需要开发者提供一个 Signature — 签名,如果我们不对签名进行验证,那么就可能存在对令牌的其余部分内容进行任意更改的风险。
假设选择存在一个 JWT 如下
{
"username": "carlos",
"isAdmin": false
}
如果服务器基于此识别会话username,又未对签名进行认证,修改其值可能会使攻击者模拟其他登录用户。同样,如果isAdmin值用于控制是否为管理员,修改其值为true可能到导垂直越权。
PortSwigger 靶场
本实验室使用基于jwt的机制来处理会话。由于实现缺陷,服务器不会验证它接收到的任何jwt的签名。靶场要求:修改会话令牌以访问/admin的管理面板,然后删除用户carlos。
首先访问靶场: bypass-via-unverified-signature,点击右上角my account,使用提供的账号密码登录 wiener:peter

成功登录后返回了jwt认证信息

接下来每次请求都会携带认证信息

上面我们介绍了jwt中的第二部分payload存储了具体的业务数据如用户id等,我们直接在burp中选择jwt第二部分的数据然后进行base64解码查看,或者使用在线工具解码:https://jwt.io/。发现sub键的值为当然用户名wiener

那我将其改为administrator用户会怎么样了?如下修改后点击apply changes,然后cookie信息会被修改

对修改后的数据包重放,发现此时用户变为administrator,垂直越权成功

我们可以将修改后的jwt认证信息复制,然后使用“Cookie Quick Manager”插件将当前用户wiener的cookie修改为administrator的cookie,最后点击保存

然后刷新浏览器,页面显示为administrator,接着进入到管理员面板

最后删除carlos用户

2. 接受没有签名的令牌
其中,JWT头包含一个alg参数。这告诉服务器使用哪种算法对令牌进行签名,从而服务器也使用这种算法对签名进行验证。
{
"alg": "HS256",
"typ": "JWT"
}
jwt可以使用一系列不同的算法进行签名,但也可以不进行签名。通过设置 alg 为 none,绕过验证,从而实现攻击。
PortSwigger 靶场
地址:signature-verification
本实验室使用基于jwt的机制来处理会话。服务器被不安全地配置为接受无符号jwt。要解决这个问题,请修改会话令牌以访问/admin的管理面板,然后删除用户carlos。您可以使用以下凭证登录您自己的帐户:wiener:peter
首先像上一关一样尝试直接将sub值修改为administrator,发现无法认证成功

此时在将sub值修改为administrator的基础上,再将alg的值修改为none,并且删除jwt的第三部分但要保留引号,让其成为 JWT 的形式,因为 Signature 是通过 alg 算法生成的,修改了alg值 Signature也会变所以要将其删除。
此时已经是administrator用户了,然后去完成删除用户的操作

3. jwt秘钥爆破
一些签名算法,如HS256 (HMAC + SHA-256),使用简单的的字符串作为密钥,就很容易被暴力破解。
在jwt中的Signature部分,使用秘钥secret加密生成Signature,当通过暴力破解获取到了secret值,就能重新加密生成任意的用户的jwt

PortSwigger 靶场
地址:web-security-academy.net
登录后获取jwt,然后使用jwt_tool进行 Secret 爆破,字典:jwt.secrets.list
jwt_tool.py jwt -C -d 字典
#或者使用hashcat
hashcat -a 0 -m 16500 <jwt> <wordlist>
获取到了 Secret 为 "secret1",接着我们去到 jwt.io 下伪造administrator身份。如下填入,然后复制jwt替换原本的jwt

实现越权操作

4. jwt标头注入
根据JWS规范,只有alg标头参数是必需的。然而,在实践中,JWT报头(也称为何塞报头)通常包含几个其他参数。以下是攻击者特别感兴趣的。
jwk(JSON Web Key)——提供一个表示密钥的嵌入式JSON对象。
jku(JSON Web密钥集URL) -提供一个URL,服务器可以从该URL获取一组包含正确密钥的密钥。
kid(密钥ID) -提供一个ID,在有多个密钥可供选择的情况下,服务器可以使用该ID来识别正确的密钥。根据密钥的格式,这可能有匹配的kid参数。
正如您所看到的,这些用户可控制的参数都在告诉接收方服务器在验证签名时需使用哪个密钥。所以接下来将学习如何使用您自己的任意密钥去注入修改jwt签名而不是使用默认的服务器秘钥。
通过jwk头注入绕过JWT认证
jwk header中提供了一个可选的jwk参数,服务器可以使用该参数以JWK格式将其公钥直接嵌入令牌本身。JWK (JSON Web Key)是将键表示为JSON对象的标准化格式。
{
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"typ": "JWT",
"alg": "RS256",
"jwk": {
"kty": "RSA",
"e": "AQAB",
"kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
"n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"
}
}
理想情况下,服务器应该只使用指定的公钥来验证JWT签名。然而,错误配置的服务器有时会使用嵌入在jwk参数的公钥来验证,即允许任意公钥。所以通过使用自定义的RSA私钥对修改后的JWT进行签名,然后将匹配的公钥嵌入jwk标题,从而生成新的jwt,实现jwt认证绕过。
先安装 Burpsuite 的 JWT Editor Keys插件,burp商店中自带。靶场地址:bypass-via-jwk-header-injection
点击我们安装的 JWT Editor Keys插件中的 New RSA Key,生成 默认2048 长度的 JWK 私钥,点击ok保存。

回到repeatter模块中,将sub值改为administrator,然后点击Attack,点击“EMbedded JWK”,选择新生成的RSA秘钥,点击ok

在JWT的标题中,可以看到jwk已添加包含您的公钥的参数,发送请求,服务器会使用jwk中的公钥进行解密,从而绕过认证。成功变为administrator用户

还有其他的一些注入,后续补充
JWT 安全问题的防护
使用最新的 JWT 库,虽然最新版本的稳定性有待商榷,但是安全性都是较高的。
对 jku 标头进行严格的白名单设置。
确保 kid 标头不容易受到通过 header 参数进行目录遍历或 SQL 注入的攻击。
参考:
https://www.freebuf.com/articles/web/337347.html
https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-jku-header-injection
相关文章:
web渗透之jwt 安全问题
前言JWT 全称 JSON Web Token,是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。原始的 Token 只是一个 uuid,没有任何意义。JWT 包含了部分业务信息,减少了 Token 验证等交互操作,效率更高JWT组成JWT 由三部…...
好用的5款国产低代码平台介绍
一、云程低代码平台 云程低代码平台是一款基于springboot、vue.js技术的企业级低代码开发平台,平台采用模型驱动、高低码融合、开放扩展等设计理念,基于业务建模、流程建模、表单建模、报表建模、大屏建模等可视化建模工具,通过拖拉拽零代码方…...
【前端学习记录】webpack学习之mini-css-extract-plugin插件
前言 最近在学习尚硅谷的webpack5课程,看到mini-css-extract-plugin这个插件的时候,感觉很有帮助,之前都没有在css这方面深入思考过,课程中的一些记录写在下面 为什么需要优化CSS Css 文件目前被打包到 js 文件中,当…...
FPGA基于RIFFA实现PCIE采集HDMI传输,提供工程源码和QT上位机
目录1、前言2、RIFFA理论基础3、设计思路和架构4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂,…...
SpringBoot解析指定Yaml配置文件
再来个文章目录 文章目录前言1、自定义配置文件2、配置对象类3、YamlPropertiesSourceFactory下面还有投票,帮忙投个票👍 前言 最近在看某个开源项目代码并准备参与其中,代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库…...
C++基础算法③——排序算法(选择、冒泡附完整代码)
排序算法 1、选择排序 2、冒泡排序 1、选择排序 基本思想:从头至尾扫描序列,每一趟从待排序元素中找出最小(最大)的一个元素值,然后与第一个元素交换值,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序…...
《高质量C/C++编程》读书笔记一
前言 这本书是林锐博士写的关于C/C编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。 良好的编程习惯,规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性…...
【完美解决】python flask如何直接加载html,css,js,image等下载的网页模板
python flask如何直接加载下载的网页模板问题解决办法问题 本人网页开发小白,刚学了用flask,下载了一套网页模板,启动一个网页的确很简单,但是发现无论怎么改这里的 static_folder值都无法找到CSS,JS,IMAGE,FONT等资源 app Flas…...
2023美赛C题【分析思路+代码】
以下内容为我个人的想法与实现,不代表任何其他人。 文章目录问题一数据预处理时间序列模型创建预测区间单词的任何属性是否影响报告的百分比?如果是,如何影响?如果不是,为什么不是?问题二问题三难度评估模型…...
考研复试6 编译原理
第一章 编译器简介 1. 编译器的核心功能 把源代码翻译成目标代码 2. 编译器设计两个原则: 语义相同;以某种可察觉的方式改进输入程序 3. 编译器内部结构 前端:依赖于源语言,与目标机器无关。将输入的代码映射到 IR。包括分析部…...
uni-app:登录与支付--用户信息
用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中,定义如下的 UI 结构: <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…...
Docker 部署 MySQL
1. 进入下面路径下 -v 使用相对路径的方式挂载的目录docker会自动创建,路径为:/var/lib/docker/volumes/ cd /var/lib/docker/volumes/ 2. 指定版本5.7启动容器mysql docker run -p 3316:3306 --name mysql-master \ -v mysql-master-log:/var/log/mys…...
警惕,3月20日WOS目录更新,50本SCI/SSCI被剔除,这个出版社多达18本
2023年3月SCI、SSCI期刊目录更新 2023年3月20日,Web of Science核心期刊目录再次更新!此次2023年3月SCIE & SSCI期刊目录更新,与上次更新(2023年2月)相比,共有50本期刊被剔除出SCIE & SSCI期刊目录…...
【 Linux入门 】之 手搓 命令行解释器 bash(带源码)
目的基本结构提取输入命令fgets的使用命令初步处理命令的本质创建子进程重要知识补充进程替换命令处理简单 bash 完成及演示优化bashls颜色输出颜色实现cd命令ecport 命令envecho $echo $?目的 主要目的在于进一步了解 Linux 系统下使用进程相关的系统调用 及 shel…...
【运维】运维常用命令
shell大全读取文件每一行内容文件是否存在数组定义和循环取值变量循环流程控制语句:case判断数值相等/大于/小于判断字符串相等awk求和、平均、最大、最小sed用法exprbc计算器读取文件每一行内容 while read line doecho $line done < a.txt文件是否存在 if [ …...
MYSQL常用命令大全
文章目录 基本语句链接数据库显示已有数据库创建数据库选择数据库显示数据库中的表显示当前数据库的版本信息,链接用户名删除数据库创建表表 增加将查询结果插入到新表中:表 删除表 修改表 查询in子查询between ~ and ~ 模糊查询模糊查询regexp中的OR:多个信息查询同义词:删…...
锚点定位方案
一 背景知识: 1.1 #号的作用 #代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print 就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。 为网页…...
Flink学习--第一章 初识Flink
Flink是Apache基金会旗下的一个开源大数据处理框架,如今已被很多人认为是大数据实时处理的方向和未来,许多公司也都在招聘和储备掌握Flink技术的人才。 1.1 Flink的源起和设计理念 Flink起源于一个叫作Stratosphere的项目,它是由3所地处柏林的…...
电脑技巧:常见的浏览器内核介绍
浏览器是大家日常使用电脑必备的软件,网上查资料、听音乐、办公等等,都不离不开浏览器给我们提供的方便,今天小编来给大家介绍一下常见的浏览器内核,一起来学习一下吧!1、Chromium 内核Google Chrom内核:统…...
【数据分析之道①】字符串
文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
