…I'll walk into a bar and drink fifteen pints of beer

Wordpress: Sicherheitslücke in 2.8.3

Durch einen Bug in der aktuellen Wordpress-Version ist es möglich, das Passwort eines Benutzers bzw. des Admins zu ändern. Wie auch caschy schreibt, hält sich der mögliche Schaden in Grenzen, solange der Angreifer keinen Zugriff auf das Mailkonto des Admins hat, denn der Angreifer kann dass Passwort nicht auf einen beliebigen Wert setzen. Es wird lediglich die Passwort-Reset-Funktion von Wordpress durchgeführt, ohne dass der betroffene User davon erfährt. Nach einem erneuten Passwort-Reset durch den User kann dieser sein Konto ganz normal benutzen.

Um diese Sicherheitslücke zu schließen, reicht es, in der wp-login.php einige Zeichen einzufügen. So muss die Zeile 190 von

if ( empty( $key ) )

in

if ( empty( $key ) || is_array( $key ) )

geändert werden.

Der Hintergrund dieser Lücke ist, dass der reset_password-Funktion ein Parameter $key übergeben wird, der den Hashwert zum bestätigen der Passwortänderung darstellt. Ist dieser Wert leer, gibt Wordpress in Zeile 190/191 einen Fehler aus

	if ( empty( $key ) )
		return new WP_Error('invalid_key', __('Invalid key'));

Bevor aber geprüft wird, ob $key leer ist, wird ein preg_replace auf den key ausgeführt (Zeile 188)

$key = preg_replace('/[^a-z0-9]/i', '', $key);

Tatsächlich ist mir der Sinn dieser Zeile nicht ganz eindeutig klar; auf jeden Fall gibt preg_replace in diesem Falle einen leeren String zurück, wenn $key nur aus Kombinationen kleiner Buchstaben und Zahlen besteht. Falls jedoch $key ein Array ist, gibt auch preg_replace ein Array zurück. So schließt sich der Kreis zu Zeile 190: Wenn man es schafft, die $key-Variable als Array zu übergeben, wird das Passwort des Users geändert, ohne dass dieser eine Mailbenachrichtigung bekommt, da die Funktion empty($variable) so mit Arrays nicht funktioniert (und für ein nicht-leeres Array false zurückgibt).
Der Angreifer muss es also nur schaffen, den Key als Array zu übergeben. Wie das funktioniert, werde ich hier nicht verraten – wer sich aber für weitere Details der Lücke interessiert, sollte mal hier vorbeischauen.

Es ist sehr leicht, diese Lücke auszunutzen und im Allgemeinen sollte daraus kein großer Schaden entstehen. Ich bitte trotzdem all diejenigen, die im Stande sind, den Exploit anzuwenden, dies nicht zu tun.

Update:
Eine bessere Lösung, statt is_array in Zeile 190:

if ( empty( $key ) || !is_string( $key ) )

August 11, 2009   16 Comments

Horde/IMP: die PHP-IMAP-Lösung?

Nach wie vor landen einige Leute auf meinem Blog, die bei Google nach einem PHP-basiertem IMAP-Client suchen, da ich hier mal eine entsprechende Anfrage veröffentlicht habe. Ich denke, ich bin nun auf eine Lösung bzw. ein entsprechendes Skript gestoßen. Die Uni Braunschweig setzt für ihre Mailaccounts ein Skript namens IMP aus dem Horde-Framework ein, welches allem Anschein nach genau die Ansprüche erfüllt, die ich gestellt habe. Ich habe Horde bisher allerdings weder auf meinem Server getestet, noch mit meinem Mailaccount der Uni intensiver genutzt, die Angaben sind also ohne Gewähr :D Vielleicht konnte ich ja jemandem helfen… ich werde Horde beizeiten auf jeden Fall mal auf meinem Server installieren, dann gibt es mehr Infos.

November 5, 2008   No Comments

Dingshow jetzt auch für nicht-Wordpress-User

