渗透测试--JWT攻防(一)

JWT简介

JWT代表JSON Web Token,它是一种用于安全地在不同实体之间传递信息的开放标准(RFC 7519)。JWT通常用于身份验证和授权领域,以及在网络应用程序和服务之间传递声明(claims)信息。
JWT的常见用途包括在身份验证流程中生成令牌,将用户信息传递给Web应用程序,以及在不同的服务之间进行身份验证和授权。由于JWT是自包含的,不需要在服务器端存储会话信息,因此它们适用于分布式系统和微服务架构。

JWT结构

JWT的结构是一个紧凑的、自包含的文本字符串,它由三个部分组成,这些部分使用点号(.)分隔开来,分别是HeaderPayloadSignature

1.Header

头部通常包含了关于令牌的元信息,例如使用的加密算法。这部分使用Base64编码,但未加密。header中有两个指定的字段:algtyp

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

alg(Algorithm):指定用于对JWT进行签名的加密算法。在这里,使用了HS256,它代表HMAC SHA-256算法,一种常见的对称加密算法。
typ(Type):指定令牌的类型,通常设置为"JWT"表示这是一个JSON Web Token。

2.Payload

载荷(Payload):载荷包含了一些声明(claims),这些声明描述了实体(通常是用户)和其他数据。有三种类型的声明:

  • 注册声明(Registered claims):这些是预定义的标准声明,例如iss(发行者)、sub(主题)、exp(过期时间)等。
  • 私有声明(Private claims):这些声明是由用户定义的,用于在双方之间共享信息。
  • 公共声明(Public claims):这些声明用于共享信息,但它们应该是在被定义时以公开方式可用的,以避免冲突。
{"sub": "1234567890","name": "tuboshusec","iat": 1697790142
}

在这个示例中,JWT的载荷部分是一个JSON对象,包含了一些声明(claims):

  • sub(Subject):表示令牌的主题,通常是用户的唯一标识符,如用户ID。
  • name:包含有关用户的姓名信息。
  • iat(Issued At):指定令牌的签发时间,以 UNIX 时间戳表示。

3.Signature

签名(Signature):签名部分用于验证令牌的完整性和真实性。它使用头部中指定的加密算法(如HMAC SHA256或RSA)对头部和载荷部分进行签名,以确保它们在传输过程中未被篡改。

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

这个示例使用HMAC SHA-256算法生成JWT的签名,其中:

  • base64UrlEncode(header) 表示对JWT头部的Base64 URL编码。
  • base64UrlEncode(payload) 表示对JWT载荷的Base64 URL编码。
  • secret 是用于生成签名的密钥。
    生成的签名(Signature)示例(使用假设的密钥):
    3DyCO9ZQpXGbp7ZhSJxKQAWKz-dDWy2oGmjNRhzd_6I
    现在,将这些部分组合在一起形成一个完整的JWT,使用点号分隔各个部分:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InR1Ym9zaHVzZWMiLCJpYXQiOjE2OTc3OTAxNDJ9.f9B4-JRPyMGMiL2syuhuB9k0mZV4mhTN72MZesAn-tQ

这是一个完整的JWT,包括头部、载荷和签名部分。JWT的实际用途是在身份验证和授权流程中传递信息,并确保令牌的完整性和真实性。在实际应用中,密钥将用于生成和验证签名部分。可以看到JWT是base64编码的,并不是加密的,所以JWT可以被解密。

JWT解密

该网站可进行JWT在线加解密
https://jwt.io/
image.png

JWT工作原理

生成令牌:

  • 创建头部(Header):首先,选择一个加密算法(例如HS256或RS256),并将其与令牌类型(通常是"JWT")组成头部。头部通常以JSON格式表示,并使用Base64 URL编码。
  • 创建载荷(Payload):在载荷中,包含声明(claims)信息,这些声明可以是注册声明、私有声明或公共声明。注册声明包括标准字段如iss(发行者)、sub(主题)、exp(过期时间)等,而私有声明用于应用程序特定信息。载荷也以JSON格式表示,并使用Base64 URL编码。
  • 生成签名(Signature):签名是用于验证令牌的完整性和真实性的关键部分。签名的生成依赖于选择的加密算法和一个密钥。通常,签名由将头部和载荷组合在一起,并使用密钥进行签名的过程生成。
  • 组合三部分:将头部、载荷和签名用点号分隔并组合成一个JWT字符串。

