Wenn eine Webseite fremden Code ausführt
Cross-Site-Scripting, kurz XSS, ist ein Fehler, bei dem eine Webseite Text von Nutzenden als Programmcode in den Browser eines anderen Menschen schreibt. So kann ein Angreifer in fremdem Namen handeln.
Du lernst, wie man das erkennt und mit Maskieren verhindert. Die Regel: Du übst nur an der Webseite deiner eigenen Lab-Kopie, nie an einer fremden Seite und nie ohne Erlaubnis.
Am Ende dieser Lektion
Notiz
Ich kann Cross-Site-Scripting erkennen und mit Maskieren verhindern.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| HTML | die Sprache, in der eine Webseite beschrieben wird | |
| Skript | ein kleines Programm, das im Browser läuft | JavaScript |
| XSS | Cross-Site-Scripting: fremder Code läuft in deiner Seite | |
| Maskieren | Sonderzeichen in harmlosen Text umwandeln | |
| Sitzung | der Zustand, in dem dich eine Seite als angemeldet kennt | |
| Eingabe | Text, den ein Mensch in ein Feld tippt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wie entsteht XSS?
Eine Seite begrüßt dich mit deinem Namen: <p>Hallo Mia</p>. Der Name wurde einfach in den HTML-Text hineingeklebt.
Gibt jemand als Namen <b>Mia</b> ein, zeigt der Browser den Namen fett. Er hält den Text für HTML. Der Browser kann nicht wissen, was die Seite gemeint hat.
Ein Name wird zu HTML
name = "<b>Mia</b>"
seite = "<p>Hallo " + name + "</p>"
print(seite)
# Der Browser würde Mia fett zeigen: Der Name wurde als HTML gelesen.
# Ändere den Namen in "Mia" und starte noch einmal.
Warum ist das gefährlich?
Statt <b> kann jemand ein <script>-Element eingeben. Ein Skript läuft im Browser mit den Rechten der Seite. Es kann Inhalte ändern und die Sitzung der Besucherin lesen, mit der sie angemeldet ist.
Bei gespeichertem XSS steht der Text in einem Kommentar oder einem Profil. Jede Person, die es öffnet, führt ihn aus.
Wie verhindert man XSS?
Man maskiert die Eingabe, bevor man sie in HTML schreibt. Die Zeichen, die HTML etwas bedeuten, werden durch harmlose Ersatztexte ersetzt. Aus < wird <, aus > wird >.
Der Browser zeigt dann das Zeichen an und führt nichts aus. Der Name steht auf der Seite, aber er ist nur Text.
Diese Zeichen ersetzt man
| Zeichen | Ersatztext | Wofür das Zeichen in HTML steht |
|---|---|---|
| & | & | Beginn eines Ersatztexts |
| < | < | Beginn eines Elements |
| > | > | Ende eines Elements |
| " | " | Ende eines Werts in Anführungszeichen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Maskieren mit der Python-Bibliothek
import html
eingabe = '<b>"Hallo" & Willkommen</b>'
print(html.escape(eingabe))
# Ändere die Eingabe und schau, was sich ändert.
Ein häufiger Fehler
Warnung
Viele denken, es genüge, das Wort „script“ zu verbieten. Das stimmt nicht, denn es gibt viele andere Wege, Code in HTML zu schreiben. Maskiere immer jede Eingabe, die du ausgibst. Dann ist es egal, was darin steht.
Warum kommt das &-Zeichen zuerst?
Beim Maskieren muss man mit dem & beginnen. Ersetzt man zuerst < durch < und danach & durch &, würde aus < der Text &lt;.
Dann stünde auf der Seite nicht mehr das Zeichen <, sondern der Text „<“. Zuerst &, dann alle anderen Zeichen.
Die eine Regel
Warnung
Drück oben auf Lab starten und warte, bis DVWA läuft. DVWA ist absichtlich unsicher und deine eigene Kopie ohne Weg ins Internet. Was du hier lernst, richtest du nie gegen eine Seite, die dir nicht gehört.
Was du im Lab ansiehst
Drück auf Öffnen und melde dich als admin mit dem Passwort password an. Öffne die Seite „DVWA Security“ und stelle die Stufe auf Low. In der Menüleiste siehst du die Übungen, darunter zwei zu XSS.
Auf jeder Übungsseite zeigt der Knopf „View Source“ den Code der Seite. Vergleiche den Code bei Low mit dem bei High. Achte darauf, was bei High mit der Eingabe geschieht, bevor sie ausgegeben wird.