Dans PHP, la fonction show_source () (aliasée comme highlight_file () ) est utilisée pour afficher le code source du fichier spécifié dans un format avec la syntaxe en surbrillance. Il est souvent utilisé pour déboguer ou afficher des extraits de code. Cependant, si le chemin d'entrée n'est pas strictement vérifié lorsque le show_source () est appelé, une attaque de traversée de chemin peut être déclenchée, entraînant une fuite de fichiers sensibles et provoquant de sérieux risques de sécurité.
Le chemin d'attaque de traversée fait référence à un attaquant accédant à des fichiers sur le serveur qui n'auraient pas dû être divulgués en manipulant les paramètres de chemin du fichier. Les attaquants utilisent généralement des symboles de saut de répertoire similaires à ... / pour contourner les restrictions d'accès et lire les fichiers sensibles au système (tels que / etc / passwd , fichiers de configuration, informations de connexion de base de données, etc.), provoquant une fuite d'informations.
Exemple de code:
<?php
if (isset($_GET['file'])) {
show_source($_GET['file']);
}
?>
Si l'entrée de $ _get ['fichier'] n'est pas filtrée, un attaquant peut accéder à n'importe quel fichier en demandant ce qui suit:
http://gitbox.net/script.php?file=../../../../etc/passwd
Cela entraînera la sortie directement du serveur du contenu du fichier / etc / passwd , provoquant une fuite d'informations sérieuse.
Répertoire d'accès limité <br> Seul l'accès aux fichiers du répertoire prédéfini est autorisé. Par exemple, définissez le répertoire du fichier qui est autorisé à accéder à AS / var / www / html / sources / , et toute demande doit être trouvée dans ce répertoire:
<?php
$baseDir = '/var/www/html/sources/';
if (isset($_GET['file'])) {
$file = basename($_GET['file']); // Seuls les noms de fichiers sont conservés,Évitez les traversées du répertoire
$path = realpath($baseDir . $file);
if ($path !== false && strpos($path, $baseDir) === 0 && is_file($path)) {
show_source($path);
} else {
echo "Chemin de fichier illégal!";
}
}
?>
Filtrer et vérifier les entrées
Utilisez la fonction Basename () pour supprimer les informations de répertoire dans le chemin.
Combiné avec realPath () pour vérifier le chemin réel du fichier pour s'assurer que le fichier se trouve dans le répertoire spécifié.
Vérifiez que le fichier existe et est un fichier normal.
Désactiver le chemin entrant direct de l'utilisateur <br> Il est préférable de déterminer que le fichier s'affiche via une liste de fichiers prédéfinie ou une table de carte ID, plutôt que de laisser l'utilisateur passer directement le chemin du fichier.
Éteignez l'affichage de la fonction de danger <br> Dans un environnement de production, essayez d'éviter d'exposer la fonction d'affichage du code source ou de définir des restrictions d'autorisation pour éviter un accès non autorisé.
La fonction show_source () elle-même n'a pas de vulnérabilités de sécurité, mais si le chemin d'entrée n'est pas géré soigneusement, il est facile de conduire à des attaques de traversée de chemin et à des informations sensibles au serveur de fuite. La clé pour prévenir est de vérifier strictement le chemin entré par l'utilisateur, de limiter la portée d'accès au fichier et d'éviter tout chemin transmis et exécuté. Grâce aux mesures ci-dessus, les attaques de traversée de chemin peuvent être effectivement empêchées et la sécurité du système peut être assurée.