Maison > Article > développement back-end > Une analyse approfondie des vulnérabilités d'inclusion de fichiers PHP
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.
Étude recommandée : "Tutoriel vidéo PHP"
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.
Un attaquant peut utiliser cette vulnérabilité pour lire des fichiers arbitraires et obtenir des informations sensibles sur le serveur.
L'existence de cette vulnérabilité n'a rien à voir avec la version
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.
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!