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

news2025/3/13 16:22:56

进入靶场

都点击看看 

发现点击work会增加¥

 但肯定不能一直点下去

抓包看看

这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header)、载荷(Payload)和签名(Signature)。

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

 综上,我们可以尝试修改jk的值

import jwt


jwt_str = "eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIxYTQxZTY3OC1kOGYyLTQxMDItYWRkOS1iMDM0M2ZmNzQ3M2UiLCJqa2wiOjQ5fQ.6QOmMhmKuPRJIDOlJzZ2AGXr8zXN6mjUh8TNk7nDOMM"
try:
    # 解码JWT
    decoded = jwt.decode(jwt_str, options={"verify_signature": False})
    # 修改jk值
    decoded["jk"] = 1000000000000000000000000000
    # 重新编码JWT
    new_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 "/" do
  redirect '/shop', 302
end

# 处理/filebak路径的GET请求,将当前文件的内容作为文本返回
get "/filebak" do
  content_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算法和环境变量中的密钥对负载进行编码,生成JWT
  auth = 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" do
  erb :shop
end

# 处理/work路径的GET请求,处理用户工作相关的逻辑
get "/work" do
  # 调用islogin方法检查用户是否已登录
  islogin
  # 从Cookie中获取JWT并解码
  auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }
  # 获取解码后的负载
  auth = auth[0]
  # 检查请求参数中是否包含SECRET
  unless params[:SECRET].nil?
    # 检查请求参数中的SECRET是否与环境变量中的SECRET匹配
    if ENV["SECRET"].match("#{params[:SECRET].match(/[0-9a-z]+/)}")
      # 如果匹配,打印FLAG
      puts ENV["FLAG"]
    end
  end

  # 检查请求参数中的do是否符合特定格式
  if params[:do] == "#{params[:name][0,7]} is working" then
    # 如果符合格式,将用户的jkl值增加一个0到9之间的随机数
    auth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)
    # 重新对更新后的负载进行编码,生成新的JWT
    auth = JWT.encode auth,ENV["SECRET"] , 'HS256'
    # 将新的JWT存储在Cookie中
    cookies[:auth] = auth
    # 弹出一个提示框,告知用户工作成功
    ERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").result
  end
end

# 处理/shop路径的POST请求,处理用户购买FLAG的逻辑
post "/shop" do
  # 调用islogin方法检查用户是否已登录
  islogin
  # 从Cookie中获取JWT并解码
  auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }

  # 检查用户的jkl值是否足够购买FLAG
  if auth[0]["jkl"] < FLAGPRICE then
    # 如果不足,返回一个包含错误信息的JSON响应
    json({title: "error",message: "no enough jkl"})
  else
    # 如果足够,将FLAG信息添加到负载中
    auth << {flag: ENV["FLAG"]}
    # 重新对更新后的负载进行编码,生成新的JWT
    auth = 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/ 

 

 

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

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

相关文章

【c++】c++内存管理

目录 c和c的内存分布回顾C语言动态管理内存的方式malloccallocreallocfree C动态管理内存的方式new和deleteoperator new和operator delete定位new c和c的内存分布 回顾C语言动态管理内存的方式 malloc void* malloc (size_t size);malloc可以在堆上开辟指定内存的空间&#…

EtherNet/IP转Modbus TCP:新能源风电监控与分析实用案例

EtherNet/IP转Modbus TCP&#xff1a;新能源风电监控与分析实用案例 一、案例背景 在某新能源汽车电池生产线上&#xff0c;需要将采用EtherNet/IP协议的电池检测设备与采用ProfiNet协议的生产线控制系统进行集成&#xff0c;以实现对电池生产过程的全面监控和数据采集。 二、…

数字电路-基础逻辑门实验

基础逻辑门是数字电路设计的核心元件&#xff0c;它们执行的是基本的逻辑运算。通过这些基本运算&#xff0c;可以构建出更为复杂的逻辑功能。常见的基础逻辑门包括与门&#xff08;AND&#xff09;、或门&#xff08;OR&#xff09;、非门&#xff08;NOT&#xff09;、异或门…

国产编辑器EverEdit - 如虎添翼的功能:快速选择

1 快速选择 1.1 应用场景 快速选择适用于批量选择和修改的场景&#xff0c;比如&#xff1a;变量改名。 1.2 使用方法 1.2.1 逐项快速选择 将光标放置在单词前或单词中&#xff0c;选择主菜单查找 -> 快速选择 -> 快速选择或使用快捷键Ctrl D 注&#xff1a;光标放…

国内外网络安全政策动态(2025年1月)

▶︎ 1.国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》 1月3日&#xff0c;国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》。根据《意见稿》&#xff0c;个人信息出境个…

68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)

一、前言 这份报告旨在应对数字化转型过程中数据安全面临的挑战&#xff0c;并提供全面的管理与技术体系建设框架。报告首先分析了数字化社会的发展背景&#xff0c;强调了数据安全在国家安全层面的重要性&#xff0c;并指出数据安全风险的来源和防护措施。接着&#xff0c;报…

AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知

写在前面 没接触过 SSE&#xff08;Server-Sent Events&#xff09;&#xff0c;AI大模型出来之后&#xff0c;一直以为文本流是用 WebSocket 做的偶然看到返回到报文格式是 text/event-stream,所以简单认知&#xff0c;整理笔记博文内容涉及 SSE 认知&#xff0c;以及对应的 D…

Electron:使用electron-react-boilerplate创建一个react + electron的项目

使用 electron-react-boilerplate git clone --depth 1 --branch main https://github.com/electron-react-boilerplate/electron-react-boilerplate.git your-project-name cd your-project-name npm install npm start 安装不成功 在根目录加上 .npmrc文件 内容为 electron_…

Spring Boot三:Springboot自动装配原理

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 原理初探 pom.xml 核心依赖在父工程中 spring-boot-dependencies所有的jar包都在这里管理 我们在写或者引入一些依赖的时候&#xff0c;不需要指定版本 启动器 <…

2024 年 CSDN 博客之星年度评选:技术创作与影响力的碰撞(统计时间2025-02-17 11:06:06)

摘要&#xff1a;在技术的海洋里&#xff0c;每一位博主都像是一座独特的灯塔&#xff0c;用自己创作的光芒照亮他人前行的道路。2024 年 CSDN 博客之星年度评选活动&#xff0c;正是对这些灯塔的一次盛大检阅&#xff0c;让我们看到了众多优秀博主在技术创作领域的卓越表现以及…

Java零基础入门笔记:(3)程序控制

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互&#xff0c;但是Java给我们提供了这样一个工具类&…

后端生成二维码,前端请求接口生成二维码并展示,且多个参数后边的参数没有正常传输问题处理

一、后端代码 1、controller GetMapping("/generateQRCode/{url}")ApiOperation(value "生成url链接二维码",notes "生成url链接二维码")public JsonResult<NewsQRCodeVo> generateQRCode(PathVariable String url,HttpServletRespons…

(8/100)每日小游戏平台系列

项目地址位于&#xff1a;小游戏导航 新增一个打地鼠游戏&#xff01; 打地鼠&#xff08;Whack-a-Mole&#xff09;是一款经典的休闲游戏&#xff0c;玩家需要点击随机出现的地鼠&#xff0c;以获取分数。游戏时间有限&#xff0c;玩家需要在规定时间内尽可能多地击中地鼠&am…

[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…

SpringBoot+Vue+数据可视化的动漫妆造服务平台(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今数字化高速发展的时代&#xff0c;动漫产业迎来了前所未有的繁荣&#xff0c;动漫…

基于web的留守儿童网站的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

OpenCV中的边缘检测

边缘检测是图像处理和计算机视觉中的关键技术之一&#xff0c;旨在识别图像中像素强度发生显著变化的区域&#xff0c;这些区域通常对应于物体的边界或轮廓。边缘检测在机器视觉中具有重要的需求背景&#xff0c;主要体现在以下几个方面&#xff1a; 图像分割&#xff1a;边缘…

家里WiFi信号穿墙后信号太差怎么处理?

一、首先在调制解调器&#xff08;俗称&#xff1a;猫&#xff09;测试网速&#xff0c;网速达不到联系运营商&#xff1b; 二、网线影响不大&#xff0c;5类网线跑500M完全没问题&#xff1b; 三、可以在卧室增加辅助路由器&#xff08;例如小米AX系列&#xff09;90~200元区…

【前端学习笔记】Webpack

1.介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具&#xff0c;它将 JavaScript、CSS、图片、字体等资源文件打包成一个或多个静态文件&#xff0c;以供浏览器使用。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(depend…

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示 3.1.1 顺序查找 int SequentialSearch(List Tbl,ElementType K){int i;Tbl->Element[0]K;for(iTbl->Length;Tbl->Element[i]!K;i--);return i; } typedef struct LNode *List; struct LNode{ElementType Element[MAXSIZE];int Length; };3.1.2 二分…