Auf Anfragen via identi.ca habe ich nun reagiert, und eine Dingshow-Version geschaffen, die auch ohne Wordpress ihren Dienst tut. PHP wird jedoch trotzdem vorausgesetzt. Zu haben ist die Plain-PHP-Version auf der Dingshow-Projektseite. Markus Merz hat die mitgelieferte MagpieRSS-Version gepatcht, und damit eine PHP-Notice beseitigt. Der Patch ist in dem Archiv noch nicht vorhanden, sobal Markus Merz zu wieder zu erreichen ist, kümmere ich mich darum.
Es sei noch angemerkt, dass mein Hauptaugenmerk bei Dingshow auf dem Wordpress-Plugin liegt, so dass es wahrscheinlich ist, dass das Plugin immer aktueller sein wird, als die Nicht-Plugin-Version.

September 6, 2008   1 Comment

Tutorial: segfaults mit PHP erzeugen

class_Foo.php:

include "class_Foo.php";
 
class Foo
{
     function bar()
     {
          echo "Foobar!";
     }
}

Danach schlicht und einfach die class_Foo.php in einer anderen PHP-datei einbinden (da wo sie gebraucht wird ;) ), und diese im CLI-Interpreter ausführen. Fertig ist der segfault!

May 15, 2008   5 Comments

PHP is trying to kill me… again

Ich krieg’ zu viel. Da habe ich mir gestern eine funktionierende, sprich: das Gewollte matchende RegEx gebaut, die bei allen außer bei mir zu funktionieren scheint. Die Frage ist jetzt, wo der Fehler liegt. Details und Lösungsansätze können im entsprechenden WMP-Thread nachgelesen werden. Ich bin am verzweifeln…

May 8, 2008   3 Comments

Literatur für Webentwickler?

Da ich mittlerweile mit dem Zivildienst fertig bin und somit mehr Zeit für die spaßigen Dinge des Lebens habe, bin ich nun auf der Suche nach interessanter Lektüre über das Webdevelopment im Allgemeinen. Speziell neuere Technologien stehen dabei auf meiner to-read-Liste. Aus diesem Grunde bitte ich um Buchvorschläge. Gesucht werden Bücher, die sich nicht zwangsweise an Programmieranfänger richten, sondern vorhandene Kenntnisse in Richtung Webdevelopment vertiefen. Willkommen sind mir natürlich auch Tutorials und Webseiten.

Haut rein!

May 8, 2008   3 Comments

BTW

kroesus lebt immer noch… auch wenn ich der einzige bin, der commitet ;) Macht mit!

April 10, 2008   No Comments

PHP++?!

Warum eigentlich können Funktionen einer Klasse in PHP 5 (und erst ab dieser Version!) nur über den lästigen Umweg über die Funktion __call() überladen werden? Der C++-Weg ist Meiner Meinung nach doch viel schöner, da müssen einfach nur mehrere Funktionen des gleichen Namens aber mit unterschiedlicher Anzahl an beziehungsweise unterschiedlichen Typen von Parametern erstellt werden. Bei PHP 5 werden der Name und die Parameter der zu überladenen Funktion an die Funktion __call($überladene_Funktion, $parameter_Array) übergeben, in welcher der Programmierer dann regeln muss, dass die richtigen Parameter an die richtige Funktion übergeben werden.

April 8, 2008   4 Comments

Dinge, mit denen ich mich nach dem Zivildienst beschäftigen werde

  • die Templating-Engine Smarty
  • AJAX
  • Reguläre Ausdrücke
  • das PHP-Framework CakePHP

…und natürlich: Faulenzen und Geld verdienen.

April 7, 2008   10 Comments

xt:commerce vs. Filzo: 1 – 0

Ich versuche gerade krampfhaft, die Shopsoftware xt:commerce zu Testzwecken auf meinem MacBook zu installieren, komme aber über 403er und 500er (Internal Server Error) nicht hinaus, und ich habe keine Ahnung, woran das liegt. Die Dateirechte sind soweit ich das beurteilen kann absolut in Ordnung. Auf meiner Linuxkiste läuft das ganze ohne Probleme… naja, dann kann ich eben nicht auf dem MacBook testen :)

April 6, 2008   No Comments