[NSSRound#13 Basic]flask?jwt?解题思路过程

news2024/11/17 22:22:53

过程

打开题目链接,是一个登录框,不加验证码,且在注册用户名admin时提示该用户名已被注册,因此爆破也是一种思路。不过根据题目名字中的提示,jwt,且拥有注册入口,注册一个用户先。

注册完用户,通过getFlag按钮,得到提示不是admin用户,在忘记密码的页面,找到flask的secretKey,因此考虑flask的session伪造。
getFlag

jwt

简要介绍一下jwt。JSON Web Token, JWT。jwt是一种协议,用来解决用户认证的问题。我们熟知的认证方式是session-cookie的形式,客户端向服务端发送用户名和密码,服务端验证后会在当前的会话(session)中保存用户的相关信息(例如:当前用户的权限),并向客户端返回一个session_id,也即客户端的cookie。下次请求时,客户端将通过Cookie传送该session_id,服务端接收到之后,通过session_id来查询对应session,从而获取与用户相关的信息。

这种机制的问题时需要服务端保存session,且session查询需要消耗资源。

因而引入jwt,jwt的设计比较简明,一个三段式的字符串,如下:
引自jwt.io使用base64编码,以.分隔为了三个部分:Header、Payload、Signature。

  • Header
    header部分用于标识生成Signature的算法。例如图中的,也是默认的HS256:HMAC-SHA256。
  • Payload
    payload部分存放需要传递的数据,有7个官方字段,当然也可以添加自己的字段,但是因为该部分内容是base64编码的,与明文传输并无二致,避免传输私密信息:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
  • Signature
    使用一个客户端与服务端都知道的密钥对前两部分进行加密,作为一个签名附加在jwt的第三部分。

故而当服务端签发jwt返回给客户端时,客户端可以使用相同的密钥和指定算法,验证前两部分的有效性;反过来,服务端也可以通过此种方法来验证客户端的jwt是否有效*。

flask session伪造

有了密钥,使用https://github.com/noraj/flask-session-cookie-manager/tree/master对session进行伪造。

首先解密可以得到:{'_fresh': True, '_id': '0212d692b0824b514d6eab354c932359356d94eff6bd2dbabe3236c8f95e3081a881f9f142deb7505132b14c04ab8a813bfc3d319348345395132f1947daf8cc', '_user_id': '2'},改_user_id为1,重新加密后,替换原有session获得flag。

acquisition

  1. 学习了flask的session伪造的解法
  2. 重温了一遍jwt

reference

https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
https://github.com/noraj/flask-session-cookie-manager/tree/master
https://blog.csdn.net/Leaf_initial/article/details/131560501

后记
* 这里想到一个问题:对称加密下,客户端也保存有相同的密钥,那么客户端自己也是可以伪造签名的,例如一个非admin的用户,将自己的权限改为了admin,即payload部分内容发生改变,同时他将新的签名进行更新,不就可以伪造jwt了?当然这个过程也有许多细节问题可以用来规避,例如1)如果使用非对称的加密算法,既然客户端只是验证,客户端保存一个公钥即可,jwt的签发由服务端保存的私钥进行2)payload中避免使用如“admin=0”,“admin=1”此类的身份验证策略,也可以避免此种伪造。3)还是把用户的权限控制放在服务端,验证完jwt后通过查询ACL再来决定用户的真正权限。可能对于具体的使用场景、使用流程的认识还不到位,因而有诸如此类的疑惑,后续搞明白了再写一写

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

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

相关文章

Flink DataStream之使用filter实现分流

新建类 package test01;import org.apache.flink.api.common.JobExecutionResult; import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOut…

Pygame Zero(pgzrun)游戏库介绍

Pygame Zero(pgzrun)游戏库介绍 pgzero是python的一个第三方库。pgzrun 是 python game zero run 的缩写, 它对 Pygame 进行了封装, 屏蔽了繁琐枯燥的框架代码, 让学习者可以更专注于游戏的实现逻辑, 并且更快看到成果。 官网https://pygame-zero.read…

单样本微调给ChatGLM2注入知识~

前方干货预警:这可能也是一篇会改变你对LLM微调范式,以及对LLM原理理解的文章。 同时这也是一篇非常有趣好玩,具有强大实操性的ChatGLM2微调喂饭级教程。 我们演示了使用AdaLoRA算法,使用1条样本对ChatGLM2-6b实施微调。几分钟就成…

【Redis】五大数据类型(操作命令)

🎯Redis 命令 🚩Redis 键(key) 这些是 Redis 数据库中的命令,用于对数据类型进行操作和管理。以下是每个命令的含义和用法: DEL:删除一个或多个键。DUMP:将一个键的值转储到一个字符串中。EXPIRE&#x…

【数据结构二叉树OJ系列】4、翻转二叉树(又称求二叉树的镜像)

目录 法一、 法二、 题述: 翻转一颗二叉树。 输入: 输出: 题中已给: struct TreeNode {int val;struct TreeNode* left;struct TreeNode* right; }; TreeNode* invertTree(struct TreeNode* root) 法一、 思路:…

操作指南 | 如何使用Foundry在Moonbeam上进行部署

