JWT(Json Web Token)的原理、渗透与防御

news2025/1/20 10:43:59

在这里插入图片描述
(关于JWT kid安全部分后期整理完毕再进行更新~2023.05.16)

JWT的原理、渗透与防御

目录

  • JWT的原理、渗透与防御
    • 含义
    • 原理
      • JWT的起源
      • 传统session认证问题
      • token与session区别
      • JWT的结构与内容
    • JWT的攻击和渗透
      • 敏感信息泄露
      • 空密钥破解
      • 密钥爆破
      • CVE-2019-7644
    • JWT防御

含义

JWT全称为Json web token,是为了在网络应用环境间传递声明而执行的一中基于JSON的开放标准。常用于分布式站点的单点登录。
JWT的声明一般被用在客户端与服务端之间传递身份认证信息,便于向服务端请求资源。

(我理解就是token验证的一种数据格式)

原理

  1. 客户端提交用户名密码等信息到服务端请求登录,服务端在验证通过后前发一个具有时效性的token,将token返回给客户端

  2. 客户端收到token后会将token存储在cookie或localStorage中

  3. 随后客户端每次请求都会携带这个token,服务端收到请求后校验该token并在验证通过后返回对应资源

JWT的起源

有需求必然有其存在的道理,关于JWT的出现要先理解一下什么是传统session认证。
session认证
解决http协议本身并不能记录状态问题,session在每一次会话开始时产生,用于存放会话信息,每个session以键值对的方式生成(session_id=session),将session_id以cookie的形式(set-cookie)返回给客户端,客户端再次请求时携带session_id,服务端根据session_id使用对应的session作为认证信息为客户端响应对应服务。

听起来好像和JWT的原理差不多?不都是每一次会话的身份信息服务端发给客户端,存储在cookie当中,只是存储格式的差异么,一个是键值对,一个是json(严谨来说json也是键值对)。不急,继续往下读。

传统session认证问题

  • 服务端开销问题:由于认证信息存储在服务端,当认证用户量增加时,服务端开销会明显增大。
  • 扩展性不佳:由于存储在服务器端,意味着后续的请求也必须是在同一台服务器上才能响应对应资源,对于分布式应用,限制了负载均衡的能力以及应用扩展能力。
  • CSRF攻击:由于存储在浏览器cookie中,CSRF攻击时,网站校验浏览器中cookie后会认为时用户本人操作。

token与session区别

由上面的原理来看其实两者是十分类似的,但实际上,session的认证信息是存储在服务端,客户端的session_id仅仅是session的标识符,而token本身就是携带认证信息的。而且由于token是可以通过一定的手段在请求时与cookie分离独立出一个首部字段,故token是可以防御csrf攻击的。其二token机制服务端是不存储相关认证信息的,只是对token做解密并根据解密信息查询用户信息,故对于服务端的开销更小,也更利于分布式服务器应用的扩展。

由此可以总结出来,JWT的优点,或者说相比session,token的优点主要有下面两点:

  • 能存储更多认证信息,为服务器减轻负担。
  • 可以与cookie分离出来,单独一个首部字段,防御csrf攻击。

JWT的结构与内容

结构:一般是一段eyJ开头,由英文点分割开的三段字符
在这里插入图片描述
三段字符串分别对应:

  1. Header:加密算法与Token类型;
    对应部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  2. Payload:用户信息和附加信息的声明,一般是Json类型的键值对;
    对应部分:eyJsZXZlbCI6ImFkbWluIiwicGFzc3dvcmQiOiIyYWM5Y2I3ZGMwMmIzYzAwODNlYjcwODk4ZTU0OWI2MyIsInVzZXJuYW1lIjoiam9lIn0
  3. Signature:
    ①base64编码后的Header
    ②base64编码后的Payload
    ③签名加密算法私钥。
    对应部分:6j3NrK-0C7K8gmaWeB9CCyZuQKfvVEAl4KhitRN2p5k
    通过base64解码或者通过https://jwt.io/来专门处理JWT结构。
    在这里插入图片描述

JWT的攻击和渗透