传输和验证令牌:

  • 传输令牌:JWT可以在网络请求的标头、URL参数或请求体中传输。它通常被发送给服务或资源,以证明用户的身份或授权访问。
  • 接收令牌:接收方接收到JWT后,将其分成头部、载荷和签名三个部分。
  • 验证签名:接收方使用与生成令牌时相同的加密算法和密钥,将头部和载荷部分重新组合,然后生成一个新的签名。接着,将新生成的签名与原始JWT中的签名进行比较。如果签名匹配,那么JWT是有效的。如果签名不匹配,JWT被认为是无效的,或者可能已被篡改。
  • 验证声明:接收方还可以验证载荷中的声明,例如检查令牌是否过期(通过比较"exp"声明与当前时间)以及其他声明来确保授权和身份验证操作的有效性。

JWT的工作原理允许在不同服务之间传递身份验证和授权信息,而无需在服务器端存储会话状态。这使得JWT在分布式系统和微服务架构中非常有用。同时,使用正确的安全实践和保护密钥是确保JWT安全性的关键部分。

JAVA

在java中JWT库可以很容易实现JWT签名和验证
使用JWT库要在Maven或Gradle中添加依赖,在Maven中,可以将以下依赖添加到pom.xml文件中:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> <!-- 请根据实际情况更新版本 -->
</dependency>

这是一个简单的JWT签名和验证的示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;public class JwtExample {// 密钥,实际应用中应该保护好密钥,不要硬编码在代码中private static final String SECRET_KEY = "mySecretKey";public static void main(String[] args) {// 创建JWTString jwt = createJWT("1234567890", "John Doe");System.out.println("Generated JWT: " + jwt);// 验证JWTClaims claims = parseJWT(jwt);if (claims != null) {System.out.println("Subject: " + claims.getSubject());System.out.println("Name: " + claims.get("name"));} else {System.out.println("JWT verification failed.");}}// 创建JWTprivate static String createJWT(String subject, String name) {return Jwts.builder().setSubject(subject).claim("name", name).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}// 验证JWTprivate static Claims parseJWT(String jwt) {try {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwt).getBody();} catch (Exception e) {// 验证失败return null;}}
}

在上面的示例代码中使用jwt库进行JWT的签名和验证,首先构建了一个JWT,然后将其分离为Header、Payload和Signature三部分,使用parseClaimsJws函数对JWT进行解析和验证,从而获取其中的Payload中的信息并进行验证.

JWT攻击思路

一:伪造令牌

我们这里用burpsuite的靶场进行学习:
靶场地址:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-unverified-signature
image.png
这是提示,告诉我们要做什么
image.png
image.png
image.png
账号密码为wiener/peter
image.png
登录
image.png
bp里有这样的数据包
image.png
可以看到session是一个标准的JWT形式,直接解密看看
image.png
我们把中间紫色部分即payload部分sub用户改成administrator,然后编码一下替换原版的payload部分,注意编码的时候别有空格哦
image.png
image.png
题目要求访问/admin路径
image.png
有两个删除用户的接口,进行删除操作
image.png
image.png
删除成功,这道题就是我们利用JWT可以被解密的特性,伪造了administrator用户的JWT,实现从普通用户到administrator权限的一个越权操作。

二:签名用None

