irisctf 2025 Web upsolve
irisctf 2025 Web upsolve
Password Manager [ 50 points ]
main.goのみの配布
ログインフォームのみ与えられるので、ログインできれば勝ち
ソースコードを読むと、./users.jsonがあるのでここに情報が書いてありそうだが、../は になる
file, err := os.Open("./users.json") if err != nil { fmt.Printf("Error reading users.json: %v\n", err) return } var PathReplacer = strings.NewReplacer( "../", "", )
..../users.jsonを見ればログイン情報を取得できた
flag : irisctf{l00k5_l1k3_w3_h4v3_70_t34ch_sk47_h0w_70_r3m3mb3r_s7uff}
参考ソース
感想
実装不備に注目したらすぐ行けたので簡単だった
Political [ 50 points ]
tokenがvalid_tokenに含まれている、もしくはvalid_token[valid]=Trueであればflagが返ってくる
@app.route("/redeem", methods=["POST"]) def redeem(): if "token" not in request.form: return "Give me token" token = request.form["token"] if token not in valid_tokens or valid_tokens[token] != True: return "Nice try." return FLAG
tokenはsecureに作成されているので改ざんは難しそう
/giveflagを使って、valid_tokens[token] = Trueを付与することは可能なのでここから攻めていく
@app.route("/giveflag") def hello_world(): if "token" not in request.args or "admin" not in request.cookies: return "Who are you?" token = request.args["token"] admin = request.cookies["admin"] if token not in valid_tokens or admin != ADMIN: return "Why are you?" valid_tokens[token] = True return "GG"
このチャレンジではbot.jsが動いておりREADME.mdにある通り、https://political-web.chal.irisc.tfにアクセスしてcookieを生成している
bot.jsはadminのcookieを使って与えられたURLにアクセスしてくれるので、https://political-web.chal.irisc.tf/giveflag?token=TOKENを渡せば良さそう
policy.jsonで以下のようになっているので、注意。
{ "URLBlocklist": ["*/giveflag", "*?token=*"] }
https://political-web.chal.irisc.tf%2Fgiveflag%3Ftoken=TOKENを送れば行けるはず
ここでbotの立ち上げがうまくいかなかったので他の人のwriteupを見ましたが、これでいけるっぽいのであってた
flag : irisctf{flag_blocked_by_admin}
感想
ただのブロックリストで判断しており、それにマッチしなければいいだけなのでパターン問題。簡単