Cross-Site-Scripting "DOM-basiertes" Beispiele: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Hinweis zur Schwäche des replace-Filters, Variante mit textContent ergänzt |
Beispiel vervollständigt (Zielelement inhalt) |
||
| Zeile 75: | Zeile 75: | ||
*Der Parameter wird nicht als HTML in die Seite geschrieben, sondern als reiner Text: | *Der Parameter wird nicht als HTML in die Seite geschrieben, sondern als reiner Text: | ||
<syntaxhighlight lang="html"> | <syntaxhighlight lang="html"> | ||
<div id="inhalt"></div> | |||
<script> | <script> | ||
if (document.location.href.indexOf("default=") >= 0) { | if (document.location.href.indexOf("default=") >= 0) { | ||
Aktuelle Version vom 28. Oktober 2026, 13:37 Uhr
Cross-Site-Scripting "DOM-basiert"
Um was geht es?
Link
Normale Verhaltensweise
- Über den GET-Parameter default wird der Inhalt dieser Seite generiert
- http://opfer.secure.local/scripts/xss-dom.html?default=Bitte%20auf%20dieser%20Seite%20JavaScript%20ausschalten
Exploit über die URL
HTML Code der Seite
<!DOCTYPE html>
<html>
<body>
<h1>DOM Basiertes Cross Site Scripting (XSS)</h1>
Der Inhalt dieser Seite wird statisch generiert.
<script>
if (document.location.href.indexOf("default=") >= 0) {
var text = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write(decodeURI(text));
}
</script>
</body>
</html>
Wie können wir so etwas Vermeiden?
Auf der Seite des Clients
- JavaScript auf nicht vertrauenswürdigen Seiten abschalten
Auf Seite des Programmierers
- <script>-Tags aus dem Parameter entfernen
<!DOCTYPE html>
<html>
<body>
<h1>DOM Basiertes Cross Site Scripting (XSS)</h1>
Der Inhalt dieser Seite wird statisch generiert.
<script>
if (document.location.href.indexOf("default=") >= 0) {
var text = document.location.href.substring(document.location.href.indexOf("default=")+8);
var parsed = decodeURI(text)
var parsed = parsed.replace("<script>", "Achtung JavaScript Element! ")
var parsed = parsed.replace("<\/script>", " Achtung JavaScript Element! ")
document.write(parsed);
}
</script>
</body>
</html>
Warum auch das nicht reicht
replace("<script>", …)ersetzt nur das erste Vorkommen und unterscheidet Groß- und Kleinschreibung. Andere Wege, Skripte einzuschleusen (zum Beispiel<img src=x onerror=…>), bleiben offen.
Besser: als Text einfügen
- Der Parameter wird nicht als HTML in die Seite geschrieben, sondern als reiner Text:
<div id="inhalt"></div>
<script>
if (document.location.href.indexOf("default=") >= 0) {
var text = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.getElementById("inhalt").textContent = decodeURI(text);
}
</script>
- Animation dazu: Cross-Site-Scripting (einfach)


