137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场


都点击看看

发现点击work会增加¥
但肯定不能一直点下去
抓包看看

这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header)、载荷(Payload)和签名(Signature)。
- 头部解析:
- 经过 Base64 解码(注意,这里的 Base64 解码是 URL 安全的 Base64 变体),
eyJhbGciOiJIUzI1NiJ9得到{"alg":"HS256"},表示使用的签名算法是 HMAC SHA256。- 载荷解析:
- 对
eyJ1aWQiOiIxYTQxZTY3OC1kOGYyLTQxMDItYWRkOS1iMDM0M2ZmNzQ3M2UiLCJqa2wiOjQ5fQ进行 Base64 解码,得到{"uid":"1a41e678 - d8f2 - 4102 - add9 - b0343ff7473e","jk":49}。这里的uid可能是用户唯一标识符,jk的含义则取决于应用程序的定义。- 签名部分:
6QOmMhmKuPRJIDOlJzZ2AGXr8zXN6mjUh8TNk7nDOMM是签名部分,它是通过使用头部中指定的算法(HS256),结合一个密钥(只有服务器端知道)对头部和载荷进行签名计算得出的。其目的是验证消息在传输过程中没有被更改,并且,在使用私钥签名的情况下,还可以验证 JWT 的发送者的身份。

综上,我们可以尝试修改jk的值
import jwtjwt_str = "eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIxYTQxZTY3OC1kOGYyLTQxMDItYWRkOS1iMDM0M2ZmNzQ3M2UiLCJqa2wiOjQ5fQ.6QOmMhmKuPRJIDOlJzZ2AGXr8zXN6mjUh8TNk7nDOMM"
try:# 解码JWTdecoded = jwt.decode(jwt_str, options={"verify_signature": False})# 修改jk值decoded["jk"] = 1000000000000000000000000000# 重新编码JWTnew_jwt = jwt.encode(decoded, "secret_key", algorithm='HS256')print(new_jwt)
except jwt.exceptions.InvalidTokenError as e:print(f"解码错误: {e}")
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIxYTQxZTY3OC1kOGYyLTQxMDItYWRkOS1iMDM0M2ZmNzQ3M2UiLCJqa2wiOjQ5LCJqayI6MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMH0.uEaleEDczqr1mtKN1aoq4uLX6M5IxhtT20FN9tNNOc8
不对
可能只改这块不行
看看还有没有信息



