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主要依赖于客户端存储,包含了用户的身份验证和状态信息,并且被设计为无状态的、可传递的机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox-Machines--Nineveh

Nineveh测试过程 1 信息收集 NMAP 端口扫描 80 端口 80端口是服务器的默认页面,无可利用功能点,源代码没有可利用的敏感信息 目录扫描 1.http://10.129.25.123/department 访问/department目录跳转到登录页面,尝试暴力破解,获取…

系统架构设计师【第5章】: 软件工程基础知识 (核心总结)

文章目录 5.1 软件工程5.1.1 软件工程定义5.1.2 软件过程模型5.1.3 敏捷模型5.1.4 统一过程模型(RUP)5.1.5 软件能力成熟度模型 5.2 需求工程5.2.1 需求获取5.2.2 需求变更5.2.3 需求追踪 5.3 系统分析与设计5.3.1 结构化方法5.3.2 面向对象…

stm32启动文件

启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作: 初始化堆栈指针SP_initial_sp 初始化PC指针Reset_Handler 初始化中断向量表 配置系统时钟 调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界 …

虚拟现实环境下的远程教育和智能评估系统(七)

在后端代码的基础上,利用vue框架设计前端界面,至此,用户界面基本成型,后续添加其他进阶功能; 另,前后端交互相关: UsersVO.java package com.roncoo.education.user.feign.interfaces.vo;impor…

【Unity Shader入门精要 第11章】让画面动起来(一)

1. Unity Shader中的时间变量 Shader控制这物体的显示,当向Shader中引入时间变量后,就可以让物体的显示效果随时间发生变化,以实现动画效果。 Unity中常见的时间变量如下表: 变量类型描述_Timefloat4(t/20, t, 2t, 3t)&#xf…

二维数组传参时不用二级指针接收

先放结论: 1. 二维数组数组名指向的类型是 int [x] 类型,int** 指针指向类型是 int* ,如果用二级指针接收会导致访问错误,因为 int [x] 类型和 int* 类型不同。 2. 指向什么类型的指针1就按照该类型的字节数1移动。 最近在学…

unity2D跑酷游戏

项目成果 项目网盘 导入资源包 放入Assets文件Assets资源文件 游戏流程分析 摄像机size调小,让图片占满屏幕 人跑本质,相对运动,图片无限向右滚动 图片720,缩小100倍第二个图片x为7.2每unit px100两张图片刚好挨着连贯 空对象Bg…

Cloudflare的增长正在放缓,股价过高,未来将进一步下跌

来源:猛兽财经 作者:猛兽财经 一、Cloudflare公司介绍 1.1、Cloudflare(NET)是一家全球性云平台,总部位于美国旧金山,在英国伦敦亦设有办事处。 Cloudflare以向客户提供网站安全管理、性能优化及相关的技术支持为主要业务。通过基…

职场中,那些35岁以上的测试猿到底去哪了?

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

收银系统源码--商超水果生鲜店收银硬件要怎么选择?

新零售时代,越来越多的商家开始明白,除了要做好店铺定位、店面装潢和商品的设定,还要选购最适合店铺运营需求的收银机和硬件,好的收银机和收银系统可以帮助商家做好收支统计、库存管理、人员配置。客户服务等工作。现在的智能收银…

解决bind error: Address already in use

是端口复用问题 产生原因 程序突然退出系统但是没有释放端口 问题解决 首先通过 //显示进程信息 ps -la //杀死相关进程 kill -9 xxxx然后添加socket设置 int on1; if(setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){perror("setsockopt")…

RocketMQ学习(2) 深入学习

RokcetMQ的介绍和基础知识见这篇博客——RocketMQ学习(1) 快速入门 本篇为上一篇的深入学习&#xff0c;很多基础知识不再赘述。 目录 消息重复消费问题(去重;幂等)布隆过滤器 重试机制死信消息 SpringBoot集成RocketMQ集成SpringBoot发送不同消息模式(同步消息)异步消息单向消…

Kafka系列之高频面试题

基础 简介 特点&#xff1a; 高吞吐、低延迟&#xff1a;kafka每秒可以处理几十万条消息&#xff0c;延迟最低只有几毫秒&#xff0c;每个Topic可以分多个Partition&#xff0c;Consumer Group对Partition进行Consumer操作可扩展性&#xff1a;Kafka集群支持热扩展持久性、可…

OFA one-for-all 通用多模态预训练模型

使用简单的序列到序列的学习框架 统一模态 &#xff08;跨模态、视觉、语言等模态&#xff09;和任务&#xff08;如图片生成、视觉定位、图片描述、图片分类、文本生成等&#xff09; ICML 2022&#xff1a; 《OFA: Unifying Architectures, Tasks, and Modalities Through a…

2024最新 Jenkins + Docker 实战教程(六)- Jenkins配置邮箱接收构建通知

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Redis常用命令大全

目录 1、五大数据类型的基本命令 1.1 字符串 1.2 列表 1.3 哈希 1.4 集合 1.5 有序集合 2、与key相关 2.1 查看redis数据的类型 2.2 查看当前redis库中的所有key命令 3、除了五大数据类型外常见命令 3.1 键操作 3.2 服务器操作 3.3 连接操作 3.4 发布/订阅 3.5 事…

vue canvas绘制信令图二、

需求:根据信令图标题的每2个区域之间有无内容来给宽度,无内容区域的间隔要小一些。有内容区域的间隔大一些。 先上效果图: 从上面的效果图可以看出无内容区域的间隔宽度变小了很多。 1、先设置一个最先间隔的宽度:minGapX: 200, 2、然后设置一个 存放有计算后的间隔数据:…

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

尝试用智谱机器人+知识库,制作pytorch测试用例生成器

尝试用智谱机器人知识库,制作pytorch测试用例生成器 1 保存pytorch算子文档到txt2 创建知识库3 创建聊天机器人4 测试效果5 分享 背景:是否能将API的接口文档和sample放到RAG知识库,让LLM编写API相关的程序呢 小结:当前的实验效果并不理想,可以生成代码,但几乎都存在BUG 1 保存…

SpringCloud Feign用法

1.在目标应用的启动类上添加开启远程fein调用注解&#xff1a; 2.添加一个feign调用的interface FeignClient("gulimall-coupon") public interface CouponFeignService {PostMapping("/coupon/spubounds/save")R save(RequestBody SpuBondTo spuBounds);…