ブログ一覧に戻る

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}

参考ソース

LFI-Technic

感想

実装不備に注目したらすぐ行けたので簡単だった

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}

感想

ただのブロックリストで判断しており、それにマッチしなければいいだけなのでパターン問題。簡単