JWT安全

news2024/11/29 10:53:33

文章目录

    • 理论知识
      • cookie(放在浏览器)
      • session(放在 服务器)
      • token
      • jwt(json web token)
        • header
        • payload
        • Signature
        • JWT通信流程
      • JWT与Token 区别
        • 相同点
        • 区别
    • WebGoat靶场--JWT tokens
      • 环境启动
      • 第四关
      • 第五关
      • 第七关

属于越权漏洞

理论知识

cookie(放在浏览器)

​ cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏 览器实现的一种数据存储功能。

cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 kv 形式保存到某个目录下的 文本文件内,下一次请求同一网站时会把该 cookie 发送给服务器。由于 cookie 是存在客户 端上的,所以浏览器加入了一些限制确保 cookie 不会被恶意使用,同时不会占据太多磁盘空 间,所以每个域的 cookie 数量是有限的

session(放在 服务器)

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交 谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服 务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都 带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份 标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用 session 把用户的信息临时保存在了服务器上,用户离开网站后 session 会被 销毁。这种用户信息存储方式相对 cookie 来说更安全,可是 session 有一个缺陷:如果 web 服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候 session 会丢失。

token

Token是用户进行一些权限操作时的许可凭证。token本质是字符串,里面包含了用户信息,过期时间,加密方式等。token是在前端进行登录之后,由服务器分发给前端,然后前端进行权限操作时,再将token发送给服务器,由服务器来验证。token是有过期时间的,一但token过期,用户就要重新登陆让服务器生成新的token。

在 Web 领域基于 Token 的身份验证随处可见。在大多数使用 Web API 的互联网公司中, tokens 是多用户下处理认证的最佳方式。

以下几点特性会让你在程序中使用基于 Token 的身份验证

  1. 无状态、可扩展
  2. 支持移动设备
  3. 跨程序调用
  4. 安全

jwt(json web token)

一个 JWT 实际上就是一个字符串,它由三部分组成:

  • 头部(head)
  • 负载(payload)
  • 签名(Signature)

image-20230913194257423

前两部分需要经过 Base64 编码,后一部分通过前两部分Base64编码后再加密而成

header

头部通常由两部分组成:算法类型和令牌类型。

  • 算法类型:指定用于生成签名的算法,例如 HMAC、RSA 或者 ECDSA。
  • 令牌类型:指定令牌的类型,常见的是 JWT。

头部使用 Base64URL 编码表示,并作为整个 JWT 的第一部分。头部的一个示例:

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

alg:
	是说明这个 JWT 的签名使用的算法的参数,常见值用 HS256(默认),HS512 等,也可以为
None。HS256 表示 HMAC SHA256typ:
	说明这个 token 的类型为 JW

算法类型也可以是 none,表示不加密,不加密的话签名就没用了,但是最后那个 点 必须要有

payload

载荷存储了有关用户或实体的声明和其他有关信息

  • 声明:如用户 ID、角色、权限等信息
  • 注册声明:包含一些标准的声明(比如发行人、过期时间等)和一些自定义的 声明

载荷也使用 Base64URL编码表示,并作为整个 JWT 的第二部分。载荷的一个示例:

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

image-20230913195224040

Signature

签名是拿到被base64编码的头部和负载后,用标头里的加密算法对拿到的标头和负载进行加密,然后作为jwt的第三部分。签名是用来验证标头和负载中的信息有没有被篡改。如果标头和负载的信息被篡改,则这个jwt是失效的。反之验证通过 ----------------用于验证 JWT 的完整 性和真实性

服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用 此密码进行加密,生成的字符串就是 JWT 的签名

签名生成方式:将头部和载荷进行 Base64URL 编码后拼接在一起,然后使 用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到JWT

JWT通信流程

image-20230913193941549

JWT与Token 区别

相同点

  • 都是访问资源的令牌
  • 都可以记录用户的信息
  • 都是使服务端无状态变化
  • 都是验证成功后,客户端才能访问服务端上受保护的资源

区别

  • Token: 服务端验证客户端发送过来的Token 时,还需要查询数据库获取用户信息,然后验证Token 是否有效
  • JWT: 将token 和 Payload 加密后存储于客户端,服务端只需要使用秘钥进行校验即可,不需要查询或者减少查询数据库,因为JWT自包含了用户信息和加密的数据

WebGoat靶场–JWT tokens

环境启动

启动WebGoat靶场

java -jar webgoat-server-8.0.0.M17.jar --server.port=8888 --
server.address=192.168.8.8

image-20230913193559388

访问WebGoat靶场

127.0.0.1:8888/WebGoat

image-20230913193656453

注册一个用户

image-20230913193820738

第四关

通过目标:以管理员的身份清楚普通用户的投票数

image-20230913200732662

image-20230913200854847

