2FA Bypass Teknikleri

Penetrasyon testleri ve bug bounty sırasında en sık karşılaştığım güvenlik önlemlerinden biri 2FA, yani iki faktörlü kimlik doğrulama. Güzel bir güvenlik katmanı ama yanlış ya da eksik uygulandığında aşılması da bir o kadar mümkün hale geliyor. Bu yazıda, pratikte karşılaştığım veya testlerde denediğim bazı 2FA atlatma yöntemlerini paylaşmak istiyorum.


1. Response Manipulation (Yanıt Manipülasyonu)

Bazen uygulama sunucusundan dönen yanıt, istemci tarafında kontrolsüz şekilde yorumlanıyor. Örneğin:

Orijinal Yanıt:

{
  "success": false,
  "message": "Authentication failed"
}

Bu yanıtı intercept edip şöyle değiştirdiğinizde:

{
  "success": true,
  "message": "Authentication failed"
}

Uygulama sadece "success": true değerine bakıyorsa, 2FA’yı hiç geçmeden giriş yapılabiliyor.


2. Status Code Manipulation

Sunucu doğru şekilde doğrulama yapmamış olsa bile, HTTP status kodunu 401‘den 200 OK‘ye çevirerek istemciyi kandırmak mümkün olabilir.

Orijinal:

HTTP/1.1 401 Unauthorized
{
  "error": "Invalid credentials"
}

Manipüle edilmiş:

HTTP/1.1 200 OK
{
  "error": "Invalid credentials"
}

Eğer istemci sadece status kodunu kontrol ediyorsa, bu yöntemi kullanarak erişim sağlanabilir.


3. 2FA Kodunun Yeniden Kullanımı

Bir oturumda aldığın 2FA kodunu farklı bir oturumda da kullanabiliyorsan, bu durum sistemde tek kullanımlık doğrulama mantığının uygulanmadığını ve 2FA güvenliğinin ciddi şekilde zafiyet içerdiğini gösterir.

{
  "username": "user123",
  "2fa_code": "123456"
}

Bu kodu birden fazla oturumda kullanmak mümkünse, sistem 2FA’yı tamamen işlevsiz hale getirmiş demektir.


4. JavaScript Dosyası Analizi

Web uygulamalarında, istemci tarafına gönderilen JavaScript dosyalarında 2FA ile ilgili ipuçları sıkça yer alabiliyor. Özellikle frontend tarafında yapılmış kontroller varsa bu durum, güvenlik kontrollerinin atlatılmasını basit hale getirir.

Örnek bir yanıt:

var twoFactorEnabled = true;
var twoFactorMethod = "SMS";

function authenticateWith2FA() {
  // 2FA doğrulama kodu burada
}

Bu tür kodları analiz ederek, hangi yöntemle doğrulama yapıldığını, kontrollerin hangi tarafta (client/server) gerçekleştiğini anlayabiliyoruz. Sunucu tarafında kontrol yapılmıyorsa, sistem büyük risk altında demektir.


5. Brute-Force Koruması Yoksa?

Çoğu sistem, 2FA kodunu brute-force ile denemelere karşı korumalı olmalı. Rate limit olmayan durumlarda 2FA atlatılabilir.

Bu durumda Burp Suite’in Intruder aracıyla 000000 - 999999 arasında kodlarını deneyerek doğrulama adımı atlatılabilir:

{
  "username": "user123",
  "2fa_code": "123456"
}

Eğer 20 denemede bloklama olmuyorsa muhtemelen brute-force saldırısıyla doğrulama adımı atlanabilir.


6. 2FA Kodunda Kullanıcıya Özel Doğrulama Eksikliği

Bazı sistemler 2FA kodunu sadece geçerli bir kod olup olmadığına göre kontrol ediyor. Ancak bunu kimin kullandığını kontrol etmiyorsa, başka bir kullanıcının kodunu kendi hesabınızda kullanmanız mümkün olabilir.

Örnek:

{
  "username": "user123",
  "2fa_code": "123456"
}

Eğer aynı kodu user456 için de kullanabiliyorsanız, sistem kullanıcıya özel doğrulama yapmıyor demektir. Bu da çok kritik bir açık anlamına gelir.


7. CSRF ile 2FA Devre Dışı Bırakma

Bazı uygulamalarda 2FA’yı kapatmak için yapılan isteklerde CSRF koruması olmuyor. Bu durumda, kullanıcıyı farkında olmadan 2FA’sını kapattırmak mümkün hale geliyor.

