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

進入靶場

都點擊看看?

發現點擊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 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/?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895819.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

twisted實現MMORPG 游戲數據庫操作封裝設計與實現

在設計 MMORPG&#xff08;大規模多人在線角色扮演游戲&#xff09;時&#xff0c;數據庫系統是游戲架構中至關重要的一部分。數據庫不僅承擔了游戲中各種數據&#xff08;如玩家數據、物品數據、游戲世界狀態等&#xff09;的存儲和管理任務&#xff0c;還必須高效地支持并發訪…

【R語言】聚類分析

聚類分析是一種常用的無監督學習方法&#xff0c;是將所觀測的事物或者指標進行分類的一種統計分析方法&#xff0c;其目的是通過辨認在某些特征上相似的事物&#xff0c;并將它們分成各種類別。R語言提供了多種聚類分析的方法和包。 方法優點缺點適用場景K-means計算效率高需…

超全Deepseek資料包,deepseek下載安裝部署提示詞及本地部署指南介紹

該資料包涵蓋了DeepSeek模型的下載、安裝、部署以及本地運行的詳細指南&#xff0c;適合希望在本地環境中高效運行DeepSeek模型的用戶。資料包不僅包括基礎的安裝步驟&#xff0c;還提供了68G多套獨立部署視頻教程教程&#xff0c;針對不同硬件配置的模型選擇建議&#xff0c;以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一個類標記為 Spring 應用上下文里的配置類。配置類就像一個 Java 版的 XML 配置文件&#xff0c;能夠在其中定義 Bean 定義和 Bean 之間的依賴關系。當 Spring 容器啟動時&#xff0c;會掃描這些配置類&#xff0c;解析其…

在 Ubuntu 20.04 為 Clash Verge AppImage 創建桌面圖標教程

在 Ubuntu 20.04 為 AppImage 創建桌面圖標教程 一、準備工作 確保你已經下載了 xxxx.AppImage 文件&#xff0c;并且知道它所在的具體路徑。同時&#xff0c;你可以準備一個合適的圖標文件&#xff08;.png 格式&#xff09;用于代表該應用程序&#xff0c;如果沒有合適的圖…

【復現DeepSeek-R1之Open R1實戰】系列6:GRPO源碼逐行深度解析(上)

目錄 4 GRPO源碼分析4.1 數據類 GRPOScriptArguments4.2 系統提示字符串 SYSTEM_PROMPT4.3 獎勵函數4.3.1 accuracy_reward函數4.3.2 verify函數4.3.3 format_reward函數 4.4 將數據集格式化為對話形式4.5 初始化GRPO Trainer 【復現DeepSeek-R1之Open R1實戰】系列3&#xff1…

【雜談】加油!!!!

為了在三月底前系統準備Java后端開發的面試和筆試&#xff0c;以下是分階段的高效學習計劃&#xff1a; 一、知識體系構建&#xff08;第1-2周&#xff09; 核心基礎強化 Java基礎&#xff08;每日1.5小時&#xff09;&#xff1a; 重點掌握&#xff1a;JVM內存模型&#xff0…

python旅游推薦系統+爬蟲+可視化(協同過濾算法)

??基于用戶的協同過濾算法 ??有后臺管理 ??2w多數據集 這個旅游數據分析推薦系統采用了Python語言、Django框架、MySQL數據庫、requests庫進行網絡爬蟲開發、機器學習中的協同過濾算法、ECharts數據可視化技術&#xff0c;以實現從網站抓取旅游數據、個性化推薦和直觀展…

HarmonyNext上傳用戶相冊圖片到服務器

圖片選擇就不用說了&#xff0c;直接用 無須申請權限 。 上傳圖片&#xff0c;步驟和android對比稍微有點復雜&#xff0c;可能是為了安全性考慮&#xff0c;需要將圖片先拷貝到緩存目錄下面&#xff0c;然后再上傳&#xff0c;當然你也可以轉成Base64&#xff0c;然后和服務…

同為科技智能PDU助力Deepseek人工智能和數據交互的快速發展

1 2025開年&#xff0c;人工智能領域迎來了一場前所未有的變革。Deepseek成為代表“東方力量”的開年王炸&#xff0c;不僅在國內掀起了技術熱潮&#xff0c;并且在全球范圍內引起了高度關注。Deepseek以顛覆性技術突破和現象級應用場景席卷全球&#xff0c;這不僅重塑了產業格…

二、QEMU NFS 環境搭建

? 在上一章節中&#xff0c;我們已經成功完成了內核和 busybox 環境的配置。為了進一步提高開發效率&#xff0c;我們可以使用 NFS&#xff08;Network File System&#xff09;來掛載根目錄。NFS 允許我們將本地文件系統通過網絡共享給虛擬機使用&#xff0c;這樣在開發過程中…

.NET 9.0 的 Blazor Web App 項目中 EF Core 【事務】使用備忘

一、DbContext.Database.BeginTransactionAsync() 模式 1. 注意事項&#xff1a;連接字符串中啟用了 MARS&#xff08;Multiple Active Result Sets&#xff1a;MultipleActiveResultSetsTrue &#xff09;后&#xff0c;無法創建 保存點&#xff08;保存點與 SQL Server 的多…

記一次 Git Fetch 后切換分支為空的情況

Git Fetch 后切換分支為空的情況 在使用 Git 時&#xff0c;我遇到這樣的情況&#xff1a;執行 git fetch 后切換分支&#xff0c;發現工作目錄是空的&#xff0c;沒有任何文件&#xff0c;所以插眼記錄一下。 原因分析 git fetch 的作用&#xff1a;git fetch 只會從遠程倉庫…

UMLS數據下載及訪問

UMLS數據申請 這個直接在官網上申請即可&#xff0c;記得把地址填全&#xff0c;基本都會拿到lisence。 UMLS數據訪問 UMLS的數據訪問分為網頁訪問&#xff0c;API訪問以及數據下載后的本地訪問&#xff0c;網頁訪問&#xff0c;API訪問按照官網的指示即可&#xff0c;這里主…

使用 Docker 部署 Apache Spark 集群教程

簡介 Apache Spark 是一個強大的統一分析引擎&#xff0c;用于大規模數據處理。本文將詳細介紹如何使用 Docker 和 Docker Compose 快速部署一個包含一個 Master 節點和兩個 Worker 節點的 Spark 集群。這種方法不僅簡化了集群的搭建過程&#xff0c;還提供了資源隔離、易于擴…

瑞薩RA-T系列芯片ADCGPT功能模塊的配合使用

在馬達或電源工程中&#xff0c;往往需要采集多路AD信號&#xff0c;且這些信號的優先級和采樣時機不相同。本篇介紹在使用RA-T系列芯片建立馬達或電源工程時&#xff0c;如何根據需求來設置主要功能模塊ADC&GPT&#xff0c;包括采樣通道打包和分組&#xff0c;GPT觸發啟動…

20250217 隨筆 redis非原子性操作簡述

從你提供的文本來看&#xff0c;核心是 Redis 作為緩存的檢查機制&#xff0c;以及非原子性操作導致的不一致性問題。 我們可以拆解為兩個部分來理解&#xff1a; &#x1f4cc; 1. 邏輯&#xff1a;先查 Redis&#xff0c;再決定是否注冊 邏輯流程 先查詢 Redis 是否有某個 …

git-提交時間和作者時間的區別

1.介紹 定義介紹 提交時間&#xff08;Committer Date&#xff09;&#xff1a;決定了提交在 Git 歷史中的位置&#xff0c;通常影響 GitHub 上提交顯示的順序。 作者時間&#xff08;Author Date&#xff09;&#xff1a;雖然不影響提交的排序&#xff0c;但在每個提交詳情頁…

PHP框架入門指南:從零構建現代Web應用

一、為什么需要PHP框架? 1.1 傳統PHP開發的痛點 重復造輪子:用戶認證、表單驗證等基礎功能需要反復開發代碼混亂:缺乏統一結構導致維護困難安全漏洞:手動處理SQL注入/XSS攻擊效率低下擴展性差:耦合代碼難以適應業務增長1.2 框架的核心價值 標準化架構:MVC模式強制代碼分…

Leetcode 146 LRU緩存 的三種解法

146. LRU 緩存 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&#xff0…