Lab: Authentication bypass via flawed state machine
Lab: Authentication bypass via flawed state machine
Bu labda, login sürecindeki adımların belirli bir sırayla kesinlikle gerçekleşeceği varsayımına dayanan hatalı bir state machine bulunuyor. Uygulama, bazı adımların atlanamayacağını düşünüyor; ancak bu varsayım backend tarafında düzgün şekilde enforce edilmediği için ciddi bir authentication bypass ortaya çıkıyor.
Amaç; bu mantık hatasını istismar ederek kimlik doğrulamayı atlamak , admin paneline erişmek ve carlos kullanıcısını silmek.
Lab boyunca kendi hesabımı kullandım. Giriş yapmak için verilen bilgiler: wiener : peter
Burp açıkken normal bir login işlemi yaptım ve istekleri izlemeye başladım. Burada dikkatimi çeken ilk şey şuydu:
Login işleminden sonra uygulama beni doğrudan ana sayfaya yönlendirmiyor. Araya bir rol seçme adımı koyuyor.

Akış kabaca şöyle ilerliyor:
- Kullanıcı adı ve şifre gönderiliyor
- Login başarılı oluyor
- Kullanıcıdan rol seçmesi isteniyor
- Daha sonra ana sayfaya yönlendiriliyor
- Bu noktada aklıma şu soru geldi: “Bu rol seçme adımı gerçekten zorunlu mu, yoksa sadece frontend tarafında mı varsayılıyor?”
Login sırasında Burp’te ilk olarak şu isteği görüyorum:

Bu istekte kullanıcı adı, şifre ve CSRF token gönderiliyor. Bu isteği forward ettikten hemen sonra ikinci bir istek geliyor
GET /role-selector
Yani uygulama şunu varsayıyor:
“Login olduysan, mutlaka role-selector çalışır.”
İşte bu varsayım, labın kırıldığı yer.
Burada denemek istediğim şey basitti:
Rol seçme adımı gerçekten zorunluysa, bu isteği atladığımda sistem beni durdurmalı.
Bu yüzden Burp’te:
- POST /login isteğini forward ettim

- Ardından gelen GET /role-selector isteğini drop ettim (sunucuya hiç göndermedim)
Sonrasında tarayıcıdan manuel olarak lab’ın ana sayfasına gittim.

Rol seçimi hiç yapılmamış olmasına rağmen uygulama:
- Session’ı geçerli kabul etti
- Rol bilgisini kontrol etmeden devam etti
- Ve rolümü varsayılan olarak admin gibi değerlendirdi
Bunu da hemen fark ediyorsunuz çünkü normalde erişilemeyen /admin paneline erişim açılıyor.
Yani sistemin mantığı şu hale gelmiş oluyor:
“Rol seçilmediyse → en güvenli varsayım admin olsun.”
Bu da klasik bir fail-open state machine hatası.
Admin yetkisiyle:
- /admin paneline girdim

- carlos kullanıcısını sildim
Ve lab başarıyla tamamlandım

Çünkü:
- Kullanıcı, yetkilendirme sürecinin zorunlu bir adımını atlayarak
- Sistemin kendisine en yüksek yetkiyi vermesini sağlıyor
Bu bir input manipulation değil, tamamen login akışının yanlış modellenmesi ile ilgili bir mantık hatası.
Bu lab bize şunu net şekilde gösteriyor:
- State machine’ler varsayımlarla değil, kontrollerle çalışmalı
- Zorunlu adımlar backend tarafında enforce edilmeli
- “Eksik adım = güvenli varsayım” yaklaşımı felaketle sonuçlanır
Özetle:
Fail-safe değil, fail-open davranan her auth flow kırılmaya mahkûmdur.
Bir sonraki labta görüşmek üzere 🌸







