AIS3 Pre-exam Write up
第一次參加 AIS3 pre-exam,應該也算第一次自己打 CTF。上學期修了資安實務,才終於開始打 CTF,之前在資安社的時候都只是在下面聽聽,沒有真的認真打過比賽。最終解了 10 題,排第45名(。◕∀◕。) 我主要都是解 Web 題(Web*3, Misc*3, Crypto*2, Reverse*1),再陸續把各個項目低分的題目解一解。大部分 1xx 分的都滿簡單的,可以一眼就差不多看出題目的思路,找相關的資料或是需要耐心慢慢看就能看出答案。經過資安實務的摧殘產生的心裡陰影,有時候會把題目想的太複雜,突然解出 Flag 還會覺得:「蛤?就這樣喔,我想太多惹」。 花很多時間的 震撼彈-ais3-官網疑遭駭,是一個很惡劣的題目,靠眼力(+細心?)就能找到一個怪怪的封包,找到之後竟然還只是一個簡單的 shell,我大概花了三四個小時在摸那包封包吧。 最後的時間都在解 XSS Me,大概花了 6,7 個小時在東戳西戳,就是找不到繞過字數限制的 XSS 方法,最後也沒有解出來QQ。後來得到提示之後還是解出來了,也把 Write up 補一補。 對了,我是有參加第一天的 MyFirstCTF 啦,但不小心睡太晚了 ヽ(・×・´)ゞ Welcome Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi Welcome 的題目,一個一個試密碼,大概 10 分鐘就可以試出來了。 ![[Pasted image 20250101192522.png]] Web ⲩⲉⲧ ⲁⲛⲟⲧⲏⲉꞅ 𝓵ⲟ𝓰ⲓⲛ ⲣⲁ𝓰ⲉ ![[Pasted image 20250101192528.png]] 這一題是 Flask 的登入的頁面(還有很白痴的 CSS 讓整個頁面變很干擾),輸入 username 和 password,設法走到 Line18 就能拿到旗子。 FLAG = os.environ.get('FLAG', 'AIS3{TEST_FLAG}') users_db = { 'guest': 'guest', 'admin': os.environ.get('PASSWORD', 'S3CR3T_P455W0RD') } @app.route("/") def index(): def valid_user(user): return users_db.get(user['username']) == user['password'] if 'user_data' not in session: return render_template("login.html", message="Login Please :D") user = json.loads(session['user_data']) if valid_user(user): if user['showflag'] == True and user['username'] != 'guest': return FLAG else: return render_template("welcome.html", username=user['username']) return render_template("login.html", message="Verify Failed :(") @app.route("/login", methods=['POST']) def login(): data = '{"showflag": false, "username": "%s", "password": "%s"}' % ( request.form["username"], request.form['password'] ) session['user_data'] = data return redirect("/") Line10: dict().get() 如果沒有取值成功,預設會 retrun None。所以只要構造出: ...