Maison >développement back-end >tutoriel php >Une analyse approfondie des vulnérabilités d'inclusion de fichiers PHP

Une analyse approfondie des vulnérabilités d'inclusion de fichiers PHP

WBOY
WBOYavant
2022-05-09 17:30:2410814parcourir

Cet article vous apporte des connaissances pertinentes sur PHP, qui introduit principalement des problèmes liés aux vulnérabilités d'inclusion de fichiers. La raison des vulnérabilités d'inclusion de fichiers est que lorsqu'un fichier est introduit via une fonction PHP, le nom du fichier entrant n'a fait l'objet d'aucune vérification raisonnable, des fichiers inattendus ont donc été exploités. J'espère que cela sera utile à tout le monde.

Une analyse approfondie des vulnérabilités d'inclusion de fichiers PHP

Étude recommandée : "Tutoriel vidéo PHP"

Description de la vulnérabilité

La raison de la vulnérabilité d'inclusion de fichier est que lorsqu'un fichier est introduit via une fonction PHP, le nom du fichier entrant n'est pas correctement calibré Par conséquent, des fichiers inattendus sont manipulés, ce qui peut entraîner des fuites de fichiers inattendues ou même une injection de code malveillant.
Les quatre fonctions suivantes provoquent généralement des vulnérabilités d'inclusion de fichiers en PHP :
1. Lorsqu'include() est utilisé pour inclure un fichier, le fichier ne sera inclus que lorsque le code est exécuté dans la fonction include(). Lorsqu'une erreur se produit, seulement un avertissement, continuez.
2. La fonction de include_once() est la même que celle de include(). La différence est que lorsque le même fichier est appelé à plusieurs reprises, le programme ne l'appelle qu'une seule fois.
3. require() appellera le fichier immédiatement dès que le programme est exécuté Lorsqu'une erreur se produit, un message d'erreur sera affiché et le script sera terminé
4. require_once() a la même fonction que require(. ). La différence est que lorsqu'il est appelé à plusieurs reprises. Pour le même fichier, le programme n'est appelé qu'une seule fois.

Risques de la vulnérabilité

Un attaquant peut utiliser cette vulnérabilité pour lire des fichiers arbitraires et obtenir des informations sensibles sur le serveur.

La vulnérabilité affecte la version

L'existence de cette vulnérabilité n'a rien à voir avec la version

Analyse de la vulnérabilité

Lors de l'envoi d'un paquet de données POST à ​​PHP, si le paquet de données contient un bloc de fichier, peu importe si c'est dans le code auquel vous accédez ou non. Pour gérer la logique de téléchargement du fichier, PHP enregistrera ce fichier dans un fichier temporaire (généralement /tmp/php [6 caractères aléatoires]), et le nom du fichier peut être trouvé dans $_FILES variable. Ce fichier temporaire sera supprimé une fois la demande terminée.
En même temps, parce que la page phpinfo imprimera toutes les variables dans le contexte de la requête en cours, donc si on envoie un paquet de données contenant un bloc de fichier à la page phpinfo, on pourra retrouver le contenu de la variable $_FILES dans le retour paquet, qui inclut naturellement également le nom du fichier temporaire.
Lorsqu'une vulnérabilité d'inclusion de fichier ne parvient pas à trouver un fichier exploitable, vous pouvez utiliser cette méthode pour trouver le nom du fichier temporaire, puis l'inclure.
Cependant, le fichier contenant la vulnérabilité et la page phpinfo font généralement deux pages. En théorie, nous devons d'abord envoyer le paquet de données à la page phpinfo, puis faire correspondre le nom de fichier temporaire de la page renvoyée, puis envoyer ce nom de fichier à. le fichier contenant la page de vulnérabilité. A la fin de la première requête, le fichier temporaire est supprimé, et la seconde requête ne peut bien entendu pas être incluse.
À l'heure actuelle, la concurrence conditionnelle doit être utilisée. Le processus spécifique est le suivant :
1) Envoyer un paquet de données de téléchargement contenant un webshell à phpinfo. L'en-tête, le get et les autres positions de ce paquet de données doivent être remplis de données indésirables.
2) phpinfo imprimera toutes les données à ce moment-là, et les données indésirables rendront phpinfo très volumineux.
3) La taille du tampon par défaut de PHP est de 4096, c'est-à-dire que PHP renvoie 4096 octets à la connexion socket à chaque fois.
4) Par conséquent, nous exploitons directement le socket natif et lisons 4096 octets à chaque fois. Tant que les caractères lus contiennent le nom du fichier temporaire, le deuxième paquet de données sera envoyé immédiatement.
5) À l'heure actuelle, la connexion socket du premier paquet de données n'est pas encore terminée, mais PHP continue de générer 4096 octets à chaque fois, le fichier temporaire n'a donc pas été supprimé.
6) Nous pouvons utiliser ce décalage horaire pour réussir à inclure le fichier temporaire et enfin getshell.

Configuration de l'environnement

  1. Démarrer docker :
    service start docker
  2. Exécuter dans le chemin où se trouve le fichier docker-compose.yml :
    docker-compose build
    docker-compose up -d
    Une analyse approfondie des vulnérabilités dinclusion de fichiers PHP

Récurrence de vulnérabilité

  1. Visitez http://your-ip:8080/phpinfo.php, vous pouvez voir la page phpinfo apparaître sur la page
    Une analyse approfondie des vulnérabilités dinclusion de fichiers PHP2 Visitez http://your-ip:8080/lfi.php?file=/. etc/passwd, vous pouvez voir que cette page présente une vulnérabilité d'inclusion de fichiers.
    Une analyse approfondie des vulnérabilités dinclusion de fichiers PHPVérification POC :
    Utilisation : le fichier PHP python3 contient la vulnérabilité_poc.py --target-url http://192.168.60.244:8080
    Une analyse approfondie des vulnérabilités dinclusion de fichiers PHP

Suggestions de réparation

Définissez une liste blanche.

Apprentissage recommandé : "Tutoriel vidéo 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!

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