JSON Web Token

JWT

什么是JWT

JWT(JSON Web Token)是一种用于在各方之间作为JSON对象安全地传输信息的开放标准(RFC 7519)。该信息经过数字签名,因此是可验证和可信的。JWT 可以使用HMAC算法或使用RSA的公钥/私钥对进行签名

JWT的组成
  • Header(头部):包含令牌的类型(JWT)和使用的签名算法(如HMAC SHA256或RSA)。
  • Payload(负载):包含声明(claims)。声明是关于实体(通常是用户)和其他数据的断言。声明有三种类型:
    • Registered claims(注册声明):这些是预定义的声明,如iss(签发者)、exp(过期时间)、sub(主题)、aud(受众)等。它们不是强制的,但建议使用。
    • Public claims(公共声明):这些是可以在JWT中使用的自定义声明。为了避免冲突,应在IANA JSON Web Token Registry中定义或使用具有防冲突前缀的命名空间。
    • Private claims(私有声明):这些是双方之间使用的自定义声明,通常是特定于应用程序的。
  • Signature(签名):用于验证消息在传递过程中是否未被篡改。首先,您需要将编码后的头部和负载进行签名,然后使用指定的签名算法创建签名。签名的过程如下:
    • 使用 Base64 URL 编码对 Header 和 Payload 进行编码。
    • 使用编码后的 Header、编码后的 Payload 和一个密钥(对于 HMAC 算法)或私钥(对于 RSA)创建签名。

[HFCTF2020]EasyLogin

正常进行注册登录,发现有命令框,尝试了各种读取方式都没用,抓包发现存在jwt

再查看一下源码,看有没有什么提示

发现了关于flag的提示

解释一下这串代码的大致意思:

  • AJAX 请求: 这段代码使用 $.get/api/flag 端点发起一个 AJAX GET 请求。
  • 成功回调: 如果请求成功,done 方法会被调用,并传入返回的数据。
    • 使用解构赋值从返回的数据中提取 flag 属性。
    • 将 ID 为 username 的输入元素的值设置为这个 flag
  • 失败回调: 如果请求失败,fail 方法会被调用。
    • xhr: XMLHttpRequest 对象。
    • xhr.responseJSON.message: 从响应 JSON 中提取的错误信息,并在警告框中显示。

猜测flag应该就在/api/flag里面,提示了koa框架;

koa-static是一个处理静态文件资源的中间件,从大佬哪里借鉴一个koa的框架结构

controllers是项目控制器存放目录,访问来查看源码

结合前面提到的flag所在的目录,访问api目录

/controllers/api.js

 发现了返回flag的条件

'GET /api/flag': async (ctx, next) => {if(ctx.session.username !== 'admin'){throw new APIError('permission error', 'permission denied');}const flag = fs.readFileSync('/flag').toString();ctx.rest({flag});await next();},

简单来说就是判断username是否为admin,如果是admin的话就读取'/flag'下的内容以字符串的形式存储在flag中

想要username为admin,就只有通过JWT伪造(因为注册为admin会报错)

那么解题思路也就明确了,通过jwt将username伪造为admin,来读取flag并返回

先解析返回的jwt,签名是HS256

伪造方法,把"alg"值更改为"none",这样就不执行签名验证,将secretid改为[]代表一个空值

修改之后进行base64编码(去掉换行符和编码后的"="),把header和payload拼接,因为签名改为了none所以签名认证就为空

进入/api/flag,抓包,修改一下sses:aok和sses:aok.sig,修改为伪造jwt后返回的对应的值

就完成了jwt的伪造,获取到flag

总结:这个周从复现开始就全是token的题,前面也接触过session,一开始只是草草了解token和session类似,但是现在把两个做了明显的区别对比