当你在请求包中发现JWT格式的token时,有以下几种渗透思路:

  1. 未授权访问:删除Token后仍然可以正常响应对应页面
  2. 敏感信息泄露:通过JWt.io解密出Payload后查看其中是否包含敏感信息,如弱加密的密码等
  3. 破解密钥+越权访问:通过JWT.io解密出Payload部分内容,通过空加密算法或密钥爆破等方式实现重新签发Token并修改Payload部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料
  4. 检查Token时效性:解密查看payload中是否有exp字段键值对(Token过期时间),等待过期时间后再次使用该Token发送请求,若正常响应则存在Token不过期
  5. 通过页面回显进行探测:如修改Payload中键值对后页面报错信息是否存在注入,payload中kid字段的目录遍历问题与sql注入问题

敏感信息泄露

JWT渗透测试站点:https://authlab.digi.ninja/Leaky_JWT
在这里插入图片描述
机翻:带签名的JMTs看起来像是机密数据,但很容易解码。当开发人员将这些放在一起时,他们只是将整个用户对象从数据库中提取出来,并将其放入令牌中,而不是只包含所需的信息。
你已经从你的受害者的本地存储器中获得了下面的令牌,解码它并使用下面的信息登录。
利用jwt.io对token进行解密,解密后的payload部分包含了类似MD5加密的密码,用MD5碰撞解密出弱口令Password1
在这里插入图片描述
在这里插入图片描述
登录成功,welcome Joe~
在这里插入图片描述

空密钥破解

测试地址:https://authlab.digi.ninja/JWT_None
在这里插入图片描述
机翻:除了允许对JWT签名使用HMAC和RSA散列算法之外,一些解析器还允许通过指定“none”来禁用散列。我从来没有在野外遇到过这种情况,但有一些活跃的库支持它所以我总是检查它以防万一,特别是当你偶尔听到它突然出现的报告,有时在最糟糕的地方!2020年4月,研究人员发现Autho容易受到这种攻击,并在博客文章中写道:Auth0身份验证API中的JSON Web令牌验证绕过。(就是说应用空密钥的情况是极少的,除非在一些应用组件中启用,所以看到的话还是测一下这个功能。)
这次要用到工具进行改包,BP上先下载一个名为“JSON Web Token Attacker”的工具,方便后续进行JWT渗透测试。下载完成后页面点击“Validate Token”抓包。
在这里插入图片描述
当请求中出现JWT格式内容时,BP会出现高亮提示,对改包进行重放看响应的信息,就是登录的用户信息。
在这里插入图片描述
在这里插入图片描述
如果随意对JWT payload进行修改,会被服务器拒绝。
在这里插入图片描述
如果修改不正确的加密方法,也会被服务器拒绝。
在这里插入图片描述
点开扩展插件JWS,payload中level修改为admin,修改用户名rdrug,点击Attacker,选择none payload进行测试,最后测试加密方式为None时,请求成功,利用空加密方式实现账户越权。
在这里插入图片描述
在这里插入图片描述

密钥爆破

测试地址:https://authlab.digi.ninja/JWT_Cracking
在这里插入图片描述
重要部分机翻:当使用HMAC生成签名时,生成签名的函数需要一个密钥。如果你能以某种方式获得该密钥,无论是从服务器上窃取、猜测还是强行使用,那么你就可以签署自己的令牌,在大多数情况下,这意味着你可以对有效负载及其包含的声明进行任何修改。

爆破工具:c-jwt-cracker、hashcat等

