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

news2024/11/17 13:41:11

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) {
        // 创建JWT
        String jwt = createJWT("1234567890", "John Doe");

        System.out.println("Generated JWT: " + jwt);

        // 验证JWT
        Claims 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.");
        }
    }

    // 创建JWT
    private static String createJWT(String subject, String name) {
        return Jwts.builder()
                .setSubject(subject)
                .claim("name", name)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 验证JWT
    private 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.coloradmin.cn/o/1118691.html

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

相关文章

S7-1200通过CM CANopen模块与KINCO伺服连接

CM CANopen模块简介 CM CANopen模块&#xff08;Profinet转CANopen&#xff09;来自瑞典HMS &#xff0c;由西 门子授权HMS公司开发&#xff0c;与S7-1200完美兼容。 可做为S7-1200与CANopen/CAN设备之间的桥梁&#xff0c;能够联接任意 CANopen或CAN 2.0A设备到SIMATIC S7-1…

聊聊分布式架构10——Zookeeper入门详解

目录 01ZooKeeper的ZAB协议 ZAB协议概念 ZAB协议基本模式 消息广播 崩溃恢复 选举出新的Leader服务器 数据同步 02Zookeeper的核心 ZooKeeper 的核心特点 ZooKeeper 的核心组件 选举算法概述 服务器启动时的Leader选举 服务器运行期间的Leader选举 03ZooKeeper的…

PT100温度传感器

热电阻是中低温区&#xfe61;常用的一种温度检测器。它的主要特点是测量精度高&#xff0c;性能稳定。其中铂热电阻的测量精确度是&#xfe61;高的&#xff0c;它不仅广泛应用于工业测温&#xff0c;而且被制成标准的基准仪。金属热电阻的感温元件有石英套管十字骨架结构&…

智能洗地机哪个牌子好用?智能洗地机品牌排行榜

为了偷懒人类发明了扫把、拖把等手动清洁工具&#xff0c;随着技术的进步出现了吸尘器、扫地机器人等等智能产品&#xff0c;近几年洗地机又以快速、直接、高效对市场进行了“颠覆”&#xff0c;如何快速在洗地机市场中挑选到适合自己的智能洗地机呢&#xff0c;我们一起来看看…

2023-10-18 LeetCode每日一题(执行 K 次操作后的最大分数)

2023-10-18每日一题 一、题目编号 2530. 执行 K 次操作后的最大分数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的…

node快速搭建一个学习资料共享平台

概述 本文要实现的功能比较简单&#xff1a;1、将想要共享的文件分文件夹的组织起来&#xff1b;2、别人可以通过界面进行搜索&#xff1b;3、可以在线预览或下载文件。基于这样的需求&#xff0c;本文分享通过node如何实现这样的功能。 实现效果 实现 1. node端服务 node端…

QT 操作Windows系统服务

Windows服务是在Windows操作系统上运行的后台应用程序&#xff0c;它们在系统启动时自动启动&#xff0c;并在后台持续运行&#xff0c;不需要用户交互。Windows服务的作用包括但不限于以下几个方面&#xff1a;1. 提供系统功能&#xff1a;许多Windows服务提供了系统级的功能和…

【Java题】实现继承和多态的例子

一&#xff1a;题目 1.员工类Employee&#xff1a; &#xff08;1&#xff09;私有成员变量&#xff1a;姓名&#xff0c;年龄&#xff0c;工资 &#xff08;2&#xff09;提供无参&#xff0c;有参构造 &#xff08;3&#xff09;成员方法&#xff1a;work()方法——员工工作 …

【算法|动态规划No.28】leetcode1312. 让字符串成为回文串的最少插入次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

lv8 嵌入式开发-网络编程开发 19 原始套接字

目录 1 链路层原始套接字用法 1.1 利用原始套接字实现类似wireshark的功能 1.2 利用原始套接字实现ping命令 2 网络层原始套接字用法 2.1 TCP原始套接字用法 1 链路层原始套接字用法 Linux中的原始套接字&#xff08;Raw Socket&#xff09;是一种高级套接字类型&#xff…

YOLOv5涨点必备!改进损失函数EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

目录 一&#xff0c;改进损失函数的作用 二&#xff0c;具体实现 一&#xff0c;改进损失函数的作用 YOLOv5损失函数的作用是衡量预测框与真实框之间的差异&#xff0c;并根据这些差异来更新模型的参数。它帮助模型学习如何准确地检测和定位目标物体&#xff0c;从而提高检测…

【分类讨论】CF1747D

Problem - D - Codeforces 题意 思路 一看这个做法一定就是分类讨论 先判无解 显然&#xff0c;如果区间异或和不是0一定无解 如果区间内全是0&#xff0c;答案一定是0 之后怎么讨论 注意到需要讨论区间长度 如果长度是奇数&#xff0c;那么直接操作即可&#xff0c;答…

【PyTorch】深度学习实践 1. Overview

目录 人工智能概述 课程前置知识 人工智能 问题分类 推理类 预测类 算法分类 传统算法与智能算法 人工智能领域细分 学习系统的发展 基于规则的系统 经典机器学习算法 表示学习方法 维度诅咒 说明 解决方法 第一代 第二代&#xff08;深度学习&#xff09; 传统…

数据结构: 红黑树

目录​​​​​​​ 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色&#xff0c;将其都改为黑色即可,然后向上调整 2.如果p红&#xff08;u黑/u不在&#xff09;&#xff0c;这时候左子树两红&#xff0c;于是给右子树一个红&#xff08;旋转变色&#xff09; 2.1…

华为ICT——第四章深度学习和积卷神经

接第三章的末尾&#xff1a; 目录 接第三章的末尾&#xff1a; 1&#xff1a;自适应阈值分割&#xff1a; 2&#xff1a;形态处理&#xff1a; 4&#xff1a;膨胀&#xff1a; 5&#xff1a;腐蚀 6&#xff1a;开运算 7&#xff1a;闭运算 8&#xff1a;特征描述子 9&#xf…

看《软能力》的读后感

最近在图书大夏看了一本书的一部分&#xff0c;书名是《软能力》。本人看到了几个有意思的观点。一是接一些兼职项目。 二是分享自己的技术&#xff0c;让同事能干自己的工作&#xff0c;让自己的工作变得别人也能干&#xff0c;才有机会让自己的职位提升。 三是让手动操作变…

Linux实战——网络连接模式的三种模式

Linux可以分为三种网络模式&#xff1a; 桥接模式 &#xff08;vmnet0) 仅主机模式 (vmnet1) NAT模式 (vmnet8) 当我们下载了vmware之后&#xff0c;在电脑会出现两个虚拟网卡&#xff0c;VMware Network Adapter VMnet1、VMware Network Adapter VMnet8。 可以通过查找 控…

巡检管理系统哪一款简单实用?如何解决传统巡检难题,实现高效监管?

在电力、燃气、水务等公共服务领域&#xff0c;线路巡检工作是保障公众安全、避免事故发生的重要环节。然而&#xff0c;传统的巡检方式存在一些显著的问题&#xff0c;可能会对公共安全和稳定运行产生不利的影响。为了解决这些问题&#xff0c;需要一种能够实现高效、精准的线…

多线程环境下如何安全的使用线性表, 队列, 哈希表

小王学习录 今日鸡汤安全使用ArrayList安全使用队列安全使用HashMap 今日鸡汤 安全使用ArrayList 使用synchronized锁或者reentrantLock锁使用CopyOnWriteArrayList(COW写时拷贝)类来代替ArrayList类. 多个线程对CopyOnWriteArrayList里面的ArrayList进行读操作, 不会发生线程…