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, JavaScript Code beginnt mit der Ausführung, um den Benutzer abzufangen Daten oder in seinem Namen eine Überweisung auf das Konto des Angreifers vornehmen
Es ist anzumerken, dass die im Namen des Opfers durchgeführten Operationen für das Opfer unsichtbar sein können, da sie im Hintergrund unter Verwendung der Datenbank der Bank stattfinden können. API, 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
<div onclick="change('');alert('XSS')//')">John</div>
- In der
hrefAttribut innerhalb des JavaScript-Protokolls
);alert(1)// wobei %27 ist ein einfaches Anführungszeichen, in
<a href="javascript:change('%27);alert(1)//')">anklicken.</a>
Live-Beispiel
Verteidigungsmethoden
- Datenkodierung mit integrierten Funktionen, die in vielen Programmiersprachen.
- Verwendung von Vorlagensystemen mit automatischer Kodierung. Die meisten der beliebten Frameworks, die solche Systeme verwenden, schützen us vor XSS-Injektion (Django, Vorlagen, Vue, React usw.).
- Verwenden Sie keine Funktionen wie
evaloderFunktionmit 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.textInhaltoderinnerText. - 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
.htmloder.svgDateien. Sie können eine separate Domain erstellen, von der aus die hochgeladenen Dateien bereitgestellt werden. - Verwenden Sie die
Content-Security-PolicyMechanismus. - 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
Lesen Sie mehr:
Strategien zum Abrufen von Daten in NextJS