Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
Sitenizin hacklendiğini fark ettiyseniz sakin kalıp sistemli ilerlemek en önemli şeydir. Bu rehberde hacklenen web sitesi nasıl temizlenir sorusuna uygulanabilir bir yanıt veriyoruz: siteyi izole edeceğiz, kanıtları yedekleyeceğiz, zararlı dosyaları tespit edip kaldıracağız, erişim bilgilerini yenileyeceğiz ve açığı kapatacağız. Tahmini süre 2-4 saattir.
Örneklerde Linux sunucu ve WordPress benzeri PHP tabanlı bir site varsayılmıştır; ilkeler başka platformlar için de geçerlidir. Büyük bir ticari site veya kişisel veri sızıntısı söz konusuysa profesyonel olay müdahale desteği alın ve hukuki bildirim yükümlülüklerinizi (ör. KVKK) kontrol edin.
Gereksinimler
- Sunucuya SSH erişimi ve site dosyalarının yolu
- Veritabanı erişim bilgileri
- Mümkünse hack öncesine ait temiz bir yedek
- Kontrol panelinde yönetici yetkisi
- Önce mevcut durumun tam yedeği: temizlik hata yaparsa geri dönebilmek ve inceleme yapabilmek için
Adım adım hacklenen siteyi temizleme
1. Siteyi izole edin
Ziyaretçileri korumak ve saldırganın erişimini kısıtlamak için siteyi geçici olarak bakım moduna alın veya erişimi yalnızca kendi IP adresinize açın. Kanıtı toplamadan hiçbir dosyayı silmeyin veya düzenlemeyin. Saldırganın erişiminin sürdüğünden şüpheleniyorsanız kontrol paneli, SSH ve FTP parolalarını hemen değiştirmek kanıtı bozmaz; tüm erişim bilgilerinin kapsamlı yenilenmesini 7. adımda yapacağız.
2. Mevcut durumun yedeğini alın
Temizlik öncesi dosyaları, veritabanını ve web sunucusu günlüklerini arşivleyin. Bu kopya adli inceleme içindir, geri yüklemek için değildir; bir kopyasını sunucu dışına da alın.
sudo tar -czf /root/olay-yedek-$(date +%F).tar.gz /var/www/site
sudo tar -czf /root/olay-log-$(date +%F).tar.gz /var/log/nginx # Apache: /var/log/apache2 veya /var/log/httpd
sudo sh -c 'mysqldump --single-transaction siteveritabani | gzip > /root/olay-db-$(date +%F).sql.gz'
sudo sha256sum /root/olay-*.gz3. Günlüklerden saldırı izlerini bulun
Web sunucusu günlüklerinde olağan dışı POST istekleri, tanımadığınız PHP dosyalarına erişimler ve şüpheli IP adreslerini arayın. Günlük yolu sunucunuza göre değişir.
sudo grep POST /var/log/nginx/access.log | awk '{print $1, $7}' | sort | uniq -c | sort -rn | head -204. Değiştirilmiş ve şüpheli dosyaları bulun
Son günlerde değişen dosyalar ve bilinen zararlı kalıplar ilk ipuçlarını verir.
find /var/www/site -type f -name '*.php' \( -mtime -7 -o -ctime -7 \)
sudo grep -rIl --include='*.php' -E 'eval\(base64_decode|gzinflate\(base64|shell_exec|passthru' /var/www/siteSaldırganlar değiştirme zamanını (mtime) geriye alabilir; bu yüzden durum değişim zamanına (ctime) da bakıyoruz. Bu desenler hatalı pozitif verebilir; her dosyayı elle inceleyin. Yükleme (uploads) klasöründe PHP dosyası bulunması çoğunlukla şüphelidir.
5. Çekirdek dosyaları temiz kopyayla değiştirin
WordPress kullanıyorsanız WP-CLI ile çekirdek ve eklenti dosyalarını resmi sürümlerle karşılaştırın. WP-CLI sitenin PHP kodunu yükleyebildiği için bulaşık sitede onu root olarak çalıştırmayın; site kullanıcısıyla ve eklenti/tema yüklemeden çalıştırın (örnekteki www-data yerine sitenin sahibi olan kullanıcıyı yazın).
cd /var/www/site
sudo -u www-data wp core verify-checksums
sudo -u www-data wp plugin verify-checksums --all --skip-plugins --skip-themesFarklı çıkan çekirdek dosyalarını temiz sürümle değiştirin. Kullanılmayan eklenti ve temaları tamamen silin. Resmi dizinde olmayan (nulled) eklentileri kaldırın.
6. Kalıcılık mekanizmalarını arayın
Saldırganlar geri dönmek için arka kapı bırakır. Yönetici kullanıcılarını, cron işlerini, .htaccess dosyalarını ve veritabanındaki şüpheli kayıtları kontrol edin.
sudo -u www-data wp user list --role=administrator --skip-plugins --skip-themes
sudo crontab -l -u www-data
sudo ls -la /etc/cron.d /var/spool/cron
find /var/www/site -name '.htaccess' \( -mtime -30 -o -ctime -30 \)7. Tüm parolaları ve anahtarları yenileyin
Temizlikten sonra kontrol paneli, FTP/SFTP, veritabanı, WordPress yönetici hesapları ve SSH anahtarları için yeni parolalar oluşturun. WordPress için wp-config.php içindeki güvenlik anahtarlarını (salt) yenileyin (ör. wp config shuffle-salts); böylece açık oturumlar sonlanır.
8. Açığı kapatın ve sertleştirin
Saldırının büyük olasılıkla gerçekleştiği yolu (eski eklenti, zayıf parola, açık yükleme alanı) belirleyin ve kapatın. Yazılım sürümlerini güncelleyin, dosya izinlerini düzeltin ve yükleme klasöründe PHP çalışmasını engelleyin.
sudo find /var/www/site -type d -exec chmod 755 {} \;
sudo find /var/www/site -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/site/wp-config.phpwp-config.php için 640 kullanıyorsanız dosyanın grubunun PHP’yi çalıştıran kullanıcıyla eşleştiğinden emin olun; aksi halde site veritabanına bağlanamaz.
9. Siteyi yeniden açın ve izleyin
Siteyi yeniden açtıktan sonra birkaç gün günlükleri izleyin. Arama motorlarında spam bağlantı veya uyarı görürseniz arama konsolu araçlarındaki güvenlik sorunları bölümünden inceleme isteği gönderin.
Doğrulama
cd /var/www/site && sudo -u www-data wp core verify-checksums
sudo grep -rIl --include='*.php' -E 'eval\(base64_decode|gzinflate\(base64' /var/www/site
find /var/www/site/wp-content/uploads -name '*.php'Beklenen sonuç: kontrol toplamı hatasız tamamlanır, desenler eşleşme bulmaz ve uploads klasöründe (bazı eklentilerin bıraktığı boş index.php gibi bilinen dosyalar dışında) PHP dosyası yoktur. Sitenin ana sayfasını farklı kullanıcı aracılarıyla (ör. arama motoru robotu gibi) açıp beklenmedik yönlendirme veya gizli içerik olmadığını da doğrulayın.
Sık karşılaşılan sorunlar
- Zararlı dosyalar silindikten sonra geri geliyor: Arka kapı kalmıştır; cron işleri, veritabanı kayıtları, yönetici kullanıcılar ve diğer sitelerdeki bulaşmaya bakın.
- Site hâlâ spam sayfaları gösteriyor: Veritabanında enjekte edilmiş içeriği ve
.htaccesskurallarını kontrol edin. - Arama sonuçlarında uyarı çıkıyor: Temizlik sonrası arama konsolundan inceleme isteyin; işlem günler sürebilir.
- Aynı hesapta başka siteler de bulaşmış: Hesaptaki tüm siteleri tarayın; tek bir bulaşık site diğerlerine yayılır.
Güvenlik ve bakım notları
- Yazılım, eklenti ve temaları düzenli güncelleyin.
- Her site için ayrı kullanıcı ve ayrı veritabanı hesabı kullanın.
- İki adımlı doğrulamayı yönetici hesaplarında açın.
- Düzenli ve sunucu dışı yedek alın; geri yüklemeyi test edin.
- Dosya bütünlüğü izleme ve düzenli zararlı yazılım taraması yapın.
- Olay sonrası kısa bir rapor yazın: kök neden, alınan önlemler.
Sık sorulan sorular
Temizlemek mi, yedekten geri yüklemek mi daha iyi?
Hack öncesi temiz bir yedeğiniz varsa geri yüklemek genellikle daha güvenilirdir. Ancak açık kapatılmazsa saldırı tekrarlanır; geri yüklemeden sonra güncelleme ve parola yenileme şarttır.
Zararlı yazılım tarayıcı eklentisi yeterli mi?
Tarayıcı eklentileri yardımcı olur fakat gizlenmiş arka kapıların hepsini yakalamayabilir. Elle inceleme, kontrol toplamı doğrulaması ve günlük analizi ile birlikte kullanın.
Kullanıcı verileri sızdıysa ne yapmalıyım?
Etkilenen verinin kapsamını belirleyin, kullanıcıları ve ilgili kurumları yasal süre içinde bilgilendirin. Bu süreçte hukuk danışmanından destek almanız yerinde olur.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- AIDE ile dosya bütünlüğü izlemeAIDE ile sunucudaki dosya değişikliklerini izleyin: kurulum, veritabanı oluşturma, kural yazma, düzenli denetim, güncelleme ve sonuçları güvenle yorumlama adımları.
- Dosya yükleme güvenliği: uzantı, MIME, depolama ve çalıştırma engeliDosya yükleme formlarını güvenli hale getirin: uzantı beyaz listesi, gerçek MIME denetimi, rastgele dosya adı, web kökü dışında depolama ve yükleme dizininde betik çalıştırmayı engelleme.
- XSS önleme ve CSP ile site savunmasıSiteler arası betik çalıştırma (XSS) saldırılarını çıktı kaçışı, güvenli çerezler ve Content-Security-Policy başlığıyla önleyin; Nginx ve Apache örnekleri ve Report-Only ile güvenli geçiş.
- SQL enjeksiyonunu önleme: hazır sorgular (prepared statements) ve doğrulama (PHP PDO örnekleriyle)SQL enjeksiyonunu PHP PDO hazır sorgularıyla önleyin: parametre bağlama, beyaz liste ile ORDER BY, IN listeleri, en az yetkili veritabanı kullanıcısı ve saldırı denemesiyle doğrulama.