2026年11月12日

2026年11月12日

WordPress uploads Dizininde PHP Çalıştırmayı Engelleme Yöntemi

Bu makale, Japonca orijinalin yerelleştirilmiş sürümüdür. Japonca orijinali oku

Giriş

wp-content/uploads/, WordPress'in görsel gibi medya dosyalarını sakladığı dizindir. Bu dizine bir PHP dosyası konulabiliyor ve çalıştırılabiliyorsa, saldırgan bir web shell (arka kapı) yükleyerek istediği kodu çalıştırabilir.

Belirtiler ve nedenler

  • Kötü amaçlı yazılım taramasında wp-content/uploads/ içinde PHP dosyaları bulundu
  • Bir güvenlik eklentisi "uploads dizininde PHP çalıştırılabiliyor" uyarısı verdi
  • wp-content/uploads/2024/01/shell.php gibi bir yolda şüpheli bir dosya bulundu
  • Dosya yükleme özelliğindeki bir açık kullanılarak web shell yerleştirildi

Çözüm adımları

Adım 1: Mevcut şüpheli PHP dosyalarını bulun

# uploads dizinindeki tüm PHP dosyalarını ara
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

# Son 7 gün içinde oluşturulan veya güncellenen PHP dosyalarını kontrol et
find /var/www/html/wp-content/uploads -name "*.php" -mtime -7

# Dosya içeriğini kontrol et (kötü amaçlı yazılımın tipik kalıpları)
grep -rl "eval(base64_decode" /var/www/html/wp-content/uploads/
grep -rl "system\|exec\|passthru\|shell_exec" /var/www/html/wp-content/uploads/

# Şüpheli PHP dosyalarını sil
find /var/www/html/wp-content/uploads -name "*.php" -delete
find /var/www/html/wp-content/uploads -name "*.phtml" -delete

Adım 2: Apache’de PHP çalıştırmayı engelleyin (.htaccess)

# wp-content/uploads/.htaccess dosyasını oluştur
cat > /var/www/html/wp-content/uploads/.htaccess << 'EOF'
# PHP dosyalarının çalıştırılmasını tamamen engelle
<FilesMatch "\.(php|phtml|php3|php4|php5|php7|phar|shtml)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

# PHP motorunun kendisini devre dışı bırak (mod_php kullanılıyorsa)
<IfModule mod_php.c>
    php_flag engine off
</IfModule>

# CGI çalıştırmayı da engelle
Options -ExecCGI
RemoveHandler .php .phtml .php5 .phar

# Dizin listelemeyi de kapat
Options -Indexes
EOF

chmod 644 /var/www/html/wp-content/uploads/.htaccess
# Ayardan sonra kontrol
# Test amaçlı bir PHP dosyası oluşturup erişmeyi dene
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
# 403 dönerse başarılı
rm /var/www/html/wp-content/uploads/test_block.php

Adım 3: Nginx’te PHP çalıştırmayı engelleyin

# /etc/nginx/sites-available/example.com
server {
    # ... mevcut ayarlar ...

    # uploads dizininde PHP çalıştırmayı engelle
    location ~* /wp-content/uploads/.*\.(php|phtml|php5|phar)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # PHP-FPM location bloğundan önce yazılmalı
    location ~ \.php$ {
        # Normal PHP işleme
        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 ayarını kontrol et ve uygula
sudo nginx -t && sudo systemctl reload nginx

# Kontrol
curl -o /dev/null -s -w "%{http_code}" https://example.com/wp-content/uploads/shell.php
# 403 dönerse başarılı

Adım 4: PHP yüklemelerini WordPress tarafında da engelleyin

// functions.php: PHP dosyası yüklemeyi baştan engelle

// ① PHP uzantılarını yükleme yasak listesine ekle
add_filter('upload_mimes', function(array $mimes): array {
    // PHP ile ilgili MIME türlerini kaldır (önlem olarak)
    unset($mimes['php'], $mimes['phtml'], $mimes['phar']);
    return $mimes;
});

// ② Yüklenen dosyalarda PHP tespiti ve reddi
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'] = 'PHP dosyası yüklemek yasaktır.';
    }

    // MIME türünden de kontrol et
    if (str_contains($file['type'], 'php')) {
        $file['error'] = 'PHP dosyası yüklemek yasaktır.';
    }

    return $file;
});

Adım 5: Düzenli izleme kurun

# uploads içindeki PHP dosyalarını düzenli izleyen betik
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 "Uyarı: uploads dizininde PHP dosyaları bulundu:
$PHP_FILES" | mail -s "[ACİL] WordPress'e web shell yerleştirilmiş olabilir" "$ADMIN_EMAIL"

    # Otomatik silme (dikkatli kullanın)
    # find "$UPLOADS_DIR" -name "*.php" -delete
fi
EOF
chmod +x /usr/local/bin/check-uploads-php.sh

# Saatte bir kontrol et
echo "0 * * * * root /usr/local/bin/check-uploads-php.sh" > /etc/cron.d/wp-uploads-php-check

Dikkat edilecekler

  • .htaccess içindeki php_flag engine off yalnızca mod_php kullanıldığında etkilidir. php-fpm (FastCGI) kullanıyorsanız yönergesini veya Nginx'in location bloğunu kullanın
  • Nginx'te uploads için engelleme kuralını location ~ \.php$ bloğundan önce yazmazsanız, sonraki blok öncelik kazanıp dosyanın çalışmasına izin verebilir. Engelleme kuralını mutlaka üst sıraya koyun
  • Bazı eklentiler (örneğin Slider Revolution gibi) uploads içine .php dosyaları yerleştirebilir. Silmeden önce dosyanın ne işe yaradığını kontrol edin, gereksiz eklentileri kaldırdıktan sonra işlem yapın

Özet

uploads dizininde PHP çalıştırmayı engellemek için: ① find wp-content/uploads -name ".php" ile mevcut şüpheli dosyaları bulup silin, ② Apache'de uploads/.htaccess dosyasına Deny from all ekleyin, ③ Nginx'te location ~ /wp-content/uploads/.*\.php$ ile deny all uygulayın, ④ wp_handle_upload_prefilter kancasıyla PHP yüklemesini baştan reddedin, ⑤ saatlik bir cron ile uploads içindeki PHP dosyalarını izleyin.

WordPress hakkında sorunuz mu var? Bu sitenin yayıncısı Japonya'dadır ve Japonca yanıt verir. İletişim (Japonca)

お気軽にご相談ください

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