Aller au contenu
M08 · A. Introduire la sécurité informatique

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
/var/www/souk/ config.php telecharger.php docs/ catalogue.txt conditions.txt ?f=catalogue.txt docs/catalogue.txt DB_PASS = 'Kz7!pQ2…' le secret est envoyé 404 : fichier non permis liste blanche

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’usineRisqueCorrection
admin / admin, MySQL root sans mot de passeaccès directmot de passe fort, compte dédié par application
display_errors = Onchemins, requêtes SQL, versions affichésOff en production, log_errors = On
listage des dossiers (Options Indexes)tous les fichiers d’un dossier visiblesOptions -Indexes
phpinfo.php, install.php laissés en ligneversions et configuration exposéessupprimer après usage
copies config.php.bak, site.zip, dossier .gitcode source et mots de passe téléchargeablesne rien déposer d’autre que le site
phpMyAdmin accessible à tousattaques par force bruteaccès réservé (IP, VPN) ou désactivé
versions affichées (Server: Apache/2.4.58)recherche des failles de cette versionServerTokens 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.

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 serveur aucun échange pour l'instant

Consignes 0 / 5

  1. ?fichier=../config.php ne révèle plus le mot de passe (404)
  2. ?fichier=....//config.php ne passe pas non plus
  3. Les documents prévus restent téléchargeables
  4. admin / admin est refusé
  5. 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);

5Vérifier

1. Que fait la séquence ../ dans un chemin de fichier ?
2. Pourquoi supprimer un fichier phpinfo.php oublié sur le serveur ?
3. Comment le ver Nimda (2001) entrait-il dans les serveurs IIS ?