Regex filter gauntlet
The filter is a regular expression. Read it, then find what it does not cover.
Your input comes straight back out in the response. Every lab here is the same contact form with a different filter in front of it, so the only thing that changes between them is what you have to get past.
XSS happens when input you control ends up in the page without being neutralised for the context it lands in. Context is the whole game: inside HTML, inside an attribute, inside a script block and inside a URL all need different escaping, and a filter built for one of them is useless in the others.
Numbered low to high, and they get progressively harder. 00 is the one that is supposed to be safe - if you break that one, mail info@thexssrat.com.
The filter is a regular expression. Read it, then find what it does not cover.
Same idea, except the sink is a POST parameter, so you cannot just share a URL.
Nothing reaches the server. The bug is in the JavaScript that reads your input.
Client-side sink, no server round trip. Find it in the source, not the response.
A chat app riddled with reflected XSS. Find where the message is echoed back.
XSS games with a score. Email change, money transfer, overview pages.