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.phpgibi 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
.htaccessiçindekiphp_flag engine offyalnızcamod_phpkullanıldığında etkilidir.php-fpm(FastCGI) kullanıyorsanızyö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
.phpdosyaları 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 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)