爆破原理:将header和payload部分用base64解码后,利用字典作为密钥进行加密与第三部分的SIGNATURE进行对比。

  • hashcat
    命令.\hashcat.exe -m 16500 -a 0 hash.txt FastPwds.txt
    hash.txt存放hash文本,FastPwds.txt存放字典文本。(hashcat的其他具体参数和使用方法这边请:https://blog.csdn.net/Samuel677/article/details/118875875)
    在这里插入图片描述
    在这里插入图片描述
  • c-jwt-cracker
    命令./jwtcrack (jwt-hash)
    在这里插入图片描述
    安装过程的坑:因为工具是c写的,在第一次编译这个工具的时候可能会报错
    在这里插入图片描述
    这时候需要
apt-get install libssl-dev

安装ssl扩展库。
如果回显找不到库的时候,先执行:

sudo apt-get update

快速检测依赖,并自动安装相关依赖。
再make进行编译,成功后会生成bin文件jwtcrack
在这里插入图片描述
从破解的密钥为"hello"后在jwy.io,使用获得的密钥重新签发token并修改Payload。
在这里插入图片描述
将生成的jwt重新发给服务端,验证通过。
在这里插入图片描述

CVE-2019-7644

测试链接:https://authlab.digi.ninja/Auth1

当篡改payload时,报错回显泄露正确的signature。攻击者可以伪造令牌以绕过身份验证和授权机制。
修改payload中的用户level后,将jwt发给服务器。回显中会暴露signature正确的值。
在这里插入图片描述
FO8ZDKSDNVnt_VB3f35_ofEMGFDTrv0dVo8hjGXDtn8替换3NdjwjYHnZz-tSsvXWeYedYzIiJpAlc0-wQgMjjnZq8,重新请求。
登录成功。
在这里插入图片描述

JWT防御

  1. 禁用空密钥算法。
  2. 编写一个方案以防万一密钥泄露。
  3. 不设置弱密钥,并密钥将密钥放在安全的地方
  4. 不允许发送方设置任意签名算法。
  5. 不在负载中放置敏感信息。
  6. 确保令牌的有效期足够短。
  7. 确保免受重放攻击。
  8. 避免在URL中发送令牌。

参考链接:
https://blog.csdn.net/cdyunaq/article/details/122561096
https://blog.csdn.net/qq_53079406/article/details/124458006

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

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

相关文章

BFT 最前线 |文心一言推出内测专用独立App,谷歌发布 AI 网络安全套件,腾讯机器人业务新突破:自研灵巧手与机械臂首次亮相

文 | BFT机器人 01 科大讯飞将发布星火认知大模型 百度聊天机器人文心一言已经启动邀测一个多月。现在网友发现,文心一言已经推出了内测专用独立App,目前仅提供安卓版。用户可以通过键盘打字输入问题,也可以通过语音方式输入问题&#xff0c…

JavaScript简介及常用语法

简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web ,更可广泛用于服务器、 PC 、 笔记本电脑、平板电脑和智能手机等设备。 JavaScript 是一种轻量级的编程语言。 JavaScript 是可插入 HTML 页面的编程代码。 JavaScrip…

基于 KONOS 编写一个部门级的前端框架

01 什么是 konos 现在对于前端框架的定义越来越广泛了,在前端工程化中的某一个环节的特定方案,都可泛称为一个前端框架。 konos 是一个插件化的前端框架基座,如果你对 umi 有所了解的话,可以把它当作一个没有任何功能的 umi core …

RocketMQ单机环境部署

文章目录 1. 前置条件2. 下载源码3. 编译源码4. Rocket MQ启动JVM参数配置5. 启动RocketMQ6. 安装DashBoard7. 测试RocketMQ9. 查看dashboard情况 不太懂RocketMQ基本概念的看我 这篇博客 1. 前置条件 (看我这篇博客,注意版本要改成3.2.*,m…

神经网络:Zero2Hero 2

Zero → \to → Hero : 2 接上篇,Zero → \to → Hero : 1,进一步的扩展模型: 增加输入字符序列的长度,通过多个字符预测下一个字符的概率分布增加模型的深度,通过多层的MLP来学习和预测字符的生成概率增加嵌入层&…

深度学习04-CNN经典模型

简介 卷积神经网络(CNN)是深度学习中非常重要的一种网络结构,它可以处理图像、文本、语音等各种类型的数据。以下是CNN的前4个经典模型 LeNet-5 LeNet-5是由Yann LeCun等人于1998年提出的,是第一个成功应用于手写数字识别的卷积…

【数据结构】线性表之链表

目录 前言一、链表的定义二、链表的分类1. 单向和双向2. 带头和不带头3. 循环和不循环4. 常用(无头单向非循环链表和带头双向循环链表) 三、无头单向非循环链表的接口及实现1. 单链表的接口2. 接口的实现 四、带头双向循环链表接口的及实现1. 双向链表的…

磺酸基-Cy5 羧酸Sulfo-Cy5 COOH分子式C32H37N2KO8S2

Sulfo CY5 COOH是一种有机化合物,属于荧光染料。它具有荧光、稳定、水溶性等特点,因此被应用于分析化学、生物技术、药物研发等领域。Sulfo CY5 COOH的分子式为C32H37N2KO8S2,分子量为680.87。它的荧光波长为670nm,可以通过荧光显…

如何在AD中添加自定义材料单模板

AD默认的材料单格式和常用的格式有点区别,为了减少在材料单格式编辑的工作,决定添加自定义模板到AD的模板中。 1.查找AD模板的安装位置 在AD菜单Reports中,找到“Bill of materials”菜单, 点击后,弹出的窗口中包含了…

Kubernets1.20部署Redis7.0集群6节点三主三从(完整版)-2023.5.13

目录 一、产品选型二、草图三、部署1、安装NFS服务1)NFS Server端安装NFS2)创建NFS 共享点3)启动rpcbind、nfs服务4)验证服务配置 2、创建持久卷PVC1)创建ServiceAccount账号2)创建provisioner3&#xff09…

