top of page

Lab: Authentication bypass via encryption oracle

Yazarın fotoğrafı: Songül ÖZÜGÜRLER
Songül ÖZÜGÜRLER
28 Nis
3 dakikada okunur

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.

Lab: Authentication bypass via encryption oracle

İ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.

Lab: Authentication bypass via encryption oracle

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

Lab: Authentication bypass via encryption oracle

- 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

Lab: Authentication bypass via encryption oracle

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

Lab: Authentication bypass via encryption oracle

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.

Lab: Authentication bypass via encryption oracle

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:1768243034172

Request’i gönderdim. Response’ta yeni bir:

- Set-Cookie: notification=

Lab: Authentication bypass via encryption oracle

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

Lab: Authentication bypass via encryption oracle

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

Lab: Authentication bypass via encryption oracle

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
Lab: Authentication bypass via encryption oracle

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.

Lab: Authentication bypass via encryption oracle

Yeni ciphertext’i Decoder’a gönderdim:

- URL-decode

- Base64-decode

Sonra Hex’te bu sefer ilk 32 byte’ı (2 blok) sildim.

Lab: Authentication bypass via encryption oracle

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:

Lab: Authentication bypass via encryption oracle

"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

Lab: Authentication bypass via encryption oracle

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

Lab: Authentication bypass via encryption oracle

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 🌸

 
 
bottom of page