Cross-Site-Scripting "Reflected" Beispiele: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
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><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") | 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><</code> wird <code>&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!== 0würde nur blockiert, wenn die Eingabe mit<scriptbeginnt.)
<!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<). 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' );
}
?>
- Animation dazu: Cross-Site-Scripting (einfach)



