Einige von euch haben sicherlich mal den Begriff „Javascript Injection“ (Oder Cross Site Scripting / XSS) gehört… Es geht in eine ähnliche Richtung wie bei der „SQL Injection„: Mit Hilfe einiger Tricks wird probiert, eigenen Code in fremde Webseiten einzuschleusen.
Grade in Sozialen Netzwerken stellte dies schon öfters ein Problem dar.

Wie funktioniert Javascript Injection?

Bei der Javascript Injection wird fremdes Javascript z.B. mit Hilfe eines Formulares auf der Seite gespeichert (Typisches Beispiel: Kommentarfunktion). Sollte dieses Formular nicht entsprechend gefiltert werden, wird einem dadurch Tür und Tor geöffnet, fremde Inhalte oder gar Schadcode in eure Webseite einzubinden… Zum Beispiel durch ein Java-Applet oder Flash. Außerdem lassen sich sämtliche Styles und Ressourcen der Seite ändern.
XSS kann man über ziemlich viele Wege einbinden… Wir gehen mal von einer Textarea auf eurer Seite aus, die 1:1 (also ohne Filterung) ausgegeben wird.

Die einfachste Möglichkeit hierbei ist natürlich:

<script>...</script>

Sollten script Tags allerdings gefiltert werden, gibt es noch eine andere Möglichkeit, die aber nur funktioniert wenn der einfache String „<script>“ entfernt wird…

<scr<script>ipt>...</scr</script>ipt>

Und natürlich gibt es noch andere Möglichkeiten…

Entweder <a href="javascript:...">link</a>
Oder <a onload="...">link</a>

Attribute lassen sich häufig im Zusammenhang mit WYSIWYG Editoren benutzen, da diese nicht ohne weiteres entfernt werden können (z.B. bei Links, Schrift- oder Hintergrundfarben, …).

Bei einzeiligen Textfeldern muss das ganze etwas anders aussehen:

'" onload="...

Das hier ähnelt nun tatsächlich sehr stark der SQL Injection – Durch die einfachen und doppelten Anführungszeichen ist es durchaus möglich, das man mit seiner Eingabe aus dem value Attribut ausbricht – Das gerenderte Ergebnis könnte in etwa so aussehen:

<input type="text" value"'" onload="..." />

Es gibt übrigens diverse Seiten im Internet, die einem dabei helfen XSS mit Hilfe von sogenannten XSS Cheat-Sheets zu lernen und zu verstehen. Es gibt auch vorgefertigte Skripte, die einem helfen Daten zu kodieren.

Wieso vor XSS schützen?

Mal von den Gründen aus der Einleitung abgesehen haben sicherlich schon viele von euch Bekanntschaft mit Webseiten gemacht, die versuchen eurem (Privaten- oder Firmen-) PC mit Hilfe von Sicherheitslücken (sei es nun Java, Flash oder sonstwas) schaden zuzufügen (Viren, Trojaner, …). Stellt euch nun vor das euch sowas auf jeder (ggf. eurer eigenen) Seite oder Forum passieren kann.

Wie kann man sich vor XSS schützen?

Es gibt verschiedene Möglichkeiten – Es sollte grundlegend alles gefiltert werden, was Probleme machen kann (also alle Eingaben von dritten). Es gibt verschiedene Funktionen die wir hierzu benutzen können, wie etwa strip_tags() um sämtliche Tags aus einem String zu entfernen. Anschließend kann mit htmlentities() gearbeitet werden um Sonderzeichen wie einfache und doppelte Hochkommas zu kodieren.

Problematisch wird es leider bei der Nutzung von WYSIWYG Editoren, da man hier nicht einfach strip_tags() benutzen kann… Denn dadurch wäre die ganze Formatierung hin. Nun, okay, seit PHP5 verfügt die strip_tags() Funktion über einen zweiten Parameter, welchen man benutzen kann um erlaubte Tags mitzugeben. Das hilft uns zwar noch nicht mit den Attributen, doch dafür gibt es ja Reguläre Ausdrücke 😉

$string = preg_replace('~<([a-z][a-z0-9]*)[^>]*?(\/?)>~i', '<$1$2>', $string);

Diese Zeile Code wird alle Attribute aus gefundenen Tags entfernen – Für spezifische Reguläre Ausdrücke die alle Attribute außer ‚xyz‘ entfernen müsst ihr leider selbst googlen 😉

Übrigens: Wenn ihr eine Template-Engine benutzt wird es mit etwas Glück eine Option oder Methode geben, die eure Daten für euch filtert.

Eine andere Möglichkeit wäre ein WYSIWYG Editor, der das geschriebene nach Markdown, Wikitext oder einer BB-Code-artigen Syntax konvertiert… Wenn ihr so einen Editor findet, lasst es micht wissen 😉

Mit diesen Worten möchte ich mich für Heute von euch verabschieden und wünsche euch bis zur nächsten Woche:
Happy Coding!

2 comments on “Javascript Injection

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.