2026年11月12日
2026年11月12日
Interdire l’exécution de PHP dans le dossier uploads de WordPress
Cet article est une édition localisée de l'original japonais. Lire l'original en japonais
Introduction
wp-content/uploads/ est le répertoire dans lequel WordPress stocke les médias, comme les images. Si des fichiers PHP peuvent y être déposés et exécutés, un attaquant peut téléverser un web shell (porte dérobée) et exécuter du code arbitraire.
Symptômes et causes
- Une analyse antimalware a détecté des fichiers PHP dans
wp-content/uploads/ - Une extension de sécurité a signalé « PHP est exécutable dans le répertoire uploads »
- Un fichier suspect a été trouvé à un chemin comme
wp-content/uploads/2024/01/shell.php - Un web shell a été installé en exploitant une faille de la fonction de téléversement de fichiers
Procédure de résolution
Étape 1 : détecter les fichiers PHP suspects existants
# Rechercher tous les fichiers PHP du répertoire uploads
find /var/www/html/wp-content/uploads -name "*.php" -type f
find /var/www/html/wp-content/uploads -name "*.phtml" -type f
find /var/www/html/wp-content/uploads -name "*.php5" -type f
# Vérifier les fichiers PHP créés ou modifiés récemment (moins de 7 jours)
find /var/www/html/wp-content/uploads -name "*.php" -mtime -7
# Examiner le contenu des fichiers (motifs caractéristiques des logiciels malveillants)
grep -rl "eval(base64_decode" /var/www/html/wp-content/uploads/
grep -rl "system\|exec\|passthru\|shell_exec" /var/www/html/wp-content/uploads/
# Supprimer les fichiers PHP suspects
find /var/www/html/wp-content/uploads -name "*.php" -delete
find /var/www/html/wp-content/uploads -name "*.phtml" -delete
Étape 2 : interdire l’exécution de PHP avec Apache (.htaccess)
# Créer wp-content/uploads/.htaccess
cat > /var/www/html/wp-content/uploads/.htaccess << 'EOF'
# Interdire totalement l'exécution des fichiers PHP
<FilesMatch "\.(php|phtml|php3|php4|php5|php7|phar|shtml)$">
Order Deny,Allow
Deny from all
</FilesMatch>
# Désactiver le moteur PHP lui-même (avec mod_php)
<IfModule mod_php.c>
php_flag engine off
</IfModule>
# Interdire aussi l'exécution CGI
Options -ExecCGI
RemoveHandler .php .phtml .php5 .phar
# Désactiver aussi le listage des répertoires
Options -Indexes
EOF
chmod 644 /var/www/html/wp-content/uploads/.htaccess
# Vérification après configuration
# Créer un fichier PHP de test et tenter d'y accéder
echo "<?php echo 'test'; ?>" > /var/www/html/wp-content/uploads/test_block.php
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/test_block.php
# Succès si 403 est renvoyé
rm /var/www/html/wp-content/uploads/test_block.php
Étape 3 : interdire l’exécution de PHP avec Nginx
# /etc/nginx/sites-available/example.com
server {
# ... configuration existante ...
# Interdire l'exécution de PHP dans le répertoire uploads
location ~* /wp-content/uploads/.*\.(php|phtml|php5|phar)$ {
deny all;
access_log off;
log_not_found off;
}
# À écrire avant la location de PHP-FPM
location ~ \.php$ {
# Traitement PHP normal
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# Vérifier la configuration Nginx et l'appliquer
sudo nginx -t && sudo systemctl reload nginx
# Vérification
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/shell.php
# Succès si 403 est renvoyé
Étape 4 : bloquer aussi le téléversement de PHP depuis WordPress
// functions.php : interdire le téléversement de fichiers PHP
// ① Ajouter les extensions PHP à la liste des téléversements interdits
add_filter('upload_mimes', function(array $mimes): array {
// Retirer les types MIME liés à PHP (par précaution)
unset($mimes['php'], $mimes['phtml'], $mimes['phar']);
return $mimes;
});
// ② Détecter et refuser les fichiers PHP téléversés
add_filter('wp_handle_upload_prefilter', function(array $file): array {
$dangerous_extensions = ['php', 'phtml', 'php3', 'php4', 'php5', 'phar', 'shtml'];
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (in_array($ext, $dangerous_extensions, true)) {
$file['error'] = 'Le téléversement de fichiers PHP est interdit.';
}
// Vérifier aussi par type MIME
if (str_contains($file['type'], 'php')) {
$file['error'] = 'Le téléversement de fichiers PHP est interdit.';
}
return $file;
});
Étape 5 : mettre en place une surveillance régulière
# Script de surveillance périodique des fichiers PHP dans uploads
cat > /usr/local/bin/check-uploads-php.sh << 'EOF'
#!/bin/bash
UPLOADS_DIR="/var/www/html/wp-content/uploads"
ADMIN_EMAIL="admin@example.com"
PHP_FILES=$(find "$UPLOADS_DIR" -name "*.php" -o -name "*.phtml" -o -name "*.phar" 2>/dev/null)
if [ -n "$PHP_FILES" ]; then
echo "Alerte : des fichiers PHP ont été détectés dans le répertoire uploads :
$PHP_FILES" | mail -s "[URGENT] Un web shell a peut-être été installé sur WordPress" "$ADMIN_EMAIL"
# Suppression automatique (à utiliser avec prudence)
# find "$UPLOADS_DIR" -name "*.php" -delete
fi
EOF
chmod +x /usr/local/bin/check-uploads-php.sh
# Vérification toutes les heures
echo "0 * * * * root /usr/local/bin/check-uploads-php.sh" > /etc/cron.d/wp-uploads-php-check
Points d’attention
php_flag engine offdans.htaccessn'est efficace qu'avecmod_php. Si vous utilisezphp-fpm(FastCGI), traitez le cas avec la directiveou avec un bloc location de Nginx- Avec Nginx, si la règle de blocage de uploads n'est pas écrite avant
location ~ \.php$, cette dernière peut être prioritaire et le fichier peut alors s'exécuter. Placez toujours la règle de blocage au-dessus - Certaines extensions (par exemple Slider Revolution) peuvent déposer des fichiers
.phpdans uploads. Avant de supprimer, vérifiez leur usage, et supprimez les extensions inutiles avant d'agir
Résumé
Pour interdire l'exécution de PHP dans le répertoire uploads : ① détectez et supprimez les fichiers suspects existants avec find wp-content/uploads -name ".php" ; ② avec Apache, ajoutez dans uploads/.htaccess ; ③ avec Nginx, utilisez deny all dans location ~ /wp-content/uploads/.*\.php$ ; ④ refusez le téléversement de PHP lui-même avec le hook wp_handle_upload_prefilter ; ⑤ surveillez les fichiers PHP de uploads avec un cron toutes les heures.
Une question sur WordPress ? L'éditeur de ce site est basé au Japon et répond en japonais. Contact (en japonais)