Les attaques sur le serveur web et les configurations par défaut
Les failles du frontal HTTP (le ver Nimda et la faille Unicode d'IIS), la traversée de répertoires (directory traversal), les mots de passe par défaut, le listage des dossiers, les fichiers oubliés (phpinfo, sauvegardes, .env, .git) et les messages d'erreur trop bavards ; puis la liste de contrôle pour durcir un serveur.
1Situer
Un site peut avoir un code PHP soigné et tomber quand même : parce que le serveur web garde ses réglages d'usine, qu'un fichier de test traîne en ligne, ou qu'un paramètre de téléchargement laisse lire n'importe quel fichier du disque. Ces failles de configuration sont les premières que testent les robots.
2Comprendre
La traversée de répertoires
La page telecharger.php?f=catalogue.txt lit un fichier dans le dossier docs/.
1 / 5
Le frontal HTTP, première cible
Le frontal HTTP, c’est le serveur web qui reçoit les requêtes avant votre code : Apache, Nginx, IIS. S’il a une faille, ou s’il est mal réglé, l’attaquant n’a même pas besoin d’une erreur dans votre PHP.
La leçon reste actuelle : un contrôle fait sur une chaîne de caractères peut être contourné par un autre encodage du même sens, et un correctif existant ne protège que les serveurs mis à jour.
La traversée de répertoires
Les configurations standards
Réglage d’usine
Risque
Correction
admin / admin, MySQL root sans mot de passe
accès direct
mot de passe fort, compte dédié par application
display_errors = On
chemins, requêtes SQL, versions affichés
Off en production, log_errors = On
listage des dossiers (Options Indexes)
tous les fichiers d’un dossier visibles
Options -Indexes
phpinfo.php, install.php laissés en ligne
versions et configuration exposées
supprimer après usage
copies config.php.bak, site.zip, dossier .git
code source et mots de passe téléchargeables
ne rien déposer d’autre que le site
phpMyAdmin accessible à tous
attaques par force brute
accès réservé (IP, VPN) ou désactivé
versions affichées (Server: Apache/2.4.58)
recherche des failles de cette version
ServerTokens Prod, expose_php = Off
Durcir le serveur
Durcir (hardening) un serveur, c’est retirer tout ce qui n’est pas indispensable et changer tous les réglages d’usine : comptes, services, modules, fichiers, ports. On le fait à l’installation, puis on le revérifie à chaque mise à jour, avec une liste de contrôle écrite.
Exemple simple
Le code du cadenas jamais changé
Un cadenas à code vendu réglé sur 0000 : si personne ne change le code, tout le monde connaît la combinaison. Les routeurs, caméras, panneaux d'administration et bases de données livrés avec admin/admin, c'est pareil.
Exemple simple
Le classeur du guichet
Le guichetier vous tend le document dont vous donnez le nom. Si vous demandez « le dossier d'à côté, puis le tiroir du directeur », et qu'il obéit, c'est la traversée de répertoires : ../ remonte d'un dossier à chaque fois.
Publicité
3Manipuler
La page telecharger.php envoie un fichier du dossier docs/. Essayez telecharger.php?fichier=../config.php : le mot de passe de la base s'affiche. Corrigez le téléchargement, puis le compte administrateur resté sur son mot de passe d'usine.
Pas à pas dans le lab ↗Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).
La page s'affichera ici.
Le navigateur demandera /telecharger.php?fichier=catalogue.txt au serveur, qui exécutera le PHP et renverra du HTML.
Entre le navigateur et le serveuraucun échange pour l'instant
Consignes 0 / 5
?fichier=../config.php ne révèle plus le mot de passe (404)
?fichier=....//config.php ne passe pas non plus
Les documents prévus restent téléchargeables
admin / admin est refusé
Le nouveau mot de passe Tajine#Fes2025 fonctionne
4Pratiquer
Exercice 1 · Une liste de contrôle
Avant de mettre Souk Atlas en ligne, listez six vérifications de configuration à faire sur le serveur Apache/PHP/MySQL.
Voir le corrigé
1. Changer tous les mots de passe par défaut (MySQL root, phpMyAdmin, panneau d'hébergement, routeur).
2. Désactiver l'affichage des erreurs (display_errors = Off, log_errors = On).
3. Désactiver le listage des dossiers (Options -Indexes dans Apache).
4. Supprimer les fichiers de test et de sauvegarde : phpinfo.php, install.php, *.bak, *.zip, .git, .env accessibles.
5. Masquer les versions (ServerTokens Prod, ServerSignature Off, expose_php = Off).
6. Mettre à jour Apache, PHP, MySQL et les bibliothèques ; n'ouvrir que les ports 80 et 443 ; ne pas exposer phpMyAdmin publiquement.
Exercice 2 · Le téléchargement sûr avec realpath
Écrivez une version de telecharger.php qui accepte n'importe quel fichier du dossier docs/ (sans liste fixe), mais jamais en dehors, grâce à realpath.
Voir le corrigé
<?php$base=realpath(__DIR__ .'/docs');
$chemin=realpath($base.'/'. ($_GET['fichier'] ??''));
// realpath résout les ../ et les liens : on vérifie que le résultat est bien DANS docs/if ($chemin===false||!str_starts_with($chemin, $base.DIRECTORY_SEPARATOR) ||!is_file($chemin)) {
http_response_code(404);
exit('Fichier introuvable');
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($chemin) .'"');
readfile($chemin);