# 引入Sinatra框架,用于构建Web应用
require 'sinatra'
# 引入Sinatra的cookies扩展,用于处理HTTP Cookie
require 'sinatra/cookies'
# 引入Sinatra的JSON扩展,用于方便地返回JSON响应
require 'sinatra/json'
# 引入JWT库,用于处理JSON Web Tokens
require 'jwt'
# 引入SecureRandom库,用于生成安全的随机数和UUID
require 'securerandom'
# 引入ERB库,用于处理嵌入式Ruby模板
require 'erb'# 设置静态文件的存放目录,这里指定为当前文件所在目录下的static文件夹
set :public_folder, File.dirname(__FILE__) + '/static'# 定义购买FLAG所需的jkl价格
FLAGPRICE = 1000000000000000000000000000
# 生成一个64字节的随机十六进制字符串作为JWT的密钥,并存储在环境变量中
ENV["SECRET"] = SecureRandom.hex(64)# 配置应用的设置
configure do# 启用日志记录enable :logging# 打开一个日志文件,用于记录HTTP请求信息file = File.new(File.dirname(__FILE__) + '/../log/http.log',"a+")# 确保日志文件的写入是同步的,即写入操作立即生效file.sync = true# 使用Rack的CommonLogger中间件将日志记录到指定的文件中use Rack::CommonLogger, file
end# 处理根路径的GET请求,重定向到/shop路径
get "/" doredirect '/shop', 302
end# 处理/filebak路径的GET请求,将当前文件的内容作为文本返回
get "/filebak" docontent_type :text# 使用ERB渲染当前文件的内容erb IO.binread __FILE__
end# 处理/api/auth路径的GET请求,生成一个JWT并将其存储在Cookie中
get "/api/auth" do# 定义JWT的负载,包含一个随机生成的UUID和初始jkl值payload = { uid: SecureRandom.uuid , jkl: 20}# 使用HS256算法和环境变量中的密钥对负载进行编码,生成JWTauth = JWT.encode payload,ENV["SECRET"] , 'HS256'# 将生成的JWT存储在Cookie中cookies[:auth] = auth
end# 处理/api/info路径的GET请求,从Cookie中获取JWT并返回用户信息
get "/api/info" do# 调用islogin方法检查用户是否已登录islogin# 从Cookie中获取JWT,并使用环境变量中的密钥进行解码auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }# 将用户信息(uid和jkl)以JSON格式返回json({uid: auth[0]["uid"],jkl: auth[0]["jkl"]})
end# 处理/shop路径的GET请求,渲染shop.erb模板
get "/shop" doerb :shop
end# 处理/work路径的GET请求,处理用户工作相关的逻辑
get "/work" do# 调用islogin方法检查用户是否已登录islogin# 从Cookie中获取JWT并解码auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }# 获取解码后的负载auth = auth[0]# 检查请求参数中是否包含SECRETunless params[:SECRET].nil?# 检查请求参数中的SECRET是否与环境变量中的SECRET匹配if ENV["SECRET"].match("#{params[:SECRET].match(/[0-9a-z]+/)}")# 如果匹配,打印FLAGputs ENV["FLAG"]endend# 检查请求参数中的do是否符合特定格式if params[:do] == "#{params[:name][0,7]} is working" then# 如果符合格式,将用户的jkl值增加一个0到9之间的随机数auth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)# 重新对更新后的负载进行编码,生成新的JWTauth = JWT.encode auth,ENV["SECRET"] , 'HS256'# 将新的JWT存储在Cookie中cookies[:auth] = auth# 弹出一个提示框,告知用户工作成功ERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").resultend
end# 处理/shop路径的POST请求,处理用户购买FLAG的逻辑
post "/shop" do# 调用islogin方法检查用户是否已登录islogin# 从Cookie中获取JWT并解码auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }# 检查用户的jkl值是否足够购买FLAGif auth[0]["jkl"] < FLAGPRICE then# 如果不足,返回一个包含错误信息的JSON响应json({title: "error",message: "no enough jkl"})else# 如果足够,将FLAG信息添加到负载中auth << {flag: ENV["FLAG"]}# 重新对更新后的负载进行编码,生成新的JWTauth = JWT.encode auth,ENV["SECRET"] , 'HS256'# 将新的JWT存储在Cookie中cookies[:auth] = auth# 返回一个包含成功信息的JSON响应json({title: "success",message: "jkl is good thing"})end
end# 定义一个辅助方法,用于检查用户是否已登录
def islogin# 检查Cookie中是否包含auth字段if cookies[:auth].nil? then# 如果不包含,重定向到/shop路径redirect to('/shop')end
end

