Maison > développement back-end > tutoriel php > Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

藏色散人
Libérer: 2023-04-05 17:16:02
avant
3216 Les gens l'ont consulté

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

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 :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

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
Copier après la connexion

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.

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

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
Copier après la connexion
La première ligne de la fonction run instancie un Classe de requête et attribuée à $request. Appelez ensuite routeCheck($request,$config) :

Ici, Route::check est appelé pour la détection d'itinéraire. La fonction est la suivante :

Faites attention à la partie police rouge. Correspond à la première étape du début, qui consiste à appeler la fonction méthode pour la couverture variable. Les propriétés qui doivent être remplacées ici sont $this->filter, $this->method, $this->get. Étant donné que la valeur de retour de $request->method() est $this->method, cette valeur doit également être contrôlée. La valeur de retour ici est affectée à $method, puis la valeur de self::$rules[$method] est retirée et donnée à $rules. Notez ici : THINKPHP5 dispose d'un mécanisme de chargement automatique de classe, qui chargera automatiquement certains fichiers dans le répertoire du fournisseur. Cependant, la structure du répertoire des fournisseurs de la version complète et de la version principale est différente.

La structure des répertoires de la version complète est la suivante :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

La structure des répertoires de la version principale est la suivante :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

Vous pouvez voir que la version complète contient plusieurs dossiers de plus que la version principale. Ce qui nécessite une attention particulière, c'est qu'il y a un fichier helper.php dans le dossier think-captcha/src :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

La fonction thinkRoute::get est appelée ici pour enregistrer l'itinéraire . L'impact de cette étape est de changer la valeur de self::$rules mentionnée ci-dessus. Ce n'est qu'avec cet itinéraire que le RCE peut être effectué, sinon il ne réussira pas. C'est pourquoi cela n'affecte que la version complète et non la version principale. A ce moment, la valeur de self::$rules est :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

Ensuite, lorsque l'attaquant contrôle la valeur de $method renvoyée pour être récupérée, la valeur de $rules est-ce des règles de routage. Revenez ensuite à ce qui précède pour obtenir $rules et obtenez la valeur de $item en fonction de l'URL entrante, de sorte que la valeur de $rules[$item] soit le tableau de routage captcha, et vous puissiez en outre appeler self :: fonction parseRule. Le corps de la fonction est légèrement plus long, voici les points clés :

La valeur de $route transmise à ce moment est thinkcaptchaCaptchaController@index. Par conséquent, nous entrons dans la branche if marquée en rouge. Dans cette branche, la valeur correspondant à la clé 'type' de $result est 'method'. Ensuite, $result est renvoyé couche par couche à la fonction d'exécution et affecté à $dispatch.

Ensuite, introduisez $dispatch dans la fonction self::exec :

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 :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

Dans ThinkPHP5. Version 0.2-5.0.23, la fonction de règle convertit $type en minuscules :

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

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é.

Classe de base ThinkPHP5 Demander une analyse de vulnérabilité du code à distance

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!

Étiquettes associées:
source:52bug.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal