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…...
为AI编码助手集成sh-guard:语义化Shell命令安全防护实践
1. 项目概述:为AI编码助手装上“安全刹车”最近在折腾各种AI编码助手,从Cursor到Claude Code,再到本地部署的Codex,效率提升确实肉眼可见。但用久了,心里总有点发毛——这些AI助手动动嘴皮子就能执行rm -rf、curl | ba…...
Python办公自动化实战:结合ChatGPT实现邮件、PPT、Excel与PDF批量处理
1. 项目概述:用Python与ChatGPT解放你的办公桌如果你每天的工作中,有超过一半的时间都在和Outlook、Excel、PowerPoint、PDF这些“老朋友”打交道,重复着复制粘贴、格式调整、邮件群发、报告生成的机械劳动,那么这篇文章就是为你准…...
手机号逆向查询QQ号终极指南:5分钟快速上手完整教程
手机号逆向查询QQ号终极指南:5分钟快速上手完整教程 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录,只能对着手机号发呆?或者需要验证多个账号的归属关系却无从…...
STM32 DAC输出波形不稳?从原理到代码,详解数据对齐与参考电压那些坑
STM32 DAC输出波形不稳?从原理到代码,详解数据对齐与参考电压那些坑 当你第一次在示波器上看到STM32的DAC输出波形出现毛刺或电压跳变时,可能会感到困惑——明明按照官方例程配置了所有参数,为什么输出质量还是不尽如人意…...
保姆级教程:用K210和STM32搞串口通信,从接线到代码避坑全流程
从零搭建K210与STM32串口通信系统:硬件连接、代码实现与调试全指南 在嵌入式开发中,串口通信是最基础也最常用的外设交互方式之一。无论是传感器数据采集、设备控制指令传输,还是简单的调试信息输出,UART协议都扮演着重要角色。本…...
AI开发之LangGraph教程2~入门
概述 这篇教程主打零基础上手,带大家用 LangGraph 从零搭建一款自带上下文记忆、支持自定义工具调用的智能聊天机器人。 我们都知道:原生大语言模型 LLM 天生无状态、无记忆,单独只能做简单单次问答,既记不住多轮聊天上下文&…...
通过curl命令直接测试Taotoken聊天补全接口的详细步骤
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令直接测试Taotoken聊天补全接口的详细步骤 在开发或调试大模型应用时,有时我们希望在无需引入完整SDK的轻量…...
星露谷物语模组开发终极指南:SMAPI完整使用教程
星露谷物语模组开发终极指南:SMAPI完整使用教程 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI SMAPI(Stardew Valley Modding API)是星露谷物语模组生态的核心引…...
3分钟快速修复:VoiceFixer如何让受损语音重获新生?
3分钟快速修复:VoiceFixer如何让受损语音重获新生? 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾遇到过录音质量差、噪音干扰严重或语音不清晰的音频文件࿱…...
北京、旧金山、东京、巴黎、迪拜——2026年五大AI主战场落地时间表,错过等一年!
更多请点击: https://intelliparadigm.com 第一章:2026年AI技术大会时间地点汇总 全球人工智能领域正加速迈向规模化落地与跨域协同新阶段,2026年将成为关键转折年——多场旗舰级AI技术大会已正式公布日程与主办城市。主办方普遍采用混合参会…...