点击删除投票的按钮, BurpSuite拦截数据包,并观察数据包

image-20230913201113479

image-20230913201257233

访问jwt.io网站,粘贴进去

image-20230913201402858

可以看出使用的加密算法为HS512

Payload:adminfalseuser不是admin,而是Tom

选中Payload

image-20230913201641103

来到base64这个网站,admin修改为true

image-20230913202005582

image-20230913202053889

image-20230913202116650

再把JWT头部的算法类型改为none,如果改为了none,后面的签名就没有意义了

签名的意义就是为了加密算法是否正确,内容是否正确,现在不用加密了,所以最后一个.后面的签名部分就不要了

image-20230913202440286

image-20230913202500971

image-20230913202813204

image-20230913202929882

刷新页面

image-20230913203028672

成功重置!!

第五关

修改 exp 有效时间 ,修改username为 WebGoat

image-20230913211332034

image-20230913211400720

image-20230913211632480

爆破秘钥

 hashcat -m 16500 jwt.txt -a 3 -w 3 1.txt
 
-m 16500 这里的 16500 对应的就是 jwt 的 token 爆破;
-a 3 代表蛮力破解 
-w 3 可以理解为高速破解,就是会让桌面进程无响应的那种高速
jwt.txt 是我把题目要求破解的 token 保存到的文件 
pass.txt 密码字典

image-20230913211204638

得出密钥是victory

image-20230913211718117

第七关

通过目标:冒充tom用户,让tom帮我们付钱

BurpSuite拦截数据包,并观察数据包

image-20230913203801862

image-20230913203935783

并不是说一定要把JWT放到Cookie字段里

靶场提供了一个JWT ,点击here跳转链接

image-20230913204049743

image-20230913204124501

image-20230913204249762

image-20230913204628915

image-20230913204343107

修改Payload的过期时间和头部的算法类型

unix时间互换

image-20230913204736618

image-20230913205049946

image-20230913205125999

image-20230913205313986

image-20230913205345949

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静电消除器在工业设备中的用途

静电消除有几种,其中包括离子风枪、离子风嘴、离子风棒、离子风枪、离子风蛇等。今天我们就来聊一下离子风蛇。 离子风蛇是一种坐立式静电消除器,可消除难以接近或接触物体的静电或灰尘,可将蛇管随意变形使风咀指向目标方位,无需…

AIGC:【LLM(八)】——Baichuan2技术报告

