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.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 206 Beiträge
Von
  • Dirk Martin Knop

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)