XSS-Angriffe ermöglichen es Angreifern, clientseitige Skripte in Webseiten einzuschleusen, die von anderen Benutzern aufgerufen werden. Die wichtigsten Auswirkungen dieser Schwachstelle sind die Möglichkeit, beliebige Aktionen im Kontext des angemeldeten Benutzers auszuführen und beliebige Daten im Kontext des angemeldeten Benutzers zu lesen.
Angriffsszenario
Der Angreifer findet die XSS-Schwachstelle auf einer vom Opfer genutzten Website, z. B. auf der Website einer Bank
Das Opfer ist derzeit auf dieser Seite angemeldet
Der Angreifer sendet dem Opfer eine manipulierte URL
Das Opfer klickt auf die URL
Auf der Seite des Opfers Bank Website, JavaScriptCode beginnt mit der Ausführung, um die Daten des Nutzers abzufangen oder in seinem Namen eine Überweisung auf das Konto des Angreifers vorzunehmen
Es ist anzumerken, dass die im Namen des Opfers durchgeführten Operationen für das Opfer unsichtbar sein können, da sie im Hintergrund über die API der Bank erfolgen können, oder der Angreifer kann sie später mit den für die Authentifizierung erforderlichen Daten, Token, Cookies usw. durchführen.
XSS-Typen
1. Reflektiertes XSS
Hier wird der HTML/JavaScript-Code, der in einem beliebigen Parameter (z. B. GET, POST oder Cookie) enthalten ist, als Antwort angezeigt.
Eine Seite mit einer Texteingabe zur Suche nach etwas, das den Parameter ?search=foo in der URL-Endung, wenn Sie die API abfragen. Nach der Eingabe einer beliebigen Phrase, wenn sie nicht gefunden wird, wird eine Rückmeldung in HTML ex.
<div>Kein Ergebnis gefunden für <b>foo</b></div>
Wir können versuchen, die URL einzugeben ?search=..
2.DOM XSS
Dies ist der Fall, wenn seine Ausführung durch die Verwendung gefährlicher Funktionen in JavaScript ermöglicht wird, wie z. B. Wert oder `innerHtml`. Das folgende "Live-Beispiel" zeigt einen DOM-XSS-Angriff auf der Grundlage der `innerHtml` Funktion.
3. Gespeicherte XSS
In diesem Fall wird der bösartige Code auf der Serverseite geschrieben. Wir können zum Beispiel einen Kommentar mit bösartigem Code an einen Blogbeitrag senden, der auf den Server hochgeladen wird. Seine Aufgabe besteht beispielsweise darin, auf die Moderation des Administrators zu warten und dann seine Sitzungsdaten zu stehlen usw.
Injektionsverfahren
1. Im Tag-Inhalt
`onerror=alert('XSS')`in
<img src onerror="alert('XSS')" />
2. Im Inhalt des Attributs
`" onmouseover=alert('XSS')` in
<div class="" onmouseover="alert('XSS')""></div>
Im Inhalt des Attributs ohne die Anführungszeichen
x onclick=alert('XSS')in
<div class="x" onclick="alert('XSS')"></div>
In der hrefef-Attribut
javascript:alert('XSS') in
<a href="javascript:alert('XSS')"></a>
In der Zeichenfolge innerhalb des JavaScript-Codes
";alert('XSS')// in
<script>let username="";alert('XSS')//";</script>
In dem Attribut mit dem Ereignis JavaScript
');alert('XSS')// wobei ' ist ein einfaches Anführungszeichen, in
Datenkodierung mit integrierten Funktionen, die in vielen Programmiersprachen.
Verwendung von Templatesystemen mit automatischer Kodierung. Die meisten der beliebten Frameworks, die solche Systeme verwenden, schützen uns vor XSS-Injektion (Django, Templates, Vue, React usw.).
Verwenden Sie keine Funktionen wie eval oder Funktion mit nicht vertrauenswürdigen Benutzerdaten.
Verwenden Sie keine Funktionen und Eigenschaften, die HTML-Code direkt den DOM-Baumelementen zuweisen, z.B., innerHTML, outerHTML, insertAdjacentHTML, ocument.write. Stattdessen können Sie Funktionen verwenden, die diesen Elementen direkt Text zuweisen, wie z. B. textInhalt oder innerText.
Seien Sie vorsichtig, wenn Sie den Benutzer zu einer URL umleiten, die unter seiner Kontrolle steht. Risiko der Injektion location = 'javascript('XSS')'.
HTML-Filter mit Bibliotheken wie DOMPurify.
Seien Sie vorsichtig beim Hochladen .html oder .svg Dateien. Sie können eine separate Domain erstellen, von der aus die hochgeladenen Dateien bereitgestellt werden.
Verwenden Sie die Content-Security-Policy Mechanismus.
Werfen Sie einen Blick auf die in den meisten gängigen Browsern integrierten Anti-XSS-Filter.
Wenn Sie diesen Artikel interessant finden, folgen Sie Lukasz auf Github: https://github.com/twistezo