2026年11月12日

2026年11月12日

PHP-Ausführung im WordPress-Ordner uploads verbieten

Dieser Artikel ist eine lokalisierte Fassung des japanischen Originals. Japanisches Original lesen

Einleitung

wp-content/uploads/ ist das Verzeichnis, in dem WordPress Medien wie Bilder speichert. Liegen in diesem Verzeichnis PHP-Dateien, die ausgeführt werden können, kann ein Angreifer eine Web-Shell (Backdoor) hochladen und beliebigen Code ausführen.

Symptome und Ursachen

  • Ein Malware-Scan hat PHP-Dateien in wp-content/uploads/ gefunden
  • Ein Sicherheits-Plugin warnt: „In uploads kann PHP ausgeführt werden“
  • Verdächtige Dateien wurden unter Pfaden wie wp-content/uploads/2024/01/shell.php entdeckt
  • Eine Web-Shell wurde über eine Schwachstelle in der Datei-Upload-Funktion eingeschleust

Lösung Schritt für Schritt

Schritt 1: Vorhandene verdächtige PHP-Dateien finden

# Alle PHP-Dateien im Verzeichnis uploads suchen
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

# PHP-Dateien prüfen, die in den letzten 7 Tagen erstellt oder geändert wurden
find /var/www/html/wp-content/uploads -name "*.php" -mtime -7

# Dateiinhalte prüfen (typische Muster von Malware)
grep -rl "eval(base64_decode" /var/www/html/wp-content/uploads/
grep -rl "system\|exec\|passthru\|shell_exec" /var/www/html/wp-content/uploads/

# Verdächtige PHP-Dateien löschen
find /var/www/html/wp-content/uploads -name "*.php" -delete
find /var/www/html/wp-content/uploads -name "*.phtml" -delete

Schritt 2: PHP-Ausführung unter Apache verbieten (.htaccess)

# wp-content/uploads/.htaccess anlegen
cat > /var/www/html/wp-content/uploads/.htaccess << 'EOF'
# Ausführung von PHP-Dateien vollständig verbieten
<FilesMatch "\.(php|phtml|php3|php4|php5|php7|phar|shtml)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

# Die PHP-Engine selbst deaktivieren (bei mod_php)
<IfModule mod_php.c>
    php_flag engine off
</IfModule>

# Auch die Ausführung von CGI verbieten
Options -ExecCGI
RemoveHandler .php .phtml .php5 .phar

# Verzeichnislisting ebenfalls deaktivieren
Options -Indexes
EOF

chmod 644 /var/www/html/wp-content/uploads/.htaccess
# Prüfung nach der Einrichtung
# Eine PHP-Testdatei anlegen und versuchen, sie aufzurufen
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
# Erfolgreich, wenn 403 zurückkommt
rm /var/www/html/wp-content/uploads/test_block.php

Schritt 3: PHP-Ausführung unter Nginx verbieten

# /etc/nginx/sites-available/example.com
server {
    # ... bestehende Konfiguration ...

    # PHP-Ausführung im Verzeichnis uploads verbieten
    location ~* /wp-content/uploads/.*\.(php|phtml|php5|phar)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Muss vor der location für PHP-FPM stehen
    location ~ \.php$ {
        # Normale PHP-Verarbeitung
        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;
    }
}
# Nginx-Konfiguration prüfen und übernehmen
sudo nginx -t && sudo systemctl reload nginx

# Prüfung
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/shell.php
# Erfolgreich, wenn 403 zurückkommt

Schritt 4: PHP-Uploads auch von WordPress aus blockieren

// functions.php: Den Upload von PHP-Dateien selbst verbieten

// ① PHP-Endungen zur Liste der verbotenen Uploads hinzufügen
add_filter('upload_mimes', function(array $mimes): array {
    // PHP-bezogene MIME-Typen entfernen (zur Sicherheit)
    unset($mimes['php'], $mimes['phtml'], $mimes['phar']);
    return $mimes;
});

// ② PHP in hochgeladenen Dateien erkennen und ablehnen
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'] = 'Das Hochladen von PHP-Dateien ist nicht erlaubt.';
    }

    // Auch anhand des MIME-Typs prüfen
    if (str_contains($file['type'], 'php')) {
        $file['error'] = 'Das Hochladen von PHP-Dateien ist nicht erlaubt.';
    }

    return $file;
});

Schritt 5: Regelmäßige Überwachung einrichten

# Skript zur regelmäßigen Überwachung von PHP-Dateien in 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 "Warnung: Im Verzeichnis uploads wurden PHP-Dateien gefunden:
$PHP_FILES" | mail -s "[Dringend] Möglicherweise wurde eine Web-Shell in WordPress eingeschleust" "$ADMIN_EMAIL"

    # Automatisch löschen (mit Vorsicht verwenden)
    # find "$UPLOADS_DIR" -name "*.php" -delete
fi
EOF
chmod +x /usr/local/bin/check-uploads-php.sh

# Stündlich prüfen
echo "0 * * * * root /usr/local/bin/check-uploads-php.sh" > /etc/cron.d/wp-uploads-php-check

Hinweise

  • php_flag engine off in der .htaccess wirkt nur bei mod_php. Wenn Sie php-fpm (FastCGI) verwenden, lösen Sie das mit der Direktive oder mit einem location-Block in Nginx
  • Bei Nginx kann es passieren, dass die Regel zum Blockieren von uploads nicht greift und PHP trotzdem ausgeführt wird, wenn sie nicht vor location ~ \.php$ steht, weil dann Letztere Vorrang hat. Platzieren Sie die Blockierregel unbedingt davor
  • Einige Plugins (z. B. Slider Revolution) legen mitunter .php-Dateien in uploads ab. Prüfen Sie vor dem Löschen den Verwendungszweck und entfernen Sie nicht benötigte Plugins, bevor Sie handeln

Fazit

Um die PHP-Ausführung im Verzeichnis uploads zu verbieten: ① mit find wp-content/uploads -name ".php" vorhandene verdächtige Dateien finden und löschen, ② unter Apache in uploads/.htaccess die Regel Deny from all ergänzen, ③ unter Nginx per location ~ /wp-content/uploads/.*\.php$ mit deny all sperren, ④ über den Hook wp_handle_upload_prefilter den PHP-Upload selbst ablehnen und ⑤ PHP-Dateien in uploads per stündlichem Cron überwachen.

Fragen zu WordPress? Der Betreiber dieser Seite sitzt in Japan und antwortet auf Japanisch. Kontakt (Japanisch)

お気軽にご相談ください

お見積りへ お問い合わせへ
▲