Token

  • 客户端存储:Token是在客户端存储用户身份验证和状态信息的一种机制。通常,服务器会在用户登录成功后生成一个令牌(Token),并将其发送给客户端。客户端通常会将Token存储在本地,比如LocalStorage、SessionStorage或者Cookies中。

  • 状态管理:Token同样用于跟踪用户的身份验证状态,但所有的状态信息都被编码到Token中。服务器在接收到包含Token的HTTP请求时,会解码Token并验证用户的身份。

  • 无状态性:Token通常被设计为无状态的,这意味着服务器不需要在内存或者数据库中存储任何关于用户会话的信息。这使得系统更容易水平扩展,并提高了性能。

  • 灵活性:Token可以在不同的服务之间轻松传递,因为所有的用户信息都被编码在Token中。这使得Token特别适合于微服务架构和分布式系统。

  • 安全性:Token通常使用加密算法进行签名,以确保其完整性和真实性。另外,Token还可以包含过期时间和范围限制等信息,以增强安全性。

Session

  • 服务器端存储:Session是在服务器端存储用户的身份验证和状态信息的一种机制。通常,服务器会在用户登录后创建一个唯一的会话标识符(Session ID),并将这个ID与用户的相关信息存储在服务器上的内存或持久化存储中。

  • 状态管理:Session用于跟踪用户的会话状态,可以存储用户的登录状态、权限信息、购物车内容等。服务器可以根据Session ID来识别特定用户的会话,并提供相应的个性化服务。

  • Cookies支持:通常,服务器会将Session ID 存储在客户端的Cookie中,以便在后续的HTTP请求中发送回服务器。这样,服务器就可以根据Session ID 来识别用户的会话。但是,Session ID 也可以通过其他方式在客户端进行传输,比如通过URL参数或者隐藏域。

  • 安全性:由于Session数据存储在服务器端,因此相对来说更加安全。但是,仍然需要注意Session劫持(Session Hijacking)和会话固定(Session Fixation)等攻击。

区别

  • Session主要依赖于服务器端存储,用于跟踪用户的会话状态。
  • Token主要依赖于客户端存储,包含了用户的身份验证和状态信息,并且被设计为无状态的、可传递的机制。

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

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

相关文章

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查,只不过加入了类的概念。 为了防止与std里面的string冲突,所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

SpringCloud学习笔记(一)

SpringCloud、SpringCloud Alibaba 前置知识: 核心新组件: 所用版本: 学习方法: 1.看理论:官网 2.看源码:github 一、微服务理论知识 二、关于SpringCloud各种组件的停更/升级/替换 主业务逻辑是&#x…

中建环能 | “农村生活污水治理稳质增效与智能运维技术研究及成套装备应用” 科技成果评价

中华环保联合会组织召开了中建环能科技股份有限公司申请的“农村生活污水治理稳质增效与智能运维技术研究及成套装备应用”技术成果评价会。会议由中华环保联合会水环境治理专业委员会秘书长刘愿军主持。 评审会委员 本次评价会邀请了7位相关专业领域的专家组成专家评价委员会。…

977. 有序数组的平方 - 力扣

1. 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 2. 示例 3. 分析 我们当然可以遍历数组平方元素,然后再使用sort排序,但这里时间复杂度就为 O(logN) 了。 我…

音视频开发—视频相关概念:YUV与RGB

文章目录 YUV相关概念组成部分优点常见的 YUV 格式数据量的计算YUV4:2:0 存储格式平面模式(planar):打包模式(packed) RGB 和 YUV 的定义关系与转换RGB 到 YUV 的转换YUV 到 RGB 的转换 使用场景优缺点 YUV相关概念 YUV 是一种颜色编码格式&…

Linux--EXT2文件系统

参考资料: linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图_一个块组中索引节点表和数据块区最多占用字节-CSDN博客 linux环境: Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld…

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的,但是看了相关的评论一直在说:技…

truncate IDL_UB1$导致数据库open hang---惜分飞

在一次数据库恢复中,发现IDL_UB1$表被truncate,然后数据库在open过程中会hang住,而且不报任何错误,这里通过试验进行重现.对于这类问题,以前有过类似处理测试:truncate IDL_UB1$恢复试验数据库版本 SQL> select * from v$version; BANNER ---------------------…

vue3学习(六)

