Heim >Backend-Entwicklung >PHP-Tutorial >ThinkPHP5-Kernklasse Fordern Sie eine Remote-Code-Schwachstellenanalyse an
1. Einführung in die Sicherheitslücke
Am 11. Januar 2019 veröffentlichte das ThinkPHP-Team ein Patch-Update zur Behebung von A Es wurde eine Sicherheitslücke bei der Remotecodeausführung entdeckt, die durch unsichere dynamische Funktionsaufrufe verursacht wird. Diese Sicherheitslücke ist sehr schädlich und kann standardmäßig Remotecode ausführen. Nach einer Quellcodeanalyse und -überprüfung für mehrere Versionen von ThinkPHP bestätigten die Sicherheitsforscher von Venus ADLab, dass es sich bei der konkret betroffenen Version um die Vollversion von ThinkPHP 5.0-5.0.23 handelt.
2. Reproduktion der Sicherheitslücke
Die lokale Umgebung verwendet ThinkPHP 5.0.22 Vollversion + PHP5.5.38 + Apache zur Reproduktion. Führen Sie nach der Installation der Umgebung den POC aus, um Systembefehle auszuführen, wie in der Abbildung gezeigt:
3. Schwachstellenanalyse
Laut offizieller Website wurde die heruntergeladene Vollversion von 5.0.22 analysiert und zunächst der Kernpunkt der Schwachstelle lokalisiert:
thinkphp/library/think/Request.php:518
Im zweiten if-Zweig der Methode funktionieren extern kontrollierbare Daten $_POST[Config::get wurde eingeführt ['var_method']. Der Wert von var_method ist _method.
Die __construct-Funktion der Request-Klasse lautet wie folgt:
Da der Parameter $options steuerbar ist, kann ein Angreifer das Filterattribut und das Methodenattribut überschreiben und von dieser Klasse erhalten Der Wert des Attributs. In der param-Funktion der Request-Klasse:
Wenn $this->mergeParam leer ist, wird $this->get(false) hier aufgerufen. Verfolgen Sie die Funktion $this->get:
Die Eingabefunktion $this->wird am Ende der Funktion aufgerufen und $this->get sowie der Wert von $this übergeben ->get ist der Angriff kontrollierbar. Verfolgen Sie die Funktion $this->input:
Diese Funktion ruft $this->getFileter auf, um den Filter zu erhalten. Der Funktionskörper lautet wie folgt:
$this->Der Wert des Filters wird vom Angreifer überschrieben und gesteuert, indem er den Konstruktor aufruft. Nach der Rückgabe des Werts wird die Eingabefunktion eingegeben:
Sehen Sie sich die Funktion filterValue wie folgt an:
Im Aufruf der Funktion call_user_func ist $filter steuerbar und $value ist steuerbar. Daher kann es zu einer Codeausführung kommen.
Prozess zur Auslösung einer Sicherheitslücke:
Starten Sie die Analyse am Einstiegspunkt von ThinkPHP5:
thinkphp/library/think/App.php:77
Die erste Zeile der Ausführungsfunktion instanziiert eine Request-Klasse . Und $request zugewiesen. Rufen Sie dann routeCheck($request,$config) auf:
Hier wird Route::check zur Routenerkennung aufgerufen. Die Funktion ist wie folgt:
Achten Sie auf den roten Schriftteil. Entspricht dem ersten Schritt am Anfang, nämlich dem Aufrufen der Methodenfunktion für die Variablenabdeckung. Die Eigenschaften, die hier überschrieben werden müssen, sind $this->filter, $this->method, $this->get. Da der Rückgabewert von $request->method() $this->method ist, muss dieser Wert ebenfalls kontrolliert werden. Der Rückgabewert wird hier $method zugewiesen, und dann wird der Wert von self::$rules[$method] herausgenommen und an $rules übergeben. Beachten Sie hier: THINKPHP5 verfügt über einen automatischen Klassenlademechanismus, der einige Dateien automatisch in das Herstellerverzeichnis lädt. Allerdings ist die Anbieterverzeichnisstruktur der Vollversion und der Kernversion unterschiedlich.
Die Verzeichnisstruktur der Vollversion ist wie folgt:
Die Verzeichnisstruktur der Kernversion ist wie folgt:
Sie können sehen, dass die Vollversion mehrere Ordner mehr hat als die Kernversion. Was besondere Aufmerksamkeit erfordert, ist, dass sich im Ordner think-captcha/src eine Datei helper.php befindet:
Hier wird die Funktion thinkRoute::get aufgerufen, um die Route zu registrieren . Die Auswirkung dieses Schritts besteht darin, den oben erwähnten Wert von self::$rules zu ändern. Nur mit dieser Route kann RCE durchgeführt werden, andernfalls ist dies nicht möglich. Aus diesem Grund betrifft es nur die Vollversion und nicht die Kernversion. Zu diesem Zeitpunkt ist der Wert von self::$rules:
Wenn der Angreifer dann den Wert von $method kontrolliert, der zurückgegeben wird, um den Wert von $rules abzurufen sind das Routing-Regeln? Gehen Sie dann zurück zum Obigen, um $rules abzurufen und den Wert von $item entsprechend der eingehenden URL abzurufen, sodass der Wert von $rules[$item] das Captcha-Routing-Array ist, und Sie können self: weiter aufrufen: parseRule-Funktion. Der Funktionskörper ist etwas länger, hier sind die wichtigsten Punkte:
Der zu diesem Zeitpunkt übergebene Wert von $route ist thinkcaptchaCaptchaController@index. Daher betreten wir den rot markierten if-Zweig. In diesem Zweig ist der Wert, der dem Schlüssel „type“ von $result entspricht, „method“. Dann wird $result Schicht für Schicht an die Ausführungsfunktion zurückgegeben und $dispatch zugewiesen.
Dann bringen Sie $dispatch in die Funktion self::exec ein:
Geben Sie den rot markierten Zweig ein, der die param-Methode der Request-Klasse aufruft. Daher ist der dritte Schritt der Exploit-Kette erfüllt, wodurch der Befehl ausgeführt wird.
Die Sicherheitsforscher von Venus ADLab analysierten jede Version von ThinkPHP5.0-5.0.23 und stellten fest, dass ThinkPHP5.0.2-5.0.23 denselben POC verwenden kann, während ThinkPHP5.0-5.0.1 geändert werden muss. Werfen wir einen Blick auf den POC. Der Grund liegt in einem kleinen Implementierungsunterschied der Regelfunktion von Route.php.
ThinkPHP5.0-5.0.1 Version thinkphp/library/think/Route.php:235, konvertieren Sie $type in Großbuchstaben:
In ThinkPHP5. In der Version 0.2-5.0.23 konvertiert die Regelfunktion $type in Kleinbuchstaben:
4. Patch-Analyse
In ThinkPHP5. 0.24 wurde die Beurteilung von $this->method hinzugefügt und der freie Aufruf von Klassenfunktionen ist nicht mehr zulässig.
5. Fazit
Es wird dringend empfohlen, dass Benutzer auf ThinkPHP Version 5.0.24 aktualisieren und den Debug-Modus nicht aktivieren Vermeiden Sie es, angegriffen zu werden.
Verwandte Empfehlungen: „PHP-Tutorial“
Das obige ist der detaillierte Inhalt vonThinkPHP5-Kernklasse Fordern Sie eine Remote-Code-Schwachstellenanalyse an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!