Merhaba,

Brute force konusunda birkaç deneyimimi paylaşmak istiyorum. Teknik terimleri az kullanarak, kendi cümlelerimle işe koşuk özgün bir anlatım deniyorum. Pek zamanım olmadığı için hızlıca yazıyorum. Kodları çalakalem yazdım. Hatalarım affola. Amacım hırsıza yol göstermek değil. Ev sahibinin kapıyı kilitlemesini sağlamak.

Brute force deneme yanılmaya dayanan bir kapı açma yöntemidir. Günümüzdeki Internet hızı ve teknolojileri düşünüldüğünde üyelikleri deşifre edilmeye çalışılan bir siteye dakikalar içinde binlerce deneme yanılma saldırısı gönderilebilir.

Brute Force Saldırısı Nasıl Yapılır?


Üyelik barındıran birçok site kullanıcı adı ve şifreyle girişe izin veriyor. Ek olarak bunların çoğu girişlerde (login) recaptcha kullanmıyor. Bazıları Cloudflare'ın, CSF'in, Cisco'nun... yeteneklerine güveniyor. Bir saldırganın gözünde girişlerde ve kullanıcı adıyla ilişkili diğer alanlarda yetenekli ve özgün bir doğrulama kullanmayan böyle sistemler kolayca aşılabilirdir.

Brute force yapacak saldırganın İhtiyacı olanlar şöyledir: Firewall'lere takılmayacak temiz ip'ler, ayarlanmış rate hızı (deneme-yanılma, istek gönderim hızı), en sık kullanılan şifre kombinasyonlarını içeren milyonluk bir dict. (şifre listesi), tüm bunları yapabilecek bir postlama aracı. Başka bir deyişle gereken her şeyi bir günde hazırlayabilir.

Brute Force Saldırılarından Korunalım

Bunları madde madde yazalım:

1. Üyelikle ilişkili, session'u mevcut olmayan her işlemde özgün bir recaptcha kullanılmalıdır. Api'yle kırılabilenlerden veya gördüğünüzü yazınlardan bahsetmiyorum.

Recaptcha Nasıl Olmalıdır?


Recaptcha, size özel ve problem çözdürmeye yönelik olmalıdır. Örneğin "Türkiye'nin başkenti nedir?", "Almanya'nın başkenti neresidir?" sorularının cevapları recaptcha olamaz. Çünkü çok sınırlı ve bu da brute force'a açık. Daha rastgelelik içeren (random) şu basit kod cevabı çok sınırlı veya gördüğünü yaz/seç recaptchalardan daha güvenilirdir.

$birinci=rand(999,9999999);
$ikinci=rand(999,9999999);
$resmebasilacak=$birinci.'+'.$ikinci;
$cevap=$birinci+$ikinci;
Bu kodda toplama işlemi yerine 4 işlemi de rastgeleleştirebilir, daha fazla rastgelelik ekleyebiliriz. Başka bir fikir ise şöyle olabilir:

$recaptcham=uniqid();
preg_match_all('!\d+!', $recaptcham, $sayilar);
$soru=implode('+',$sayilar);
$resmebasilacak=$soru.' işleminin sonucu nedir?';
$cevap=array_sum($sayilar);
Bunlar en azından brute forcer'in gözünü korkutabilir. Çünkü çözebilmesi için ekstra OCR kodlaması veya bu yönde bir api/işlev bulması gerekiyor.

2. Firewall için kendinize özel rate limit tanımlayın. "El"e güvenmek yerine kendiniz her ip'nin post/get istek sayısını sınırlandırın. Bu sayıyı aşanları en az 5-10 dakika bekletin. Proxy'leri ve vpn'leri tespit ederek bazı işlemlerini kısıtlamak da ekstra bir önlem olabilir.

3. Veritabanınızda şifreleri çıplak veya tek yönlü şifreleyerek saklamayın. Şifrelemede sadece md5, sha256, blowfish, aes... gibi formülü bilinen tek yönlü kullanımlar yerine ya bunların kombinasyonunu ya da kendi hashinizi kullanın.

Bu 3 kolay adım birçok brute force saldırısını önleyecektir. Böylece eski, aktif olmayan, unutulmuş üyeliklerin şifreleri deneme-yanılma yoluyla çok daha zor çözülecektir. Eğer bunları yapmanıza rağmen bir brute force saldırısı gerçekleşiyorsa o halde yazılımınızı tekrar gözden geçirmelisiniz.

- Alıntılarda burayı ve beni kaynak gösterirseniz sevinirim.
phpc