前言 接上一篇学习笔记,今天主要是抽空学习了vue的状态管理,这里学习的是vuex,版本4.1。学习还没有学习完,里面有大坑,难怪现在官网出的状态管理用Pinia。 一、vuex状态管理知识点 上面的方式没有写全,还有…

对象转为Map

方案一&#xff0c;Jackson String json objectMapperFace.writeValueAsString(contract);Map<String,Object> map objectMapperFace.readValue(json, Map.class);方案二 &#xff0c; apache BeanUtils Map<String,String> beanMap null;try {beanMap BeanUti…

MyBatis延迟加载缓存分页逆向工程

文章目录 延迟加载概述步骤 缓存一级缓存介绍原理 二级缓存介绍 设置缓存对象策略原理开启步骤属性解释是否使用一级缓存 分页插件使用步骤 逆向工程介绍搭建使用增删修改查 延迟加载 概述 延迟加载本身是依赖于多表查询的 延迟加载中返回值要选择resultMap返回的结果一定是D…

Docker管理工具Portainer忘记admin登录密码

停止Portainer容器 docker stop portainer找到portainer容器挂载信息 docker inspect portainer找到目录挂载信息 重置密码 docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password生成新的admin密码&#xff0c;使用新密…

分享6个打开就能让人眼前一亮的网站,每次浏览都像发现新大陆~

1、ZLibrary zh.zlibrary-be.se/ ZLibrary是一个广受欢迎的在线图书馆&#xff0c;它提供了一个庞大的电子书和文章资源库&#xff0c;数量超过千万。这个平台覆盖了国内外众多领域的电子书资源&#xff0c;几乎可以满足用户98%以上的搜索需求&#xff0c;无论是学术研究、文…

【介绍下运维,什么是运维?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

大数据开发面试题【Mysql篇】

181、mysql数据库中的引擎 用于数据存储、处理和保护数据的核心服务&#xff0c;不同的数据库引擎有其各自的特点&#xff0c;常见的引擎&#xff1a;InnoDB&#xff0c;Mylsam、Memory、Mrg_Mylsam、Blackhole innodb&#xff1a;是一个事务性存储引擎&#xff0c;提供了对事…

C++的第一道门坎:类与对象(一)

目录 1.面向过程与面向对象 1.1面向过程 1.2面向对象 1.3对比 2.类的引入 2.1类的声明方式 2.2类的成员的两种定义方式 2.2.1单文件定义 2.2.2多文件定义 3.类的访问限定符与封装 3.1访问限定符 3.2封装 4.类对象 4.1类对象的实例化 4.2类对象的存储 4.2.1 存储…

高并发项目-分布式Session解决方案

分布式Session解决方案 1.保存Session&#xff0c;进入商品列表页面 1.保存Session 1.编写工具类 1.MD5Util.java package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** Author sun* Create 2024/5/5 14…

Window系统安装Docker

因为docker只适合在liunx系统上运行&#xff0c;如果在window上安装的话&#xff0c;就需要开启window的虚拟化&#xff0c;打开控制面板&#xff0c;点击程序&#xff0c;在程序和功能中可以看到启动和关闭window功能&#xff0c;点开后&#xff0c;找到Hyper-V&#xff0c;Wi…

【环信IM集成教程】分分钟带你实现视频消息的在线播放和本地播放

有种需求&#xff0c;叫下班前实现 发送视频消息是即时通讯应用中很常见的功能&#xff0c;现在的视频播放场景五花八门&#xff0c;眼瞅快下班&#xff0c;接到产品需求 如何实现这个需求&#xff0c;好准点下班回家抢显卡 &#xff0c;快速提升自己的工作效率&#xff0c;那…

yolov5-ros模型结合zed2相机部署在 Ubuntu系统

前言 本篇文章主要讲解yolov5-ros模型结合zed2相机进行实时检测&#xff0c;经改进实现了红绿灯检测&#xff0c;并输出检测类别与置信度&#xff01; 目录 一、环境配置二、zed2驱动安装三、yolov5-ros功能包配置四、运行官方权重文件四、运行自己权重文件 一、环境配置 1、…