XSS vs CSRF
In diesem Abschnitt werden wir die Unterschiede zwischen XSS und CSRF erklären und diskutieren, ob CSRF-Tokens helfen können, XSS-Angriffe zu verhindern.
Was ist der Unterschied zwischen XSS und CSRF?
Cross-Site-Scripting (oder XSS) ermöglicht es einem Angreifer, beliebiges JavaScript im Browser eines Opferbenutzers auszuführen.
Cross-Site Request Forgery (oder CSRF) ermöglicht es einem Angreifer, einen Opferbenutzer dazu zu bringen, Aktionen auszuführen, die er nicht beabsichtigt.
Die Folgen von XSS-Schwachstellen sind im Allgemeinen schwerwiegender als bei CSRF-Schwachstellen:
- CSRF bezieht sich oft nur auf eine Teilmenge der Aktionen, die ein Benutzer ausführen kann. Viele Anwendungen implementieren CSRF-Schutzmaßnahmen im Allgemeinen, übersehen aber ein oder zwei Aktionen, die ungeschützt bleiben. Umgekehrt kann ein erfolgreicher XSS-Exploit einen Benutzer normalerweise dazu veranlassen, jede Aktion auszuführen, die er ausführen kann, unabhängig von der Funktionalität, in der die Schwachstelle auftritt.
- CSRF kann als „einseitige“ Schwachstelle beschrieben werden, da ein Angreifer das Opfer zwar dazu veranlassen kann, eine HTTP-Anfrage zu stellen, aber die Antwort auf diese Anfrage nicht abrufen kann. Im Gegensatz dazu ist XSS eine „Zwei-Wege-Schwachstelle“, da das vom Angreifer eingeschleuste Skript beliebige Anfragen stellen, die Antworten lesen und Daten in eine externe Domäne nach Wahl des Angreifers exfiltrieren kann.
Können CSRF-Tokens XSS-Angriffe verhindern?
Einige XSS-Angriffe können in der Tat durch die effektive Verwendung von CSRF-Tokens verhindert werden. Betrachten Sie eine einfache reflektierte XSS-Schwachstelle, die auf triviale Weise wie folgt ausgenutzt werden kann:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
Nehmen wir nun an, dass die verwundbare Funktion ein CSRF-Token enthält:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
Angenommen, der Server validiert das CSRF-Token ordnungsgemäß und lehnt Anfragen ohne gültiges Token ab, dann verhindert das Token die Ausnutzung der XSS-Schwachstelle. Der Hinweis liegt hier im Namen: „Cross-Site Scripting“, zumindest in seiner reflektierten Form, beinhaltet eine seitenübergreifende Anfrage. Indem ein Angreifer daran gehindert wird, eine seitenübergreifende Anfrage zu fälschen, verhindert die Anwendung die triviale Ausnutzung der XSS-Schwachstelle.
Hier ergeben sich einige wichtige Vorbehalte:
- Wenn eine reflektierte XSS-Schwachstelle an anderer Stelle auf der Website innerhalb einer Funktion besteht, die nicht durch ein CSRF-Token geschützt ist, kann diese XSS auf normale Weise ausgenutzt werden.
- Wenn eine ausnutzbare XSS-Schwachstelle irgendwo auf einer Website vorhanden ist, dann kann die Schwachstelle ausgenutzt werden, um einen Opfer-Benutzer dazu zu bringen, Aktionen auszuführen, selbst wenn diese Aktionen selbst durch CSRF-Tokens geschützt sind. In diesem Fall kann das Skript des Angreifers die entsprechende Seite anfordern, um ein gültiges CSRF-Token zu erhalten, und dann das Token verwenden, um die geschützte Aktion auszuführen.
- CSRF-Tokens bieten keinen Schutz vor gespeicherten XSS-Schwachstellen. Wenn eine Seite, die durch ein CSRF-Token geschützt ist, auch der Ausgabepunkt für eine gespeicherte XSS-Schwachstelle ist, dann kann diese XSS-Schwachstelle auf die übliche Weise ausgenutzt werden, und die XSS-Nutzlast wird ausgeführt, wenn ein Benutzer die Seite besucht.