1. Introduction à la vulnérabilité
Le 11 janvier 2019, l'équipe ThinkPHP a publié une mise à jour pour corriger A. Une vulnérabilité d'exécution de code à distance causée par des appels de fonctions dynamiques non sécurisés a été découverte. Cette vulnérabilité est très dangereuse et peut exécuter du code à distance par défaut. Après avoir effectué une analyse et une vérification du code source sur plusieurs versions de ThinkPHP, les chercheurs en sécurité de Venus ADLab ont confirmé que la version spécifiquement concernée est la version complète de ThinkPHP 5.0-5.0.23.
2. Reproduction de vulnérabilité
L'environnement local utilise la version complète de ThinkPHP 5.0.22 + PHP5.5.38 + Apache pour se reproduire. Après avoir installé l'environnement, exécutez le POC pour exécuter les commandes système, comme indiqué dans la figure :
Analyse des vulnérabilités
Selon le site officiel La version complète téléchargée de la 5.0.22 a été analysée et les points clés de la vulnérabilité ont d'abord été localisés :
thinkphp/library/think/Request.php:518
Dans la deuxième branche if de la fonction méthode, un message externe données contrôlables $_POST[Config: :get['var_method']. La valeur de var_method est _method.
La fonction __construct de la classe Request est la suivante :
Le paramètre $options étant contrôlable, un attaquant peut remplacer l'attribut filter, l'attribut méthode Et obtenir de cette classe La valeur de l'attribut. Dans la fonction param de la classe Request :
Lorsque $this->mergeParam est vide, $this->get(false) sera appelé ici. Suivez la fonction $this->get :
La fonction $this->input est appelée à la fin de la fonction, et $this->get est transmise, et la valeur de $this ->get est l'attaque contrôlable. Suivez la fonction $this->input :
Cette fonction appelle $this->getFileter pour obtenir le filtre. Le corps de la fonction est le suivant :
$this->La valeur du filtre est remplacée et contrôlée par l'attaquant en appelant le constructeur. Après avoir renvoyé la valeur, il entrera dans la fonction d'entrée :
<. 🎜>Affichez la fonction filterValue comme suit :Dans l'appel de la fonction call_user_func, $filter est contrôlable et $value est contrôlable. Par conséquent, l’exécution de code peut être provoquée.Processus de déclenchement de vulnérabilité :
Démarrer l'analyse depuis le point d'entrée de ThinkPHP5 :thinkphp/library/think/App.php:77
Entrez la branche marquée en rouge, qui appelle la méthode param de la classe Request. Par conséquent, la troisième étape de la chaîne d’exploitation est satisfaite, provoquant l’exécution de la commande.
Les chercheurs en sécurité de Venus ADLab ont analysé chaque version de ThinkPHP5.0-5.0.23 et ont découvert que ThinkPHP5.0.2-5.0.23 peut utiliser le même POC, tandis que ThinkPHP5.0-5.0.1 doit être modifié. Jetons un coup d'œil au POC. La raison réside dans une petite différence d'implémentation de la fonction de règle de Route.php.
ThinkPHP5.0-5.0.1 version thinkphp/library/think/Route.php:235, convertissez $type en majuscule :
Dans ThinkPHP5. Version 0.2-5.0.23, la fonction de règle convertit $type en minuscules :
4. Analyse des correctifs
Dans ThinkPHP5. 0.24, le jugement de la méthode $this->a été ajouté et l'appel libre des fonctions de classe n'est plus autorisé.
5. Conclusion
Il est fortement recommandé aux utilisateurs de mettre à niveau vers ThinkPHP version 5.0.24 et de ne pas activer le mode débogage pour éviter d'être attaqué.
Recommandations associées : "Tutoriel PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!