Cross-Site-Scripting "Reflected" Beispiele: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Linkai.zhang (Diskussion | Beiträge)
Filterbedingung korrigiert (=== false), Umgehung und sichere Ausgabe ergänzt
 
Zeile 45: Zeile 45:
</syntaxhighlight>
</syntaxhighlight>
=Wie können wir so etwas Vermeiden?=
=Wie können wir so etwas Vermeiden?=
*Wir fügen der If Klausel ein weiteres Argument mit, nämlich das die Eingabe nur ausgeführt werden soll, wenn kein "<script" enthalten ist
*Wir fügen der If Klausel ein weiteres Argument mit, nämlich das die Eingabe nur ausgeführt werden soll, wenn kein "<script" enthalten ist (<code>=== false</code>: "kommt gar nicht vor". Mit <code>!== 0</code> würde nur blockiert, wenn die Eingabe mit <code>&lt;script</code> <i>beginnt</i>.)
<syntaxhighlight lang=html>
<syntaxhighlight lang=html>
<!DOCTYPE html>
<!DOCTYPE html>
Zeile 59: Zeile 59:
                 </form>
                 </form>
<?php
<?php
if( $_GET[ 'name' ] != NULL && stripos($_GET['name'], "<script") !== 0 ) {
if( $_GET[ 'name' ] != NULL && stripos($_GET['name'], "<script") === false ) {
echo 'Hello ' . $_GET[ 'name' ]  ;
echo 'Hello ' . $_GET[ 'name' ]  ;
}
}
Zeile 66: Zeile 66:
  </html>
  </html>
</syntaxhighlight>
</syntaxhighlight>
==Warum dieser Filter nicht reicht==
*Ein Filter auf einzelne Wörter lässt sich umgehen, zum Beispiel mit einem Bild, das einen Fehler auslöst. Das Beispiel stammt aus den DVWA-Übungen (Stufe High):
<img src=x onerror=alert("xinux")>
*Das Wort "<script" kommt darin nicht vor, der Schadcode läuft trotzdem.
==Besser: die Ausgabe absichern==
*Alle Eingaben gelten als unsicher. Vor der Ausgabe werden die HTML-Metazeichen durch Zeichenreferenzen ersetzt (aus <code>&lt;</code> wird <code>&amp;lt;</code>). Der Browser zeigt den Text dann an und führt ihn nicht aus.
<syntaxhighlight lang=php>
<?php
if( $_GET[ 'name' ] != NULL ) {
echo 'Hello ' . htmlspecialchars( $_GET[ 'name' ], ENT_QUOTES, 'UTF-8' );
}
?>
</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 "Reflected"

Um was geht es?

Link

Eingabe Skript

Normale Verhaltensweise

Einfügen und generieren des Schadcodes

<script>alert("Hacked by Xinux")</script>

Dieses Popup Fenster geht nun auf

  • Es wird auf jedem Rechner aufgehen der den generierten Link aufruft

Den generierten Link können wir nun an die Opfer versenden

Hier nun der Code zu diesem Beispiel

  • Bei diesem Eingabeformular wird der eingegebene Text unterhalb des Eingabefeldes wieder ausgegeben.
<!DOCTYPE html>
 <html>
        <body>
        <h1>Vulnerability: Reflected Cross Site Scripting (XSS)</h1>
                <form name="XSS" action="#" method="GET">
                        <p>
                                What's your name?
                                <input type="text" name="name">
                                <input type="submit" value="Submit">
                        </p>
                </form>
<?php
if( $_GET[ 'name' ] != NULL ) {
    echo 'Hello ' . $_GET[ 'name' ]  ;
}
?>
         </body>
 </html>

Wie können wir so etwas Vermeiden?

  • Wir fügen der If Klausel ein weiteres Argument mit, nämlich das die Eingabe nur ausgeführt werden soll, wenn kein "<script" enthalten ist (=== false: "kommt gar nicht vor". Mit !== 0 würde nur blockiert, wenn die Eingabe mit <script beginnt.)
<!DOCTYPE html>
 <html>
        <body>
        <h1>Vulnerability: Reflected Cross Site Scripting (XSS)</h1>
                <form name="XSS" action="#" method="GET">
                        <p>
                                What's your name?
                                <input type="text" name="name">
                                <input type="submit" value="Submit">
                        </p>
                </form>
<?php
if( $_GET[ 'name' ] != NULL && stripos($_GET['name'], "<script") === false ) {
	echo 'Hello ' . $_GET[ 'name' ]  ;
	}
?>
         </body>
 </html>

Warum dieser Filter nicht reicht

  • Ein Filter auf einzelne Wörter lässt sich umgehen, zum Beispiel mit einem Bild, das einen Fehler auslöst. Das Beispiel stammt aus den DVWA-Übungen (Stufe High):
<img src=x onerror=alert("xinux")>
  • Das Wort "<script" kommt darin nicht vor, der Schadcode läuft trotzdem.

Besser: die Ausgabe absichern

  • Alle Eingaben gelten als unsicher. Vor der Ausgabe werden die HTML-Metazeichen durch Zeichenreferenzen ersetzt (aus < wird &lt;). Der Browser zeigt den Text dann an und führt ihn nicht aus.
<?php
if( $_GET[ 'name' ] != NULL ) {
	echo 'Hello ' . htmlspecialchars( $_GET[ 'name' ], ENT_QUOTES, 'UTF-8' );
}
?>