Gefährliche Regular Expressions für PHP

RedTeam Pentesting hat bei der Untersuchung von phpBannerExchange eine Schwachstelle bei der Überprüfung von Benutzereingaben mit Regular Expressions gefunden.

In Pocket speichern vorlesen Druckansicht 206 Kommentare lesen
Lesezeit: 2 Min.
Von

RedTeam Pentesting hat bei der Untersuchung der Software phpBannerExchange eine Schwachstelle bei der Überprüfung von Benutzereingaben gefunden. Dazu nutzt phpBannerExchange die PHP-Funktion eregi(), die zur Suche mit Regular Expressions (regexp) dient. Diese Funktion kommt jedoch mit binären Eingaben nicht zurecht. Darüber hinaus hat RedTeam Pentesting einige MySQL-Injection-Schwachstellen gefunden.

Die PHP-Funktion eregi() ist in C programmiert. An sie übergebene Zeichenketten mit NULL-Terminierungszeichen ("\0") werden daher laut RedTeam Pentesting hinter dem NULL-Zeichen nicht weiter analysiert, aber trotzdem weitergereicht. So ist es einem Angreifer möglich, etwa in phpBannerExchange mit der URL http://example.com/phpbe/resetpw.php?submit=&email=attacker@example.com%00'or email='victim@example.com an die E-Mail-Adresse attacker@example.com das Passwort von victim@example.com schicken zu lassen.

Dieses Verhalten von eregi() ist keine neue Erkenntnis, ein Eintrag im Bugtracking-System von PHP dazu datiert vom Jahr 2002. Die lapidare Antwort: eregi() ist nicht "binary safe"; dies bedeutet, nur Textzeichen lassen sich mit den ereg_*-Funktionen überprüfen. In der PHP-Dokumentation zu Regular Expressions wird hierauf auch mit einer Warnung hingewiesen. Allerdings liest nicht unbedingt jeder PHP-Programmierer die vollständige Dokumentation; sie könnten dieses wichtige Detail auch einfach übersehen haben.

Nutzer von phpBannerExchange sollten auf die aktuelle Version der Software aktualisieren; PHP-Programmierer, die Benutzereingaben mit Regular Expressions durch eregi() überprüfen, umgehen das Problem mit der PHP-Option Magic Quotes, die Sonderzeichen wie ', ", \ und NULL in einer an das Skript übergebenen Zeichenkette automatisch ein Backslash (\) voranstellt. Sauberer wäre allerdings der Einsatz der Perl-Syntax-kompatiblen preg_*-Funktionen.

Siehe dazu auch: (dmk)