In de les werd
alert(1) vaak gebruikt als PoC. Wanneer alert() geblokkeerd was, kwam print() als alternatief aan bod. Bij DOM-oefeningen ging het soms om het aanpassen van een zichtbaar element, bijvoorbeeld tekst in een result-div.PortSwigger XSS cheat sheet
Payloadreferentie per tag, event en browser.
De 3 types
Reflected
Input komt direct terug in de response (URL-param, zoekveld).
Stored
Input wordt opgeslagen en later getoond (comment, profiel).
DOM-based
Client-side JS schrijft een source in een gevaarlijke sink.
Analyse van de context
Context -> payload
| Wat je in de source ziet | Passende payload |
|---|---|
<script> weggestript | event handler: <img src=x onerror=alert(1)> |
| keyword wordt 1x verwijderd | geneste variant: <imgimg ... onerroronerror...> |
| input zit in een attribuut | breakout: "><script>... of " onfocus=alert(1) autofocus x=" |
| quotes geblokkeerd | HTML-encoding: '-alert(1)-' |
| niets in HTML, wel in JS | F12 -> Sources: zoek innerHTML / document.write |
Payload-toolkit
Handige testplekken
| Plek | Wat test je ermee? | Signaal |
|---|---|---|
?q=<payload> | Reflected XSS in URL-parameters. | Payload komt direct terug in HTML. |
#<payload> | DOM-based XSS via location.hash. | Geen serverrequest nodig, maar JS leest de hash. |
Formveld zoals name= of message= | Stored of reflected XSS. | Payload verschijnt later op dezelfde of een adminpagina. |
| Hidden field | Client-side beperking omzeilen. | Waarde wordt toch server-side verwerkt of getoond. |
Referer header | XSS in logs of adminviews. | Headerwaarde verschijnt in een dashboard. |
User-Agent header | XSS in request logging. | Admin/logpagina rendert de header als HTML. |
JSON body zoals {"name":"<payload>"} | API-output die later in DOM komt. | Frontend schrijft API-data met innerHTML. |
Goed om te weten
Chrome blokkeert alert()
Chrome blokkeert alert()
Vanaf Chrome 92 is
alert() in een cross-origin iframe geblokkeerd. print() is dan een alternatief als PoC.DOM sources & sinks
DOM sources & sinks
Sources (attacker-controlled):
location, location.hash, location.search, document.cookie, document.referrer, window.name, localStorage.Sinks (gevaarlijk): innerHTML, document.write(), eval(), location.href, element.srcdoc.Wat kan je met XSS?
Wat kan je met XSS?
Session hijacking (
document.cookie zonder HttpOnly) ; credential harvesting ; CSRF-token stelen ; keylogging ; redirecten ; acties uitvoeren als het slachtoffer.Tools
Browser DevTools
Referentie voor HTML-context, console errors, sources en DOM-sinks.
PortSwigger XSS cheat sheet
Zoek payloads per tag, event handler en browser.
Burp Suite
Handig voor Repeater, payloadvarianten en responsevergelijking.
mechanize
Pythonbibliotheek die in scripts meerdere payloadvarianten kan aflopen.