得到了密钥
用下下面的这个工具
https://jwt.io/
相关文章:
137,【4】 buuctf web [SCTF2019]Flag Shop
进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...
P9853 [入门赛 #17] 方程求解
P9853 [入门赛 #17] 方程求解 - 洛谷 题目描述 小A有n个关于x的方程,第i个方程形如aixibici。方程的解x均为正整数,例如下面几个方程都是符合要求的方程: 2x 4 10 -3x 13 10 4x - 8 16 其中,第一组方程的解为x1…...
【网络安全 | 漏洞挖掘】跨子域账户合并导致的账户劫持与删除
未经许可,不得转载。 文章目录 概述正文漏洞成因概述 在对目标系统进行安全测试时,发现其运行着两个独立的域名——一个用于司机用户,一个用于开发者/企业用户。表面上看,这两个域名各自独立管理账户,但测试表明它们在处理电子邮件变更时存在严重的逻辑漏洞。该漏洞允许攻…...
spring集成activiti流程引擎(源码)
前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,请假审批demo从流程绘制到审批结束实例。 源码获取:本文末个人名片直接获取。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行…...
ROS基本功能
1.Topic话题与Message消息(主要通讯方式) 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...
C++基础系列【13】类的成员初始化
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
Redis 03章——10大数据类型概述
一、which10 (1)一图 (2)提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 官网:Understand Redis data types | Docs (3)分别是 1.3.1redis字符串࿰…...
Ubuntu 上安装 Elasticsearch 7.6.0
要在 Ubuntu 24.04 上安装 Elasticsearch 7.6.0,可以按照以下步骤进行: 步骤 1: 更新系统依赖 确保系统是最新的,并安装必要的依赖包: sudo apt update sudo apt upgrade -y sudo apt install -y apt-transport-https openjdk-1…...
Android ListPreference使用
Android ListPreference使用 参考 添加链接描述 导入 androidx.preference.ListPreferenceListPreference是Android中的一个Preference子类,用于显示一个可选择的列表,并且可以保存用户所选择的值。它继承自DialogPreference,可以在用户点击时弹出一个对话框,显示可选择的…...
Java 大视界 -- 绿色大数据:Java 技术在节能减排中的应用与实践(90)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程
该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…...
英码科技基于昇腾算力实现DeepSeek离线部署
DeepSeek-R1 模型以其创新架构和高效能技术迅速成为行业焦点。如果能够在边缘进行离线部署,不仅能发挥DeepSeek大模型的效果,还能确保数据处理的安全性和可控性。 英码科技作为AI算力产品和AI应用解决方案服务商,积极响应市场需求࿰…...
CTex安装和使用(1)
CTeX是一款基于TeX/LaTeX的集成开发环境(IDE),主要用于文档排版,特别是在处理复杂的数学公式和学术论文方面具有显著优势。以下是CTeX的一些基本信息: 功能 文档编辑 :提供了一个友好的界面用于编辑LaTeX…...
Oracle序列(基础操作)
序列概念 序列是用于生成唯一、连续序号的对象。 序列可以是升序的,也可以是降序的。 使用CREATE SEQUENCE语句创建序列。 start with 1 指定第一个序号从1开始 increment by 1 指定序号之间的间隔为1 increment by -1 降序1000 999 998这样 maxvalue 2000 表…...
Unity Shader Graph 2D - Procedural程序化图形循环的箭头
前言 箭头在游戏开发中也是常见的一种图形之一,在游戏中箭头通常会用作道路引导或者指示,告诉玩家前进的方向,是比较重要的提示信号。本文将通过使用程序化图形来实现循环滚动的箭头效果,实践和熟悉Shader Graph的相关节点。 首先创建一个Shader Graph文件命名为Mo…...
4、C#基于.net framework的应用开发实战编程 - 测试(四、二) - 编程手把手系列文章...
四、 测试; 四.二、实际运行; 在应用调试完毕,Bug基本解决的时候就需要对应用进行实际运行来进行查看使用体验及分发的准备工作。 1、 运行设置; 在启动项目上右键属性,点击生成,将顶部的配置改…...
Windows搭建CUDA大模型Docker环境
Windows搭建CUDA大模型Docker环境 一、安装Docker二、拉取镜像三、启动容器四、安装依赖环境五、安装Miniconda3六、设置pip源地址 一、安装Docker windows中docker安装教程 二、拉取镜像 系统:Ubuntu20.04CUDA版本:11.8.0 docker pull nvcr.io/nvid…...
【前端进阶】「全面优化前端开发流程」:利用规范化与自动化工具实现高效构建、部署与团队协作
利用规范化与自动化工具实现高效构建、部署与团队协作 前言一、规范化1. ESLint / TSLintESLintTSLint 2. Stylelint3. Prettier4. 规范化总结 二、自动化1. 自动化构建2. 自动化部署3. 自动化工作流4. 自动化总结 总结 前言 前端工程化是为了提升开发效率、确保代码质量并增强…...
Linux入侵检查流程
1. 初步信息收集 1.1 系统信息 • 目的:了解当前系统的基本情况,包括操作系统版本、内核版本等。 • 命令: # 查看操作系统发行版信息 cat /etc/os-release # 查看内核版本 uname -r 1.2 网络信息 • 目的:查看网络连接状态、…...
Ubuntu24.04无脑安装docker(含图例)
centos系统请看这篇 Linux安装Docker教程(详解) 一. ubuntu更换软件源 请看这篇:Ubuntu24.04更新国内源 二. docker安装 卸载老版docker(可忽略) sudo apt-get remove docker docker-engine docker.io containerd runc更新软件库 sudo a…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
