Lab: Authentication bypass via encryption oracle
Lab: Authentication bypass via encryption oracle
Bu labda, kullanıcılara bir encryption oracle (şifreleme/çözme oracle’ı) açığa çıkaran bir mantık hatası bulunuyor. Labı çözmek için bu hatayı kullanarak admin paneline erişmek ve carlos kullanıcısını silmek gerekiyor.
Aşağıdaki bilgilerle giriş yapabiliriz: wiener:peter
Bu labda olay “admin şifresini bul” falan değil. Asıl mesele, uygulamanın bana farkında olmadan şifreleme/çözme oracle’ı vermesi. Ben de bu oracle’ı kullanıp kendi admin cookie’mi ürettim ve admin paneline yürüdüm.

İlk iş wiener:peter ile giriş yaptım ve Stay logged in seçeneğini işaretledim. Sonra bir blog postuna gidip bir yorum gönderdim.

Burada “şüpheli” kısmı yakalamak için email alanına bilerek geçersiz bir şey yazdım Bunu gönderince response’ta iki şey dikkatimi çekti

- Uygulama beni post sayfasına redirect ederken bir cookie set ediyordu:
- Set-Cookie: notification=...
- Ve sayfada hata mesajı açık açık benim girdiğimi gösteriyordu:
- Invalid email address: abc2
Burada aklıma şu geldi: Bu hata mesajı bir yerden çözülüp geliyor. Çünkü ben sadece email alanına abc yazdım; uygulama bunu şıkır şıkır ekrana basıyor. Büyük ihtimalle notification cookie’sinin içeriği decrypt edilip mesaj oluşturuluyor.
Proxy history’de bu akışa ait iki isteği yakalayıp Burp Repeater’a attım:
- POST /post/comment

- Redirect sonrası gelen GET /post?postId=3 notification cookie’yi taşıyan

Repeater’da kendime kolaylık olsun diye tab’leri yeniden adlandırdım:
- POST /post/comment → encrypt
- GET /post?postId=x → decrypt
Bu noktada tablo kafamda netti:
- encrypt tabı: email parametresi → şifreli notification cookie üretir
- decrypt tabı: notification cookie → çözülür ve hata mesajı olarak ekrana basar
Şimdi hedefim, admin olmak için stay-logged-in cookie’nin formatını çözmekti.
Bunun için decrypt isteğinde şunu yaptım:
- notification cookie değerini sildim
- yerine kendi stay-logged-in cookie değerimi yapıştırdım
Sonra request’i gönderdim.
Normalde sayfada Invalid email address: ... görmem gerekirken bu kez response içinde çözülmüş bir değer gördüm.

Buradan net şekilde anladım: ✅ stay-logged-in cookie formatı: username:timestamp
Timestamp’i kopyaladım. Çünkü admin cookie üretirken bunu kullanacağım.
Şimdi sıra admin için aynı formatı üretmeye geldi.
encrypt isteğine geri döndüm ve email parametresini şu yaptım:
administrator:1768243034172Request’i gönderdim. Response’ta yeni bir:
- Set-Cookie: notification=

geldi. Bu cookie, benim girdiğim string’i şifreleyip taşıyordu.

Sonra bu yeni notification cookie’yi decrypt isteğinde denedim. Çözülen değer
Yani uygulama, email parametresine verdiğim her şeyin başına otomatik olarak şu prefix’i koyuyordu:
"Invalid email address: "Bu prefix’in uzunluğu 23 karakter . Ben de tamam bunu keseyim” dedim ama burada lab tokat attı.
notification değerini Burp Decoder’a yolladım ve sırasıyla:
- URL-decode
- Base64-decode
yaptım. Elimde raw bytes oluştu.
Sonra Repeater’da Hex görünümüne geçip ilk 23 byte ’ı silmeyi denedim

Ama bunu yapınca tekrar encode edip decrypt isteğine yolladığımda sistem şu tarz bir hata verdi:
Input length must be multiple of 16 when decrypting with padded cipher

Bu bana şunu söyledi: Şifreleme blok tabanlı (AES gibi) ve blok boyutu 16 byte Dolayısıyla ciphertext uzunluğu 16’nın katı olmak zorunda.
Ben 23 byte silince blok hizasını bozmuş oluyorum → patlıyor.
Madem 23 byte silinemiyor, o zaman prefix’i 16’nın katı olacak hale getirmem gerekiyor.
23’ü en yakın 16 katına tamamlayalım:
- 32 = 16 × 2
- 32–23 = 9
Yani prefix’in yanına 9 byte daha eklersem, toplam “silinmesi gereken kısım” 32 byte olur.
Bu yüzden encrypt isteğinde email’i şu hale getirdi
xxxxxxxxxadministrator:1768243034172
(9 tane x — tamamen padding, anlamı yok.)
Bunu encrypt ettim ve oluşan yeni notification cookie’yi aldım.

Yeni ciphertext’i Decoder’a gönderdim:
- URL-decode
- Base64-decode
Sonra Hex’te bu sefer ilk 32 byte’ı (2 blok) sildim.

Ardından tekrar
- Base64 encode
- URL encode
yapıp çıkan değeri tekrar decrypt isteğinde notification olarak gönderdim.
Bu kez response’ta şunu gördüm:

"Invalid email address: " prefix’i artık yoktu. Yani elimde artık sistemin kabul edeceği formatta “admin stay-logged-in değeri” vardı.
Son kısımda proxy history’den GET / isteğini Repeater’a gönderdim.
Burada çok önemli iki hareket yaptım:
- session cookie’yi tamamen sildim
- stay-logged-in cookie’nin değerini, benim ürettiğim ciphertext ile değiştirdim

Request’i gönderince artık administrator olarak giriş yapmış oldum. Admin paneline erişim açıldı.
Admin olarak şuraya gittim:
- /admin
Sonra labı bitirmek için:
- /admin/delete?username=carlos

Kısa özet
- POST /post/comment → email parametresini encrypt ediyor , notification cookie üretiyor ( encrypt oracle )
- GET /post?postId=x → notification cookie’yi decrypt ediyor , mesaj basıyor ( decrypt oracle )
- stay-logged-in decrypt → username:timestamp formatını öğren
- administrator:timestamp encrypt et
- Prefix 23 byte → blok 16 byte → 23 silince patlar
- 9 padding ekle → 32 byte sil → temiz administrator:timestamp
- session’ı sil, stay-logged-in’i admin ciphertext ile değiştir → /admin → carlos’u sil
Bir sonraki labta görüşmek üzere 🌸