vite入坑之路:react+vite动态导入报错@vite-ignore的解决方法

正常的动态组件导入方式 webpack搭建的项目,不管是react还是vue通常引入动态组件基本这么写: const url import(../pages/${locale}) // vite不支持or const url import(../pages/${locale}/index.jsx) // vite不支持这在vite架构中,一般…

Vue3+vite环境变量配置

在项目开发中,通常来说,不同的环境会有不同的请求api接口,这就需要修改配置,才能满足对应的环境。所以这里就使用了环境变量。环境变量就是在不同的环境中使用不同的变量值。 # 环境变量文件(.env) 在项目根目录(和sr…

TCP协议和相关特性

1.TCP协议的报文结构 TCP的全称为:Transmission Control Protocol。 特点: 有连接可靠传输面向字节流全双工 下面是TCP的报文结构: 源端口和目的端口: 源端口表示数据从哪个端口传输出来,目的端口表示数据传输到哪个端口去。…

FPGA_学习_03_第一个FPGA程序流水灯

学习编程,最重要永远就是动手,本文将在开发板上实现FPGA的“Hello world”→流水灯。本文主要目的是熟悉在Vivado上从零到程序运行起来的基本开发流程。 1 硬件电路介绍 本人购买的开发板接在PL端的只有2个LED灯,刚好达到流水灯的最低要求。…

今年这情况,大家多一手准备吧......

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

ASEMI代理MAX5048BAUT+T原装ADI车规级MAX5048BAUT+T

编辑:ll ASEMI代理MAX5048BAUTT原装ADI车规级MAX5048BAUTT 型号:MAX5048BAUTT 品牌:ADI /亚德诺 封装:SOT-23-6 批号:2023 安装类型:表面贴装型 引脚数量:6 工作温度:-40C~125C 类型&a…

npx下载构建nuxt3开发模板失败的解决方案

在搭建nuxt3项目开发的时候,安装nuxt3开发模板的时候,使用命令: npx nuxi init my-app 会出出现一下错误: This is related to npm not being able to find a file. 发生上述错误是因为您有一个未正确安装的依赖项。 以下是解决…

大央企的“中央厨房”,泰裤辣

本文来源:特大号 作者:特大妹 最近两年,大央企大国企在数字化转型中,特热衷成立“中央厨房”。 有的中央厨房,单独挂牌为“数科公司”,有的中央厨房,升级为集团数字化转型的一级部门。 把之前各…

“警”彩集结|北峰通信亮相11届警博会,多场景助力警务智能化

2023年5月11日-14日,第十一届中国国际警用装备博览会(警博会)在北京首钢会展中心隆重召开。“警博会”作为中国乃至亚太地区最具影响力、最权威的警用装备盛会,代表了中国警用装备行业的最高水平。北峰通信作为服务公共安全实战30余年的企业,…

软考A计划-真题-分类精讲汇总-第十二章(法律法规与标准化)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…