JWT 安全及案例实战

文章目录

  • 一、JWT (json web token)安全
    • 1. Cookie(放在浏览器)
    • 2. Session(放在服务器)
    • 3. Token
    • 4. JWT (json web token)
      • 4.1 头部
        • 4.1.1 alg
        • 4.1.2 typ
      • 4.2 payload
      • 4.3 签名
      • 4.4 通信流程
    • 5. 防御措施
  • 二、漏洞实例(webgoat)
    • 1. 第四关
    • 2. 第五关
    • 3. 第七关

一、JWT (json web token)安全

1. Cookie(放在浏览器)

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

2. Session(放在服务器)

​ session从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方带定有某种特征(长相等)表明他就是张三。
session也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用cookie的方式。
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

3. Token

​ 在Web领域基于Token的身份验证随处可见.在大多数使用Web API的互联网公司中,tokens是多用户下处理认证的最佳方式。
​ 以下几点特性会让你在程序中使用基于Token的身份验证

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

4. JWT (json web token)

image-20230913192812130

JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)、签名(Signature):头部(Header):头部通常由两部分组成,算法类型和令牌类型。算法类型:指定用于生成签名的算法,例如HMAC、RSA或者ECDSA。令牌类型:指定令牌的类型,常见的是JWT头部使用Base64Url编码表示,并作为整个JwT的第一部分。头部的一个示例:
{
"alg":"Hs256",none #默认alg是未加密的,加上none后不加密
"typ":"JwT"
}载荷(Payload):载荷存储了有关用户或实体的声明和其他有关信息。声明:如用户ID、角色、权限等信息注册声明:包含一些标准的声明(比如发行人、过期时何等)和一些自定义的声明。载荷也使用Base64Url编码表示,并作为整个JWT的第二部分。载荷的一个示例:
{"sub": "1234567890","name": "John Doe","iat": 1516239022
}签名(Signature):签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整性和真实性。签名生成方式:将头部和载荷进行 Base64Url 编码后拼接在一起,然后使用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中。

4.1 头部

4.1.1 alg

是说明这个 JWT 的签名使用的算法的参数,常见值用 HS256(默认),HS512 等,也可以为

None。HS256 表示 HMAC SHA256。

4.1.2 typ

说明这个 token 的类型为 JWT

4.2 payload

payload载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明(建议但不强制使用):

  • iss:jwt签发者
  • sub:jwt所面向的用户
  • aud:接收jwt的一方
  • exp:jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf:定义在什么时间之前,该jwt都是不可用的.
  • iat:jwt的签发时间
  • jti:jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

4.3 签名

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

4.4 通信流程

image-20230913095945537

第一步:使用用户名和密码进行登录

第二步:服务器认证成功后创建一个加密的 JWT的cookie

第三步:服务器返一个 JWT给浏览器

第四步:浏览器发送 JWT给服务器

第五步:服务器检查 JWT,从JWT中获取用户信息

第六步:服务器向客户端发送响应

5. 防御措施

  1. 使用强大的密钥和算法:选择足够强大的加密算法和密钥长度,如HMAC-SHA256或RSA-2048等。使用长而随机的密钥可以增加JWT的安全性,并提高防止暴力破解和字典攻击的能力。
  2. 令牌有效期限制:设置合理的令牌过期时间。较短的过期时间可以减少令牌被滥用的风险。定期刷新和更新过期的令牌可以确保令牌的时效性和安全性。
  3. 验证令牌签名和完整性:在接收到JWT后,验证令牌的签名和完整性以确保其真实性。检查签名时使用的密钥和算法必须与发放JWT的一方保持一致。
  4. 避免在JWT中存储敏感信息:尽量避免在JWT的载荷中存储敏感信息,如密码、社会安全号码等。如果必须存储敏感信息,应使用加密技术对其进行加密。
  5. 加密敏感信息:如果需要在JWT中传输敏感信息,应使用加密算法对其进行加密。在加密前,确保选择合适的加密算法,并采取适当的密钥管理措施,确保加密信息的安全性。
  6. HTTPS传输:始终使用HTTPS来传输JWT,以保护令牌在传输过程中的安全性。HTTPS提供了端到端的加密传输,防止令牌被窃听或篡改。
  7. 令牌刷新和撤销机制:实施令牌刷新和撤销机制,以应对丢失、泄露或被盗用的令牌。可以使用黑名单、短有效期令牌或存储令牌的数据库来实现这些机制。
  8. 令牌审计和监控:建立令牌审计和监控系统,对令牌的使用进行监测和追踪。这有助于及时发现任何异常活动或未经授权的令牌使用。
  9. 密钥安全管理:安全地管理和存储用于签名和验证JWT的密钥。密钥应该存放在受保护的环境中,访问权限应限制在必要的人员范围内。

二、漏洞实例(webgoat)

