Open Source im professionellen Einsatz

Mediawiki: XSS-Attacke über Sprachparameter

Mediawiki verwaltet Inhalte in Form eines Wiki-Systems, so dass Benutzer diese via Browser verändern können. Die Webanwendung ist PHP-basiert und läuft unter anderem mit MySQL-Datenbanken. Eine kürzlich entdeckte Sicherheitslücke in Mediawiki hat zur Folge, dass ein entfernter Angreifer Cross-Site-Skripting-Attacken (XSS) mit Hilfe geschickt konstruierter URLs ausführen kann.

Die Ursache ist ein Programmierfehler beim Verarbeiten der Variablen "userlang" .

Eine Exploit-URL könnte wie folgt aussehen:

http://example.com/wiki/Main_Page?userlang=a%27%20onmouseover=eval(alert(1))%20e=%27

Hierdurch wird eine "alert()"-Box im Browser des Opfers geöffnet. Die verantwortliche Schwachstelle befindet sich in der Datei "includes/SkinTemplate.php". Dort finden sich in der fehlerhaften Version folgende Zeilen in der Funktion "outputPage()":

if ( $userlang !== $wgContLang->getHtmlCode() || $userdir !== $wgContLang->getDir() ) {
 $attrs = " lang='$userlang' dir='$userdir'";
 $tpl->set( 'userlangattributes', $attrs );
}

In dieser If-Anweisung werden über "$userlang" Spracheinstellungen vorgenommen. Allerdings hat der Programmierer hier vergessen, dass ein Angreifer durch die URL direkte Kontrolle über "$userlang" besitzt. Daher ist es ratsam, diese Variable auf spezielle Zeichen zu filtern, um etwaige Attacken zu verhindern. Dies wurde hier allerdings versäumt. Die korrigierte Fassung der Funktion "outputPage()" verwendet die dafür vorgesehene Funktion "htmlspecialchars()":

if ( $userlang !== $wgContLang->getHtmlCode() || $userdir !== $wgContLang->getDir() ) {
 $escUserlang = htmlspecialchars( $userlang );
 $escUserdir = htmlspecialchars( $userdir );
 // Attributes must be in double quotes because htmlspecialchars() doesn't
 // escape single quotes
 $attrs = " lang=\"$escUserlang\" dir=\"$escUserdir\"";
 $tpl->set( 'userlangattributes', $attrs );
}

Interessant hierbei ist, dass trotz "htmlspecialchars()" die Variablen "$escUserlang" und "$escUserdi"r Variablen noch in Double-Quotes gesetzt werden müssen, wie im Kommentar erläutert. Mit diesem Patch ist die XSS-Attacke nicht mehr möglich.

Betroffen sind die Versionen vor 1.17.5, 1.18.4 und 1.19.1.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.