Secure Legion Labs
Broken Authentication Lab
This room simulates a portal that accepts a client-supplied session identifier before login and never rotates it after authentication. Your goal is to prove that a chosen session value survives login and becomes the authenticated session.
Send your own session valueAuthenticate normallyObserve whether the session changesThe portal lets the client provide a session token before login and simply binds the user to that same token after successful authentication.
session = request.sessionId || issueGuestSession()
if (validCredentials(user, pass)) {
session.user = user
return session
}
// missing rotateSessionId()Set a session token, send a login request, and compare the pre-login and post-login identifiers.
POST /api/session/login{ "status": "idle" }The critical question is whether the post-login session is freshly issued or whether the attacker-chosen identifier is still active.
Status: waiting for a login request.
The flag appears after the portal proves it kept the attacker-controlled session after login.
Submit the unlocked flag to complete the session fixation room.
Flag is locked until the chosen session survives authentication.
The attacker supplies a predictable session before the victim authenticates.
The portal validates credentials but does not rotate the session identifier.
The chosen session becomes the authenticated token and can be replayed.