启动靶场

java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=本机ip

注意大小写

访问

127.0.0.1:8888/WebGoat

image-20230913202906224

1. 第四关

页面给出的要求是成为管理员,并重置投票结果

image-20230913203713825

点击小人像选择一个用户,再点击删除键。然后使用bp抓包

image-20230913203842860

image-20230913204059149

获得 JWT:

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2OTU0NzI3OTYsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.P0RGe6YEKWHBk22JJ3ug9kbWxcb97Ca8mLVV_EQza5AjvkVS6RsKRwitBqnx--WLRBdHbmwN_zPySBDK_MIKjw

使用jwt.io解密 JWT

image-20230913204313318

使用JSON校验格式化工具将修改过的 JWT 数据(payload中admin 修改为 true,header中加密方式修改为 none)进行base64加密

修改payload内容并进行加密

image-20230913204731290

修改过内容的payload经过base64加密的结果要在两点之间,两点不可删除

image-20230913204809826

注意:不要删除或修改原有格式

修改header内容并进行加密

image-20230913205143540

修改过内容的header经过base64加密的结果要在点之前,点不可删除

image-20230913205336473

因为头部的加密方式改为了none,那么签名就没有意义了。舍弃签名将修改过的JWT复制到bp的数据包中。注意payload和签名之间的点不能丢弃

ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNjk1NDcyNzk2LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0.

image-20230913205852899

image-20230913205930724

2. 第五关

题目要求在给出的令牌中找到密钥,改变用户为WebGoat并使用找到的密钥加密签名

image-20230913211042652

在页面中点击F12,选中给出的令牌

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY5NDYxMzY3MSwiZXhwIjoxNjk0NjEzNzMxLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.TMb4Of0VRzFWfyVtmpxCVpLIrrmKwnAPM-7juWw9_qA

将令牌复制到jwt.io中解密

image-20230913211911818

在Unix时间戳中修改 exp 有效时间

image-20230913194937736

image-20230913212042747

1694697596

image-20230913212236938

image-20230913212416775

爆破密钥

将题目给出的令牌复制到桌面下的 jwt.txt 中,并子啊桌面下创建密码字典 1.txt 内容包含(victory)

image-20230913212834089

使用命令爆破密钥

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 :密码字典

获得密钥:victory

image-20230913215654243

使用爆破出的密钥加密签名

image-20230913215846759

将得出的结果提交

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY5NDYwODEwNywiZXhwIjoxNjk0Njk3NTk2LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IldlYkdvYXQiLCJFbWFpbCI6InRvbUB3ZWJnb2F0Lm9yZyIsIlJvbGUiOlsiTWFuYWdlciIsIlByb2plY3QgQWRtaW5pc3RyYXRvciJdfQ.hsPDzQ945fDfLUcMzDUQViFTfohikcXicLFHovNdGNk

image-20230913223952660

3. 第七关

题目要求让tom付款

image-20230913220934737

点击付款使用bp抓包

image-20230913221113063

点击here获取日志,从日志中获取jwt

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.DCoaq9zQkyDH25EcVWKcdbyVfUL4c9D4jRvsqOqvi9iAd4QuqmKcchfbU8FNzeBNF9tLeFXHZLU4yRkq-bjm7Q

使用jwt.io解码

image-20230913221404707

修改exp和加密方法

修改头中的加密方法

image-20230913221646434

image-20230913221653933

修改exp

image-20230913221726426

image-20230913221743201

因为加密方式为none那么签名就可以舍弃了

ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNTI2MTMxNDExLAogICJleHAiOiAxNjk0Njk3NTk2LAogICJhZG1pbiI6ICJmYWxzZSIsCiAgInVzZXIiOiAiVG9tIgp9.

因为抓到的数据包中没有jwt的位置那么就可以在数据包中找一个位置存放jwt,此数据包可放置在Authorization中

image-20230913222112196

image-20230913222218189

添加:

反序列化漏洞是因为链式调用

越权漏洞是因为凭证(Cookie,Session,Token,JWT)

现如今常见的都是越权和逻辑漏洞,学习JWT就是为了攻击凭证(越权)

web漏洞只有一个入口:http

authz:bp中验证越权的插件,页面有误cookie大小和响应都相同的话就是说cookie无用,存在越权

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

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

相关文章

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注:大约有5%~15%性能损耗损耗原因:表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…

windows系统安装php,运行php

一、安装php 官网&#xff1a;PHP For Windows: Binaries and sources Releases 下载最新的PHP解释器 解压好放入 C:\php 目录文件下 二、配置php 配置环境变量&#xff1a;在CMD命令提示符中输入以下命令&#xff0c;将PHP路径添加到系统环境变量中&#xff0c;以便可以在…

【第四阶段】kotlin语言集合转换与快捷转换学习