靶场地址:
https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-flawed-signature-verification
image.png
还是一样的要求,要删除carlos用户,和上一题一样的操作,登录进来先
image.png
image.png
看似和上题一样的数据包,尝试替换administrator的payload,伪造JWT去请求/admin
image.png
image.png
这里返回了401,这里就是和上一题不一样的地方,解决方法也很简单。去解密一下JWT的第一部分即header部分
image.png
将alg至为none再进行编码替换
image.png
再进行一步URL编码
image.png
此时再替换header,并将SIGNATURE签名去掉,只留下header和payload部分
image.png
这时返回200,也返回了删除用户的接口,拿着伪造后的JWT访问接口
image.png
image.png
成功通关,这一关是利用了如果"alg"字段设为"None",则标识不签名,这样一来任何token都是有效的,设定该功能的最初目的是为了方便调试,但是若不在生产环境中关闭该功能,攻击者可以通过将alg字段设置为"None"来伪造他们想要的任何token,接着便可以使用伪造的token冒充任意用户登陆网站

***************未完待续

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

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

相关文章

【Redis】主从复制

目录 单点问题主从模式如何启动多个redis-server建立主从关系断开连接安全性只读传输延迟拓扑结构一主一从一主多从树型结构 主从复制的基本流程replicationid的作用offset的作用全量复制和部分复制全量复制的无硬盘模式关于runid和replid部分复制实时复制 单点问题 如果某个服…

07-React-redux和redux的使用

07.react-redux和redux的使用 1.redux的使用 1).redux的理解 a.redux是什么 redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。作用: 集中式管理react应用中多个组件共享的状态。 b.什么情况下需要使…

Lake Formation 和 IAM 之间的区别与联系

IAM 和 Lake Formation 都是 AWS 上的权限管理服务,且默认都是自动开启并生效的,只是如果你没有特别配置过它们,可能感觉不到它们的存在,特别是Lake Formation(后文简写为 LF),通常情况下都是“透明”的,但它确实在每次请求时进行了权限检查。本文会详细介绍一下两者之…

CPU飙高问题排查命令

1. 远程客户端连接服务器,top命令查看cpu占用最高的进程id 2. (top -H -p 进程pid) 命令: 找出进程里面线程占用CPU高的线程有哪些 ? 3. (printf 0x%x\n 线程id) 线程id转16进制 4. (./jstack PID | grep TID(十六进制) -A 30)

【rust/树莓派】使用rppalembedded-graphics控制st7789 LCD屏幕

说在前面 树莓派版本&#xff1a;4bLCD模块&#xff1a;ST7789V2 240*280 LCD树莓派系统&#xff1a;Linux raspberrypi 5.15.76-v8 #1597 SMP aarch64 GNU/Linuxrust版本&#xff1a;rustc 1.73.0 模块详情 某雪的1.69inch LCD模块&#xff0c;包含杜邦线 准备工作 树莓派…

Unity中Shader实现UI流光效果

文章目录 前言一、实现思路1&#xff1a;1、采集两张贴图&#xff0c;一张是主纹理&#xff0c;一张是扫光纹理2、在 v2f 定义一个二维变量 “uv2” 来存放 uv 偏移后的值3、在顶点着色器中&#xff0c;仿照之前的 uv 流动效果,与 _Time相乘后存放于 uv2 中4、最后&#xff0c;…

【Machine Learning】02-Advanced Learning Algorithms

02-Advanced Learning Algorithms 2. Advanced Learning Algorithms2.1 Neural Network2.1.1 概述2.1.2 Neural network model2.1.3 TensorFlow的实现2.1.4 Neural network implementation in Python2.1.5 强人工智能&#xff08;AGI&#xff09; 2.2 Vectorization2.2.1 矩阵使…

华山论剑:2nm芯片工艺谁更强?

在当今高速发展的科技时代&#xff0c;芯片工艺的重要性不言而喻。芯片制造技术不断突破&#xff0c;使得电子产品性能更高、功能更强大&#xff0c;同时也推动了整个科技行业的快速发展。本文探讨下三星、台积电和英特尔三大芯片制造巨头的工艺技术。 英特尔未来几年的主要目标…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器&#xff0c;免去使用开发板。 Wokwi提供基于浏览器的界面&#xff0c;您可以通过这种简单直观的方式快速开发一个…

