Maison  >  Article  >  Opération et maintenance  >  Introduction aux vulnérabilités d'exécution de code à distance PHP

Introduction aux vulnérabilités d'exécution de code à distance PHP

王林
王林avant
2020-04-09 15:35:593259parcourir

Introduction aux vulnérabilités d'exécution de code à distance PHP

Avant-propos :

Le 26 septembre 2019, PHP a officiellement publié un bulletin de vulnérabilité. Dans ce bulletin de vulnérabilité, une vulnérabilité d'exécution de code à distance a été officiellement divulguée. est causé par le débordement de env_path_info dans le fichier fpm_main.c en PHP-FPM.

Cette vulnérabilité existe lorsque PHP-FPM + Nginx est utilisé en combinaison avec certaines configurations. Le PoC de cette vulnérabilité a été annoncé le 22 octobre 2019. La combinaison de PHP et Nginx est largement utilisée. Les attaquants peuvent utiliser cette vulnérabilité pour exécuter du code arbitraire à distance, elle est donc plus dangereuse.

Introduction aux composants PHP-FPM

PHP-FPM (FastCGI Process Manager) est une autre implémentation de PHP FastCGI avec quelques fonctionnalités supplémentaires et peut être utilisé sur des sites à différentes échelles, sites particulièrement fréquentés.

Pour PHP avant PHP 5.3.3, PHP-FPM est un package de correctifs conçu pour intégrer la gestion des processus FastCGI dans le package PHP. Si vous utilisez PHP avant PHP 5.3.3, vous devez le patcher dans votre code source PHP et vous pourrez l'utiliser après avoir compilé et installé PHP.

Et PHP 5.3.3 a intégré php-fpm et n'est plus un package tiers. PHP-FPM fournit une meilleure méthode de gestion des processus PHP, qui peut contrôler efficacement la mémoire et les processus, et recharger en douceur la configuration PHP.

(Recommandation de l'étude : Tutoriel vidéo Java)

Description de la vulnérabilité

La vulnérabilité est fpm_main dans PHP-FPM. le débordement de env_path_info dans le fichier c fait que la ligne 1140 du fichier sapi/fpm/fpm/fpm_main.c contient l'arithmétique du pointeur. Ces arithmétiques du pointeur supposent que le préfixe de env_path_info est égal au chemin du script php. Cependant, le code ne vérifie pas si ces hypothèses sont remplies, et le manque de vérifications entraîne un pointeur non valide dans la variable « path_info ».

De telles conditions peuvent être implémentées dans la configuration standard de Nginx. S'il existe une configuration Nginx comme celle-ci :

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_pass   php:9000;
        ...
  }

Un attaquant peut utiliser des caractères de nouvelle ligne (codés en %0a) pour casser l'expression rationnelle dans la directive `fastcgi_split_path_info`. Une expression rationnelle corrompue entraînera un PATH_INFO vide, déclenchant l'erreur.

Cette erreur conduit à une vulnérabilité d'exécution de code. Dans le code derrière, la valeur de path_info[0] est définie sur 0 avant d'appeler FCGI_PUTENV. Un attaquant peut utiliser une longueur de chemin d'URL et une chaîne de requête soigneusement choisies pour faire pointer path_info exactement sur le premier octet de la structure _fcgi_data_seg. Ensuite, y mettre 0 déplace le champ 'char* pos' vers l'arrière, puis FCGI_PUTENV écrase certaines données (y compris d'autres variables cgi rapides) avec le chemin du script.

En utilisant cette technique, un attaquant peut créer une fausse variable fcgi PHP_VALUE puis exécuter du code en utilisant une série de valeurs de configuration soigneusement choisies.

Produits concernés :

PHP-FPM téléchargé avant la mise à jour du 26/09/2019, et la configuration suivante doit être utilisée pour le serveur Nginx + php-fpm, cela sera affecté.

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
 
        fastcgi_pass   php:9000;
        ...
  }

Suggestions de réparation

Si l'entreprise ne nécessite pas la configuration suivante, il est recommandé à l'utilisateur de supprimer :

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;

Tutoriel recommandé : Tutoriel sur la sécurité du serveur

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer