進入靶場
都點擊看看?
發現點擊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/?
?
?