Supposons qu'il y a ce code pour inclure d'autres fichiers PHP à partir d'une entrée utilisateur (oui, je sais que c'est un mauvais choix):
$input = addslashes($_GET["input"]);
if (strpos($input, '../') === false) {
include_once('/path/to/php/files/'.$input);
} else { echo('Invalid parameter!'); }
Ce code ajoute des barres obliques aux citations simples et doubles, puis vérifiez ../
Dans la chaîne, et si cela ne le trouve pas, inclut le fichier.
En supposant que le pirate informatique ait écrit un certain code pour inclure dans d'autres dossiers et que le pirate informatique doit accéder à ce fichier avec ?input=../../folder/extcode
, peut-il y avoir une vulnérabilité ici?
Ce code est vulnérable à LFI lors de l'exécution de systèmes Windows, car ces systèmes accepteront un chemin contenant une traversée d'annuaire qui utilise des glaîtes backslashes (comme \..\..\
).
Ce que vous essayez de bloquer est un LFI, mais je pense que vous êtes toujours vulnérable. Ce type de scénarios est généralement potentiellement vulnérable à la LFI et à la RFI.
Il semble que votre code n'est pas vulnérable à la RFI en raison du préfixe du chemin local. (Lien vers LFI et RFI: https://fr.wikipedia.org/wiki/file_inclusion_vulnérabilité ).
Juste pour clarification, sur RFI, l'attaquant tentera d'inclure un fichier distant à l'aide d'une charge utile comme http://evilsite/evil.php
Et comme vous pouvez le constater, cela ne contient pas '../' dessus. Pour être protégé de cela, vous devez configurer sur votre php.ini le allow_url_include
et assurez-vous que c'est éteint. Sinon, vous pourriez être piraté avec RFI en fonction de l'entrée. Donc, c'est une bonne pratique de la mettre hors tension s'il n'est pas nécessaire.
Parler de LFI, je pense que votre code n'est pas sûr. =Ok Vous bloquez des chaînes telles que "../" Mais peut-être que l'attaquant pourrait l'encoder à contourner votre protection. Comme @ game0ver a dit dans un commentaire, l'attaquant pourrait utiliser la base64 ou le codage de l'URL. Et peut-être plus. Soyez prudent!
Alors, résumant. Vous êtes [~ # ~] pas [~ # ~ ~] Vulnérable à [~ # ~ ~] RFI [~ # ~] Mais, [~ # ~] Oui [~ # ~ # ~] Vous êtes probablement vulnérable à [~ # ~] LFI [~ # ~].
Malheureusement, cela ne semble pas être directement exploitable. Comme indiqué ailleurs dans les commentaires, RFI n'est pas possible en raison du préfixe, et LFI n'est pas possible sous Linux car (je crois), il n'y a aucun moyen d'échapper au strpos
via le codage. =PHP décoderait automatiquement toutes les chaînes codées d'URL avant de la placer dans le $_GET
Super variable, et tout codage qui n'a pas déclenché la recherche strpos
n'enregistrerait pas non plus comme une barre oblique à des fins de l'appel inclus (au moins, je n'ai pas pu trouver de vecteurs d'attaque réussis ). Gardez la réponse de Duskwuff à l'esprit à l'esprit - LFI est possible ici sur Windows.
Cependant, cela ne signifie pas que cela ne peut pas aider. En particulier, Open comprend comme ceci est le genre de vulnérabilité qui vous permet de faire une plus grande vulnérabilité beaucoup plus grande. La pensée immédiate qui me vient à l'esprit est de vérifier si ce site Web dispose d'une fonction de téléchargement d'image n'importe où. Si tel est le cas, et que vous savez où les images sont sauvegardées, vous pouvez essayer l'incorporation de la validité PHP dans les données EXIF d'une image JPG que vous téléchargez ensuite sur le serveur. Normalement, ce code n'est pas exploitable, Parce que vous n'avez pas de toute façon à exécuter votre PHP sur le serveur. Mais, avec une ouverture inclure comme ceci, vous pouvez télécharger votre fichier, puis utiliser cette faiblesse pour l'exécuter (depuis le téléchargement Le fichier existera probablement à l'intérieur /path/to/php/files
L'absence d'une vulnérabilité de LFI pleinement qualifiée n'a pas d'importance). De là, vous pouvez faire ce que vous voulez.
L'utilisation d'une entrée d'utilisateur pour construire un chemin Inclure est presque toujours une mauvaise idée et est rarement nécessaire. Même s'il n'y a pas de faiblesse immédiate, cela ne signifie pas que cela ne peut pas vous aider lors de l'exploitation d'autres.
Je pense que cela vaut la peine de prendre une minute pour expliquer comment quelque chose comme ça devrait être sécurisé. Il est difficile de donner une solution exacte sans plus de contexte, mais généralement, quelque chose comme cela peut être décomposé dans un processus en deux étapes plus sûr:
realpath
pour laisser le système résoudre toutes les tentatives de répertoire-trershasse et obtenir un dernier chemin absoluVous ne voulez jamais laisser l'utilisateur inclure un fichier arbitraire. Déterminez exactement quel fichier sera inclus à la suite de leur entrée de l'utilisateur et filtrez-le à travers un whitelist. C'est la seule façon de le faire de manière sécurisée.