Beiträge vom 6. Juni 2009

Wie filtern, damit XSS nicht möglich wird?

Samstag, 6. Juni 2009, 15:42 Uhr | Autor:

Es gibt verschiedene Ansätze, wie man XSS-Angriffe abwehren kann.

In einer Blacklist werden die “bösen” Inhalte aufgeführt, die ausgefiltert werden. Hierbei besteht die Gefahr, das etwas vergessen wurde in die Liste aufzunehmen, was dann für einen erfolgreichen Angriff benutzt werden kann.

In einer Whitelist werden die “guten” Inhalte aufgeführt, die zugelassen sind. Hierbei besteht die Gefahr, das etwas vergessen wurde in die Liste aufzunehmen, was dann, obwohl es “gut” ist, automatisch als “böse” eingestuft wird und nicht zugelassen ist.

Wie man erkennt, bleibt bei einem Blacklist-Filter immer ein Restrisiko für einen erfolgreichen Angriff.


Ein kurzes (unvollständiges) Beipiel in PHP für einen Blacklist-Filter:
function xss_black($input) {
   $output = htmlentities($input);
   return $output;
}

htmlentities wandelt alle Zeichen, die eine HTML-Code-Entsprechung haben, in diese Entsprechung um. (Aus < wird &lt;, etc.) Man könnte hier noch weitere Filter hinzuzufügen, strip_tags, trim, etc.

Wenn z.B. der Inhalt von value eines input-TAGs nicht mit Anführungsstrichen umschlossen ist (value=4711 anstatt value="4711"), was nicht zwingend erforderlich ist, so kann trotz der verschiedenen Filter ein Angriff möglich sein. (Mehr dazu in meinem Beispiel.)


Ein kurzes (unvollständiges) Beipiel in PHP für einen Whitelist-Filter:
function xss_white($input) {
   $output = preg_replace('/[^a-zA-Z 0-9]/', '', $input);
   return $output;
}

Dieser Filter lässt nur Buchstaben, Ziffern und Leerzeichen zu, d.h. die Eingabe von “Kaiser Str. 1″ würde zu “Kaiser Str 1″ werden. Alle gewünschten Zeichen müssen dem Filter hinzugefügt werden.


Hier ein kleines Beispiel wie die Ausgabe vor und nach dem White- und Blacklist-Filtern aussieht.

Ich bin ein Freund von Whitelist-Filtern. Ich füge lieber zulässige Zeichen dem Filter hinzu, als mir Gedanken darüber zu machen, mit welchen Zeichenkombinationen oder mir nicht bekannten Zeichensätzen, ein Angriff möglich sein könnte.

Die Ausgabe von h1XSSh1 entmutigt mich mehr als ein \"><h1>XSS</h1>. ;O)

Thema: Sicherheit, XSS | 4 Kommentare