Foundry是一种以太坊开发环境,可帮助构建者管理依赖项、编译项目、测试或部署合约以及通过指令与区块链进行交互。Foundry已成为流行的开发智能合约开发环境,仅需要使用Solidity即可进行操作。Moonbeam在官方文档网站提供了有关将Foundry与Moonbeam网络结…

vector [] 赋值出现的报错问题

下面这段代码的作用是创建了一个整数类型的vector&#xff08;std::vector<int>&#xff09;并对其进行操作。以下是代码的详细说明&#xff1a; 使用reserve(10)方法为向量分配至少10个元素的存储空间。reserve() 预留了额外的存储空间&#xff0c;以避免后续添加元素时…

C++之typeof和typeid用法(一百五十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

动态规划--Fibonacci数列 III

描述 众所周知&#xff0c;Fibonacci数列是一个著名数列。它的定义是&#xff1a; 本题要求采用第三种方法&#xff1a;简单的动态规划。 用数组把求出来的 Fibonacci 数列保存下来&#xff0c;以免后面要的时候再算一次。 输入描述 每行一个整数 i &#xff0c;表示 Fibona…

【C++修炼之路】string 模拟实现

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、默认成员函数1、全缺省构造2、析构3、拷贝构造&#xff08;深拷贝&#xff09;4、赋值重载&#xff08;深拷贝&#xff09;…

Langchain 新手完全指南

Langchain 可能是目前在 AI 领域中最热门的事物之一&#xff0c;仅次于向量数据库。 它是一个框架&#xff0c;用于在大型语言模型上开发应用程序&#xff0c;例如 GPT、LLama、Hugging Face 模型等。 它最初是一个 Python 包&#xff0c;但现在也有一个 TypeScript 版本&…

Git gui教程---第五篇 Git gui的使用 查看提交历史

查看提交历史 1.点击菜单栏的“版本库”&#xff0c;选择“图示master分支的历史” 2.出现的界面就是显示当前分支的提交历史了

Java基础---Java中创建对象方式

目录 使用new关键字 使用反射机制 使用clone方法 使用反序列化 使用方法句柄 使用Unsafe分配内存 使用new关键字 这是最常见的也是最简单的创建对象的方式通过这种方式还可以调用任意的构造函数&#xff08;无参的和有参的&#xff09; 使用反射机制 运用反射手段&#…

单个电源模块带电感的直流压降仿真(一)

单个电源模块带电感的直流压降仿真(一) 下面实例分析单个电源模块带电感的直流压降仿真分析,以下图为例 具体操作如下 创建新的workspaceLoad a New/Different layout(把PCB文件加载进来)

【滑动窗口】209. 长度最小的子数组

209. 长度最小的子数组 解题思路 滑动窗口设置前后指针滑动窗口内的元素之和总是大于或者等于s滑动窗口的起始位置: 如果窗口的值大于等于s 窗口向前移动窗口结束位置:for循环的j class Solution {public int minSubArrayLen(int target, int[] nums) {int left 0;// 滑动窗口…

UDS统一诊断服务【七】DTC控制0X85服务

文章目录 前言一、DTC控制服务介绍二、数据格式2.1 请求报文2.2 子功能2.3响应格式 三、举例总结 前言 大家好&#xff0c;我是嵌入式老林&#xff0c;从事嵌入式软件开发多年&#xff0c;今天分享的内容是UDS诊断故障码控制0X85服务介绍&#xff0c;希望能对你有所帮助 一、D…

[LeetCode周赛复盘] 第 353 场周赛20230709

[LeetCode周赛复盘] 第 353 场周赛20230709 一、本周周赛总结6451. 找出最大的可达成数字1. 题目描述2. 思路分析3. 代码实现 6899. 达到末尾下标所需的最大跳跃次数1. 题目描述2. 思路分析3. 代码实现 6912. 构造最长非递减子数组1. 题目描述2. 思路分析3. 代码实现 6919. 使…

人工智能与Chat GPT

一本书全面掌握ChatGPT&#xff0c;既有向ChatGPT提问的技巧&#xff0c; 也有构建自己的ChatGPT模型的方法&#xff0c;涵盖开发背景、关联技术、使用方法、应用形式、实用案例等 人工智能是我们这个时代最热门的话题&#xff0c;人们既希望它能代替我们做一些工作&#xff0c…

Python使用SQLAlchemy

Python使用SQLAlchemy 1 安装SQLAlchemy 备注&#xff1a;本文适用于SQLAlchemy>2.0 # 安装SQLAlchemy pip install SQLAlchemy# 安装pymysql pip install pymysql参考文档&#xff08;SQLAlchemy>2.0&#xff09; https://docs.sqlalchemy.org/en/20/创建数据库 # …

什么是敏捷测试?

目录 前言&#xff1a; 敏捷测试的定义 敏捷测试的特点 为什么要敏捷测试 缩短价值交付周期 强调质量属于大家 化繁为简节省成本 敏捷测试VS. 传统测试 传统测试如何迁移到敏捷测试 1. 组织文化的转变 2. 组织架构的调整 3. 人员培训与指导 4. 轻流程 敏捷测试成…