Cross-Site-Scripting "DOM-basiertes" Beispiele: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Beispiel vervollständigt (Zielelement inhalt) |
|||
| (3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 20: | Zeile 20: | ||
== Exploit über die URL == | == Exploit über die URL == | ||
* http://opfer. | * http://opfer.sec-labs.de/scripts/xss-dom.html?default=%3Cscript%3Ealert(%22Hacked%20by%20Xinux%22)%3C/script%3E | ||
[[Bild:dom-xss-3.png]] | [[Bild:dom-xss-3.png]] | ||
| Zeile 47: | Zeile 47: | ||
* JavaScript auf nicht vertrauenswürdigen Seiten abschalten | * JavaScript auf nicht vertrauenswürdigen Seiten abschalten | ||
= Auf Seite des Programmierers = | == Auf Seite des Programmierers == | ||
* <script>-Tags aus dem Parameter entfernen | * <script>-Tags aus dem Parameter entfernen | ||
| Zeile 69: | Zeile 69: | ||
</html> | </html> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Warum auch das nicht reicht== | |||
*<code>replace("<script>", …)</code> ersetzt nur das <b>erste</b> Vorkommen und unterscheidet Groß- und Kleinschreibung. Andere Wege, Skripte einzuschleusen (zum Beispiel <code><img src=x onerror=…></code>), bleiben offen. | |||
==Besser: als Text einfügen== | |||
*Der Parameter wird nicht als HTML in die Seite geschrieben, sondern als reiner Text: | |||
<syntaxhighlight lang="html"> | |||
<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> | |||
</syntaxhighlight> | |||
*Animation dazu: [https://xinux.org/xss.html Cross-Site-Scripting] ([https://xinux.org/xss-einfach.html einfach]) | |||
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)


