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.mzph.cn/bicheng/19908.shtml

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

相关文章

win10键盘按乱了,如何恢复?

今天键盘被宝宝给按乱了,好不容易给重新调整回来,记录备忘: 1、win10的asdf和方向键互换了: 使用Fnw键来回切换,OK! 2、键盘的win键失效,例如:按winD无法显示桌面。此时&#xf…

电动汽车电子系统架构

电动汽车的普及正在稳步发展,供应链的各个环节也在发生变化。它涵盖了制造电动汽车零件的原材料、化学品、电池和各种组件。与此同时,汽车充电基础设施也参与其中,它们正经历一个历史性的阶段,经过彻底的重新设计。它们的电气化以…

Wpf 使用 Prism 实战开发Day30

登录界面设计 一.准备登录界面图片素材(透明背景图片) 1.把准备好的图片放在Images 文件夹下面,格式分别是.png和.ico 2.选中 login.png图片鼠标右键,选择属性。生成的操作选择>资源 3.MyTodo 应用程序右键,属性&a…

如何修改开源项目中发现的bug?

如何修改开源项目中发现的bug? 目录 如何修改开源项目中发现的bug?第一步:找到开源项目并建立分支第二步:克隆分支到本地仓库第三步:在本地对项目进行修改第四步:依次使用命令行进行操作注意:Gi…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施,它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍: 主要组成部分 传感器:安装于需要监测的位置,用于…

RK3588+FPGA+AI高性能边缘计算盒子,应用于视频分析、图像视觉等

搭载RK3588(四核 A76四核 A55),CPU主频高达 2.4GHz ,提供1MB L2 Cache 和 3MB L3 ,Cache提供更强的 CPU运算能力,具备6T AI算力,可扩展至38T算力。 产品规格 系统主控CPURK3588,四核…

GUI 02:布局管理器相关知识,AWT 的 3 种布局管理器应用,以及嵌套布局的使用

一、前言 记录时间 [2024-05-31] 前置文章 GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口,Panel 面板,及监听事件的应用 本文讲述了 GUI 编程种布局管理器的相关知识,以及 AWT 的 3 种布局管理器——流式布…

【FPGA】Verilog语言从零到精通

接触fpga一段时间,也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇:Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架:模块的结构 类比:c语言的基础…

P3881

最小值最大 二分:枚举两个牛之间的最小距离,左端点是1,右端点是篱笆总长度。 Check数组: 如果两头牛之间距离是Mid不合法,则返回0(false); 如果两头牛之间距离是Mid合法&#xf…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型(DDPMs)是一种先进的生成模型,它通过模拟数据的噪声化和去噪过程,展现出多方面的优势。DDPMs能够生成高质量的数据样本,这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…

瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发

一、完善登录功能 1.1 问题分析 1.2 代码实现 package com.itheima.reggie.filter;//这是一个过滤器类 //登录检查过滤器import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf…

HarmonyOS鸿蒙学习笔记(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的关系Component生命周期Entry生命周期 生命周期流程图生命周期展示示例代码参考资料 HarmonyOS的生命周期可以分为Compnent的生命周期和Entry的生命周期,也就是自定义组件的生命周期和页面的生命周期。 entry和Compone…

【传知代码】双深度学习模型实现结直肠癌检测(论文复现)

前言:在医学领域,科技的进步一直是改变人类生活的关键驱动力之一。随着深度学习技术的不断发展,其在医学影像诊断领域的应用正日益受到关注。结直肠癌是一种常见但危害极大的恶性肿瘤,在早期发现和及时治疗方面具有重要意义。然而…

快手发布大模型产品“可图”,超20种创新AI图像玩法限免上线

近日,快手自研大模型产品“可图”(Kolors)正式对外开放,支持文生图和图生图两类功能,已上线20余种AI图像玩法。目前,用户可以通过“可图大模型”官方网站和微信小程序,免费使用各项AI图像功能。…

纯分享#126个电商平台集合(包含60个不同国家)值得一看

01 亚洲 中国 淘宝:拥有大量的卖家和商品种类,主要面向中国市场。天猫:淘宝旗下的B2C电商平台,提供品质保证、正品保障的商品。京东:中国第二大B2C电商平台,提供品质保证、正品保障的商品。苏宁易购: 中国家电连锁巨头苏宁旗下的…

反VC情绪:加密市场需要新的分布式代币发行方式

GME事件 GME事件反应了社交媒体在金融决策中的影响力,散户投资者群体通过集体行动,改变了很多人对股市的看法和参与方式。 GME事件中,meme扮演了核心角色。散户投资者使用各种meme来沟通策略、激励持股行为,创造了一种反对华尔街…

【车载开发系列】汽车开发常用工具说明

【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明一. CANbedded二. Davinci Configurator Pro三. Davinci Developer-AUTOSAR软件组件设计工具四. MICROSAR五. MICROSAR OS六. CANdelaStudio七. Volcano VSB八…

Mysql基础教程(11):DISTINCT

MySQL DISTINCT 用法和实例 当使用 SELECT 查询数据时,我们可能会得到一些重复的行。比如学生表中有很多重复的年龄。如果想得到一个唯一的、没有重复记录的结果集,就需要用到 DISTINCT 关键字。 MySQL DISTINCT用法 在 SELECT 语句中使用 DISTINCT 关…

Spring Boot 项目中使用 JSP

文章目录 Spring Boot 项目中使用 JSP项目结构引入依赖包编写页面和后台运行方式一:Maven 命令运行方式二:在 IDEA 中运行方式三:打 war 包部署运行 Spring Boot 项目中使用 JSP 在 Spring Boot 项目中不是不可以使用 JSP 。想在 Spring Boo…

【React】封装一个好用方便的消息框(Hooks Bootstrap 实践)

引言 以 Bootstrap 为例,使用模态框编写一个简单的消息框: import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…