RatMarket
Marketplace with stored XSS in the listings. Think about who reads them.
Your payload is saved and fires later, for whoever loads the page next. Ask who that is before you decide what the payload should do.
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.
Start at 00 and work up.
Marketplace with stored XSS in the listings. Think about who reads them.
Packing-list app. The stored payload fires on the shared list.
Stock tracker. Two of its rooms are hidden behind the obvious one.
The input that is not on the main page.
Same hidden sink, now with a filter on it.
Rental flow with stored XSS in the booking details.
The rental API behind the UI, documented. Store it through the API instead.
The API field the docs do not mention.
Theme park app with stored XSS.