文章目录 摘要1. 引言2. 预训练2.1 预训练数据(Pre-training Data)2.2 架构(Architecture)2.3 令牌化器(Tokenizer)2.3.1 Positional Embeddings 2.4 激活和规范化(Activations and Normalizati…

vue2-x6-dag自定义vue组件节点

效果如图 官方案例 人工智能建模 DAG 图 vue2中自定义节点 代码 1.dag.json [{"id": "1","shape": "dag-node","x": 290,"y": 110,"data": {"label": "读数据","status&q…

2023CVPR:图像恢复的又一力作

今天要分享的论文是2023CVPR《Efficient and Explicit Modelling of Image Hierarchies for Image Restoration》,图像恢复领域的又一力作,提供了新的发现,给出了新的解决方案 代码 https://github.com/ofsoundof/GRL-Image-Restoration 问…

C语言指针快速入门

指针的基本介绍 简单的说指针用于表示地址&#xff0c;存放的是一个地址 获取指针的地址 //指针的入门 #include <stdio.h>int main() {int num 1;//num的地址是多少//说明1&#xff1a;如果要输出一个变量的地址使用的格式是%p//说明2&#xff1a;&num 表示取出n…

百度SEO优化攻略(提高网站排名的必修课)

百度SEO优化策略介绍&#xff1a; 在百度搜索引擎中&#xff0c;网站的排名越靠前&#xff0c;就越能吸引更多的流量和用户。要想让网站排名更高&#xff0c;就必须进行SEO优化。百度SEO优化是一个长期的过程&#xff0c;需要不断调整和优化。下面介绍5个优化方法&#xff0c;…

C++ - 二叉树OJ题

二叉树的两种层序遍历 在写之前&#xff0c;我们先来看两种二叉树的层序遍历&#xff1a; 1.给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 输入&#xff1a;root [3,9,20,null,null…

靠差异化上了短剧“牌桌”后,百度准备怎么做生态?

从最初的野蛮生长到如今的百花齐放&#xff0c;短剧市场已然进入了质量与创意的竞争。 据《中国网络视听发展研究报告》数据显示&#xff0c;行业内重点网络微短剧上线数量从2021年的58部&#xff0c;飙升到2022年的172部。相比起前几年处于风口时的爆发式增长&#xff0c;“分…

广读论文核心思路汇总笔记 (一些有意思的论文and论文在研究的一些有意思的问题or场景应用)

思路可借鉴和学习 On the Generalization of Multi-modal Contrastive Learning CoRR, ICML&#xff08;2023&#xff09; 摘要&#xff1a;多模态对比学习&#xff08;MMCL&#xff09;最近引起了广泛关注&#xff0c;因为它在视觉任务上的表现优于其他方法&#xff0c;这些方…

ASP.NET dotnet 3.5 实验室信息管理系统LIMS源码

技术架构&#xff1a;ASP.NET dotnet 3.5 LIMS作为一个信息管理系统&#xff0c;它有着和ERP、MIS之类管理软件的共性&#xff0c;如它是通过现代管理模式与计算机管理信息系统支持企业或单位合理、系统地管理经营与生产&#xff0c;最大限度地发挥现有设备、资源、人、技术的…

Apifox 关于token的使用方式

前言&#xff0c;关于token的使用&#xff0c;仅做了简单的demo测试token效果。 1.手动登录获取token 顾名思义&#xff0c;因为只有登录之后才有token的信息&#xff0c;所以在调用其他接口前需要拥有token才能访问。 操作步骤 1)添加环境变量、全局参数 这里拿测试环境举…

vue基础 组合式和响应式 模板语法 计算属性

模板语法 | Vue.js 根据文档 组合式和响应式 响应式 响应api单网页实例式 组合式 组合式api单网页实例 模板语法 文本插值 {{msg}} 最基本的数据绑定形式是文本插值&#xff0c;它使用的是“Mustache”语法 (即双大括号)&#xff1a; <script setup> import {onMo…

Promethues(五)查询-PromQL 语言-保证易懂好学

一、介绍 普罗米修斯提供了一种称为PromQL&#xff08;普罗米修斯查询语言&#xff09;的函数式查询语言&#xff0c;允许用户实时选择和聚合时间序列数据。 表达式的结果可以显示为图形&#xff0c;在 Prometheus 的表达式浏览器中显示为表格数据&#xff0c;也可以通过 HTT…

EMQX的docker部署与使用(mqtt)

1&#xff1a;先创建一个挂载emqx的目录 2&#xff1a;docker拉去emqx docker pull emqx/emqx:latest2-1&#xff1a;先启动一次eqmx&#xff0c;然后停止&#xff0c;删除容器 docker run -d --name emqx --privilegedtrue -p 1883:1883 -p 8883:8883 -p 8083:8083 -p 8084…

Spring Bean生命周期图扩展接口介绍spring的简化配置

目录 1. 生命周期简图 2. 扩展接口介绍 2.1 Aware接口 2.2 BeanPostProcessor接口 2.3 InitializingBean 2.4 DisposableBean 2.5 BeanFactoryPostProcessor接口 3. spring的简化配置 3.1 项目搭建 3.2 Bean的配置和值注入 3.3 AOP的示例 1. 生命周期简图 2. 扩展接…

Mobileye CEO来华:只有能控制住成本的公司,才能活下来

‍作者|德新 编辑|王博 上午9点近一刻&#xff0c;Mobileye CEO Amnon Shuashua步入酒店的会议室。由于Amnon本人是以色列希伯来大学的计算机科学教授&#xff0c;大部分人更习惯称他为「教授」。 时近以色列的新年&#xff0c;这趟教授的中国之行安排十分紧凑。 他率领了一…

IP地址在各行业中的应用场景

1、互联网交易、支付反欺诈 通过分析IP应用场景、IP地址的出现位置的离散程度、分布情况综合用户行为及时间判断IP地址风险程度&#xff0c;过滤机器流量。在登陆、交易、支付等多个环节结合多重验证等技术减少欺诈行为。 2、P2P平台反“羊毛党” 通过分析IP应用场景、位置信…

得帆云“智改数转,非同帆响”-AIGC+低代码PaaS平台系列白皮书,正式发布!

5月16日下午&#xff0c;由上海得帆信息技术有限公司编写&#xff0c;上海市工业互联网协会指导的以“智改数转&#xff0c;非同帆响”为主题的《得帆云 AIGC低代码PaaS平台系列白皮书》正式在徐汇西岸国际人工智能中心发布。 本次发布会受到了上海市徐汇区政府、各大媒体和业内…

c刷题(四)

获得月份天数 获得月份天数_牛客题霸_牛客网 这道题可以用switch case语句解&#xff0c;不过这道题更简单的方法是数组&#xff0c;关键点在于判断是否为闰年。 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<assert.h> int year_run(int n) …

Go 异常处理

代码在执行的过程中可能因为一些逻辑上的问题而出现错误 func test1(a, b int) int {result : a / breturn result } func main() {resut : test1(10, 0)fmt.Println(resut) }panic: runtime error: integer divide by zero goroutine 1 [running]: …