1.list可以通过转换为set进行去重 2.list转set在转list也能去重 3.使用快捷函数distinct进行去重 package Kotlin.Stage4fun main() {val list mutableListOf("java", "ktolin", "c", "java", "ktolin", "c")pr…

MyVector 的实现

myVector #include <iostream> #include <vector>int size20;using namespace std;template <typename type> class myvector {int size;type value;type *arr;public://无参构造myvector(){};//有参构造myvector(int s,type v):size(s),value(v){arrnew in…

laravel8框架-语言包的安装和配置

1, 查找 laravel框架语言包地址&#xff1a; \根目录\resources\lang\ 默认有个 en 语言包 2&#xff0c;下载 和 安装 下载地址&#xff1a;https://packagist.org/ 搜索 laravel/lang 参考网址&#xff1a;https://packagist.org/packages/overtrue/laravel-lang 选择你…

Django系列:Django简介与MTV架构体系概述

Django系列 Django简介与MTV架构体系概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132890054 【介…

【数据结构】串的定义;存储结构;基本操作的实现

欢迎光~临~^_^ 目录 知识树 1、串的定义 2、串的存储结构 2.1顺序存储 静态存储 动态存储 2.2链式存储 2.3串的堆分配存储表示 3、串的基本操作 3.1求子串 3.2比较操作 3.3定位操作 4、C语言实现串的基本操作 知识树 1、串的定义 串是由零个或多个字符组成的…

记录一次IDEA非法字符‘\ufeff‘报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

JavaScript与jQuery(下篇)

JavaScript与jQuery笔记&#xff08;下篇&#xff09; 一、获取jquery二、jquery选择器三、jquery事件四、jquery操作Dom元素————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢…

Golang Gorm 创建HOOK

创建的时候&#xff0c;在插入数据之前&#xff0c;想要做一些事情。钩子函数比较简单&#xff0c;就是实现before create的一个方法。 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" )type Student struct {ID int64Name string gorm:&q…

UDP通信

UDP通信 1、UDP2、UDP通信流程 1、UDP /* udp传输层协议&#xff0c;和tcp是一样的 特点:面向无连接的&#xff0c;不安全的&#xff0c;报式传输协议1&#xff0e;无连接:ldp通信的时候不需要connect1) 通信不需要建立连接2) 如果想给对方发送数据&#xff0c;只需要指定对方…

CRC(循环冗余校验码的校验方法)

5个关键点&#xff1a; 1.信息码&#xff1a;即给出要校验的二进制码 2.生成多项式&#xff1a;一般多项式会给&#xff0c;从最高位的指数位数就可以得到有几个校验码&#xff1b;如果没给多项式&#xff0c;肯定会给个多项式二进制码&#xff0c;根据它来推就行&#xff08;…

华为GaussDB数据库

Gauss数据库初识_高斯数据库_ygpGoogle的博客-CSDN博客 Redhat 7.6安装GaussDB_100_1.0.1详细攻略_gaussdb_100_1.0.1-database-redhat-64bit.tar.gz dow_博德1999的博客-CSDN博客 https://www.ngui.cc/el/3381579.html?actiononClick 初识GaussDB——GaussDB的发展历程、部…

Java基础(二十四):MySQL

文章目录 一、数据库&#xff08;创建、显示、删除、备份、恢复&#xff09;二、MySQL常用数据类型2.1 数值型&#xff08;整数&#xff09;2.2 数值型&#xff08;二进制bit&#xff09;2.3 数值型&#xff08;小数&#xff09;2.4 字符型2.5 日期类型 三、表结构的操作四、表…

软件设计师-UML基础教程

场景 针对UML1.5各种模型图的构成和功能进行说明。 UML概述 UML简介 UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。 适用于描述以用例为驱动&#xff0c;以体系结构为中心的软件设计的全过程。 UML的定义包括UML语义和UML表…

【CVPR2021】MVDNet论文阅读分析与总结

Challenge&#xff1a; 现有的目标检测器主要融合激光雷达和相机&#xff0c;通常提供丰富和冗余的视觉信息 利用最先进的成像雷达&#xff0c;其分辨率比RadarNet和LiRaNet中使用的分辨率要细得多&#xff0c;提出了一种有效的深度后期融合方法来结合雷达和激光雷达信号。 MV…

输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

效果视频&#xff1a;输电线路故障诊断&#xff08;Python代码&#xff0c;逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断&#xff09;_哔哩哔哩_bilibili 1.数据 仿真平台 仿真模型分别获取单相接地故障、两相接地故障、两相间短路故障、三相接地故障、…

2023年浦东新区数字化安全风险智慧管控技能比武初赛-技能题一

目录 二、技能题 2.1 MD5===MD5 三、业*&&&务**&&联&&&*&&系 二、技能题 2.1 MD5===MD5