Cross-Site-Scripting "DOM-basiertes" Beispiele: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Linkai.zhang (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Beispiel vervollständigt (Zielelement inhalt)
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Cross-Site-Scripting “Reflected” =
= Cross-Site-Scripting "DOM-basiert" =


= Um was geht es? =
= Um was geht es? =
Zeile 20: Zeile 20:
== Exploit über die URL ==
== Exploit über die URL ==


* http://opfer.secure.local/scripts/xss-dom.html?default=<script>alert("Hacked%20by%20Xinux")</script>
* 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]]
= HTML Code der Seite =
<syntaxhighlight lang="html">
<!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>
</syntaxhighlight>
= 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
<syntaxhighlight lang="html">
<!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>
</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>&lt;img src=x onerror=…&gt;</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

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>