POST /disable-2fa
Content-Type: application/json

{
  "disable": true
}

Uygun bir CSRF payload’ı ile bu isteği tetiklemek mümkünse, kullanıcı hiç farkında olmadan 2FA’sız kalabilir.


8. “Remember Me” Özelliğiyle 2FA’yı Atlamak

Bazı uygulamalar, “remember me” seçeneğini işaretlediğinizde 2FA bilgisini cookie, session, local storage hatta IP adresine bile bağlayabiliyor.

{
  "username": "user123",
  "remember_me": true
}

Bu tarz bir mantık varsa, farklı oturumlarda 2FA hiç tetiklenmeden erişim sağlamak mümkün olabiliyor.


9. 2FA Sonrası Sayfalara Direkt Erişim

Doğrudan 2FA sonrası açılan bir API ya da sayfaya istek göndererek, sistemin bu endpoint’lerde 2FA kontrolü yapıp yapmadığını test etmek işe yarayabilir.

GET /authenticated-api

2FA kontrolü sunucu tarafında değilse, bu şekilde doğrudan erişim sağlamak mümkün olabilir.


10. Referer Header Manipülasyonu

Bazı uygulamalar, gelen isteğin gerçekten 2FA’dan sonra gelip gelmediğini Referer header’ı üzerinden kontrol edebiliyor. Bu durumda sahte bir referer ile 2FA atlanabilir:

GET /authenticated-page
Referer: https://example.com/2fa

Yalnızca bu header’a bakılıyorsa, sistem kolayca kandırılabilir.


11. Sıralı OTP Üretimi

OTP’lerin rastgele değil de sıralı şekilde üretildiği sistemler. Bu durumda bir önceki OTP’yi bilen biri, sonraki kodu tahmin edebilir:

// İlk istek
{
  "2fa": "500060"
}

// İkinci istek
{
  "2fa": "500061"
}

Kodlar tahmin edilebilir ise, 2FA tamamen devre dışı kalıyor demektir.


12. OTP Parametresini Kaldırmak

Bazı sistemlerde, 2FA doğrulaması sırasında gönderilen parametreler zorunlu değilse, sadece OTP’yi request’ten çıkarmak bile sistemi geçmek için yeterli olabilir.

Orijinal:

{
  "email": "user@email.com",
  "2fa": "500061"
}

Manipüle edilmiş:

{
  "email": "user@email.com"
}

Eğer sistem bu request’i yine de kabul ediyorsa, 2FA kontrolü doğru yapılmamış demektir.


13. OTP Parametresine Farklı Değerler Vermek

OTP alanına çeşitli anormal değerler girerek sistemin 2FA kontrolünü atlayıp atlamadığını test etmek faydalı olabilir:

"2fa": ""
"2fa": null
"2fa": "null"
"2fa": "true"
"2fa": "00000"

Bu tür edge-case değerlerle yapılan denemeler, beklenmedik güvenlik açıklarını ortaya çıkarabilir.


14. Şifre Sıfırlama veya E-posta Değişikliği ile 2FA’nın Kapanması

Bazı sistemlerde şifre sıfırladığınızda veya e-posta adresinizi değiştirdiğinizde 2FA devre dışı kalabiliyor. Bu davranışı tetikleyerek 2FA’sız bir şekilde sisteme erişim sağlanabilir.


15. Backup Kodlarının Suistimali

Bazı sistemlerde “backup code” kullanımı zayıf kontrol ediliyor. Örneğin backup code süresiz geçerli olabilir, limit kontrolü yapılmaz ya da aynı kod birden fazla kullanılabilir.

Bu durumda backup kodlar üzerinden 2FA atlamak mümkün olur.


16. 2FA Devre Dışı Sayfasında Clickjacking

2FA’yı devre dışı bırakma sayfasını bir iframe içine yerleştirip, kullanıcının tıklamasını sağlamak (clickjacking) mümkündür. Kullanıcı hiç fark etmeden kendi hesabındaki 2FA’yı kapatabilir.


17. 2FA Kodunun Süre Bağımsızlığı

Birden fazla 2FA kodu oluşturup, önceki kodların hâlâ geçerli olup olmadığını test edebilirsiniz. Sistem önceki kodları süresi geçmiş olsa da kabul ediyorsa, burada ciddi bir açık vardır.

Uzun bir süre bekledikten sonra aynı kodu tekrar kullanmak da benzer şekilde test edilmelidir.