En bref : un fichier PHP dans le dossier de téléversement est un signal d'alerte sérieux, car il ne devrait s'y trouver que des images et des documents. N'ouvrez jamais le fichier dans le navigateur, mais lisez-le comme texte, vérifiez l'horodatage et le propriétaire et cherchez le nom du fichier dans les journaux d'accès. Seuls les fichiers factices vides, comme un index.php sans contenu, sont le plus souvent inoffensifs ; traitez tout le reste comme une intrusion possible.
Pourquoi PHP n'a rien à faire dans le dossier de téléversement
Les dossiers de téléversement sont destinés aux contenus que téléversent visiteurs ou rédacteurs : images, PDF, vidéos. L'utilisateur du serveur web y a le droit d'écrire, sinon les téléversements ne fonctionnent pas. C'est précisément ce qui rend ces dossiers attrayants pour les attaquants. Qui peut écrire des fichiers via une faille les dépose là où l'écriture est permise.
Selon les rapports dont nous disposons, de nouveaux fichiers PHP dans les dossiers de téléversement ou de cache comptent parmi les signaux d'alerte généraux après une intrusion. Pour PHP2Shell, il n'existe pas d'indicateurs de compromission (Indicators of Compromise) confirmés ; une découverte ne dit donc rien sur la faille par laquelle le fichier est arrivé. La façon de construire des fonctions de téléversement sûres est décrite dans Mettre en œuvre en toute sécurité les téléversements de fichiers en PHP.
La configuration du serveur web décide si un tel fichier peut causer des dégâts. S'il exécute des fichiers PHP dans le dossier de téléversement, chaque fichier qui y est déposé devient un contrôle à distance potentiel. Si l'exécution y est bloquée, le fichier reste un corps étranger, mais d'abord sans effet. De nombreuses installations n'ont jamais mis en place ce blocage.
Comment un fichier PHP arrive-t-il dans le dossier de téléversement ?
Pour l'évaluation, il est utile de connaître les voies possibles. Chacune conduit à d'autres questions de suivi.
| Voie | Contexte typique | Question de suivi |
|---|---|---|
| Formulaire de téléversement non sûr | vérification de la seule extension ou du type annoncé par le navigateur | Quels formulaires acceptent des fichiers ? |
| Faille dans une extension ou un thème | vulnérabilité connue dans une extension obsolète | Quelles extensions sont obsolètes ? |
| Identifiants volés | compte administrateur, FTP ou d'hébergement | Quelles connexions y a-t-il eu récemment ? |
| Exécution de code via une faille | par exemple dans l'interpréteur, comme possible avec PHP2Shell | PHP était-il vulnérable pendant la période ? |
| Extension légitime | fichier factice, rarement fichiers de cache | Le fichier appartient-il au paquet d'origine ? |
Plusieurs voies peuvent se combiner. Un attaquant qui exécute du code via une faille ne dépose peut-être le fichier que pour revenir plus commodément plus tard.
Lister systématiquement les emplacements
Avant d'évaluer un fichier isolé, faites-vous une vue d'ensemble. Les commandes ne font que lire. Les chemins sont des exemples pour WordPress ; pour d'autres systèmes, adaptez le chemin de téléversement.
# Fichiers de type PHP dans le dossier de téléversement avec taille, propriétaire, mtime et ctime
find /var/www/html/wp-content/uploads -type f \
\( -iname "*.php*" -o -iname "*.phtml" -o -iname "*.phar" -o -iname ".htaccess" -o -iname ".user.ini" \) \
-printf '%s Bytes %u m:%T+ c:%C+ %p\n'
# Déterminer le type de fichier par le contenu plutôt que par l'extension (les images contenant du PHP se remarquent)
find /var/www/html/wp-content/uploads -type f -newermt "2026-10-17" -exec file {} + | grep -viE "image|pdf|video|audio"
D'autres systèmes utilisent d'autres dossiers en écriture, par exemple fileadmin pour TYPO3, images pour Joomla ou le dossier de médias sous public pour Shopware 6. S'y ajoutent les répertoires de cache et temporaires de l'application. Avec des installations multisites et plusieurs sites sur un serveur, il y a autant de dossiers de téléversement ; chacun entre dans la recherche.
Les fichiers .htaccess et .user.ini dans le dossier de téléversement sont eux aussi suspects. Ils permettent de réactiver l'exécution de PHP dans ce dossier ou de modifier la configuration.
Fichier PHP dans le dossier uploads : bien interpréter la découverte
Toute occurrence n'est pas aussi grave. Le classement suivant aide pour la première évaluation. Il ne remplace pas un examen approfondi.
| Constat | Premier classement |
|---|---|
index.php avec zéro octet ou seulement un commentaire |
le plus souvent un fichier factice contre le listage de répertoire, à rapprocher de l'extension |
| Fichier PHP avec contenu dans un dossier mensuel | soupçon élevé |
Double extension comme bild.jpg.php ou .php.png |
soupçon élevé, camouflage typique |
Image qui, selon file, contient du code PHP |
soupçon élevé, peut être exécutée par inclusion |
.htaccess ou .user.ini dans le dossier de téléversement |
soupçon, vérifier la configuration |
| Fichier appartenant à l'utilisateur du serveur web, ctime après le 17/10 | correspond à une intrusion via le site web |
Lisez les fichiers suspects uniquement comme texte, par exemple avec head -c 2000 datei.php ou less. Sont remarquables les lignes très longues, les chaînes de caractères encodées et les noms de fonctions comme eval ou base64_decode. Comment reconnaître du code obfusqué, Reconnaître le code PHP obfusqué le montre.
Le fichier a-t-il été appelé ? Un coup d'œil dans le journal
La question la plus importante après la découverte est : quelqu'un a-t-il utilisé le fichier ? La réponse figure dans les journaux d'accès du serveur web. Cherchez le nom du fichier, y compris dans les journaux archivés.
# Appels du fichier suspect dans les journaux actuels et compressés (nom à titre d'exemple)
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* 2>/dev/null
zgrep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log*.gz 2>/dev/null
# Seulement les appels réussis avec adresse IP et horaire
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* | awk '$9 == 200 {print $1, $4, $6, $7}'
De nombreuses requêtes POST réussies provenant de peu d'adresses indiquent une utilisation active comme webshell. L'absence de résultats ne signifie pas automatiquement que tout va bien, car les journaux peuvent avoir été tournés, supprimés ou être incomplets. Si le site tourne derrière un CDN ou un proxy, d'autres journaux s'y trouvent ; en hébergement mutualisé, l'hébergeur met le plus souvent les journaux d'accès à disposition dans l'espace client. Faites aussi attention aux requêtes vers d'autres nouveaux fichiers provenant des mêmes adresses, car elles mènent souvent à d'autres composants. Conservez les journaux à partir du 20 octobre. La façon d'exploiter à fond les journaux est expliquée dans le guide Exploiter les journaux du serveur web après une attaque.
Si le journal montre des appels réussis d'un fichier PHP inconnu, partez du principe d'une intrusion. Sauvegardez le fichier et les journaux, restreignez l'accès au serveur et vérifiez si des données à caractère personnel peuvent être concernées.
Après l'évaluation : le bon ordre
- Sauvegarder : copier le fichier avec somme de contrôle et horodatages, sauvegarder les journaux.
- Établir l'origine : vérifier les formulaires de téléversement, les extensions et la période précédant la découverte.
- Chercher d'autres composants : fichiers supplémentaires, tâches cron, nouveaux comptes administrateur.
- Bloquer l'exécution : interdire PHP dans le dossier de téléversement au niveau du serveur web, comme décrit dans l'article Interdire l'exécution de PHP dans les dossiers de téléversement.
- Nettoyer et changer les accès : ne supprimer le fichier qu'ensuite et renouveler tous les mots de passe.
Comment PHP SOS aide-t-il concrètement ?
- Évaluer la découverte : nous examinons le fichier sans l'exécuter et le situons.
- Établir l'utilisation : nous exploitons les journaux et reconstituons qui a appelé le fichier et quand.
- Nettoyer complètement : avec la suppression de logiciels malveillants, nous recherchons tous les composants, fermons la cause et changeons les accès.
- Éviter la récidive : nous bloquons l'exécution de PHP dans les dossiers en écriture et surveillons les nouveaux fichiers.
Questions fréquentes
Tout fichier PHP dans le dossier de téléversement est-il dangereux ?
Pas tous. Certaines extensions déposent un index.php vide pour que le contenu du dossier ne soit pas listé. Tout le reste, en particulier les fichiers avec du contenu, un nom inhabituel ou une double extension, devrait être traité comme un cas suspect.
Puis-je ouvrir le fichier suspect dans le navigateur ?
Non. Un appel via le site web exécute le code. Lisez le fichier uniquement comme texte sur le serveur ou dans une copie, par exemple avec less ou head.
Comment savoir si le fichier a été utilisé ?
Cherchez le nom du fichier dans les journaux d'accès du serveur web. Des requêtes avec le statut 200 et la méthode POST montrent que le fichier a été appelé. Les adresses IP et les moments correspondants aident pour la suite de l'enquête.
Suffit-il de supprimer le fichier et de bloquer PHP dans le dossier de téléversement ?
Les deux sont nécessaires, mais pas suffisants. Établissez en plus comment le fichier est arrivé là, cherchez d'autres composants et changez les identifiants. Sinon, l'attaquant revient par la même voie.