golang查看CPU使用率与内存及源码中的//go:指令

golang查看CPU使用率与内存 1 psutil 1.1 概念与应用场景 psutil是业内一个用于监控OS资源的软件包&#xff0c;目前已经多种语言&#xff0c;包括但不限于Python、Go。 gopsutil是 Python 工具库psutil 的 Golang 移植版&#xff0c;可以帮助我们方便地获取各种系统和硬件信…

Scrum 敏捷管理流程图及敏捷管理工具

​敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示&#xff0c;以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例&#xff1a; 转自&#xff1a;Leangoo.com 免费敏捷工具 这个流程图涵盖了Scrum框架的主要阶段和活动&#xff0c;其中包括…

vue中使用coordtransform 互相转换坐标系

官方网站&#xff1a;https://www.npmjs.com/package/coordtransform 在使用高德sdk时&#xff0c;其返回的坐标在地图上显示时有几百米的偏移&#xff0c;这是由于高德用的是 火星坐标&#xff08;GCJ02&#xff09;&#xff0c;而不是wgs84坐标。为了消除偏移&#xff0c;将G…

Java面试题-UDP\TCP\HTTP

UDP UDP特性 &#xff08;1&#xff09;UDP是无连接的&#xff1a;发送数据之前不需要像TCP一样建立连接&#xff0c;也不需要释放连接&#xff0c;所以减少了发送和接收数据的开销 &#xff08;2&#xff09;UDP 使用尽最大努力交付&#xff1a;即不保证可靠交付 &#xff0…

思维模型 上瘾模型(hook model)

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。你到底是怎么上瘾&#xff08;游戏/抖音&#xff09;的&#xff1f;我们该如何“积极的上瘾”&#xff1f;让我们来一切揭晓这背后的秘密。 1 上瘾模型的应用 1.1上瘾模型的积极应用 1 学…

【Java 进阶篇】深入理解 Bootstrap 导航条与分页条

Bootstrap 是一个强大的前端框架&#xff0c;为网页和应用程序开发提供了丰富的组件和工具。其中&#xff0c;导航条和分页条是两个常用的组件&#xff0c;用于创建网站的导航和分页功能。本篇博客将深入探讨 Bootstrap 导航条和分页条的使用&#xff0c;适用于那些希望提升网页…

Spring framework Day24:定时任务

前言 在我们的日常生活和工作中&#xff0c;时间管理是一项至关重要的技能。随着各种复杂任务的增加和时间压力的不断增加&#xff0c;如何更好地分配和利用时间成为了一项迫切需要解决的问题。在这样的背景下&#xff0c;定时任务成为了一种非常有效的解决方案。 定时任务&a…

【Java 进阶篇】深入了解 Bootstrap 组件

Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的组件&#xff0c;用于创建各种网页元素和交互效果。这些组件可以帮助开发者轻松构建漂亮、响应式的网页&#xff0c;而无需深入的前端开发知识。在本文中&#xff0c;我们将深入探讨 Bootstrap 中一些常用的组件&#x…

python随手小练6

1、汉诺塔 汉诺塔&#xff1a;汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放…

LABVIEW 安装教程(超详细)

目录 LabVIEW2017&#xff08;32/64位&#xff09;下载地址&#xff1a; 一 .简介 二.安装步骤&#xff1a; LabVIEW2017&#xff08;32/64位&#xff09;下载地址&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1eSGB_3ygLNeWpnmGAoSwcQ 密码&#xff1a;gjrk …

Vue--》简易资金管理系统后台项目实战(后端)

今天开始使用 node vue3 ts搭建一个简易资金管理系统的前后端分离项目&#xff0c;因为前后端分离所以会分两个专栏分别讲解前端与后端的实现&#xff0c;后端项目文章讲解可参考&#xff1a;前端链接&#xff0c;我会在前后端的两类专栏的最后一篇文章中会将项目代码开源到我…