Hoşgeldin Misafir

Sessiz Tehlike: API'lerin Kalbine İnmek - Insecure Deserialization

Conrado Sol

29 Nis 2026
62 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Bugün yeni bir konu ile karşınızdayım. Benim de sevdiğim konulardan bir tanesidir.

Siber güvenlik dünyasına yeni adım atan herkesin gözü genellikle aynı yerlerdedir. SQL Injection (Veritabanı sızması) ya da XSS (Tarayıcıda kod çalıştırma). Bunlar elbette kritiktir ama modern web dünyasının, özellikle devasa Java, PHP uygulamalarının ve API'lerin arka planında yatan çok daha "sessiz" ve ölümcül bir tehlike var: Güvensiz Serileştirme (Insecure Deserialization).

Bugün size, sisteme tırnak işareti (') veya scr*pt tagı (<scr*pt>) göndermeden, sadece sunucunun "dilini" konuşarak içeride nasıl uzaktan kod çalıştırılabileceğinden (RCE) bahsedeceğim.


Serileştirme (Serialization) Nedir? (Taşınma Mantığı)


Bir tarafta RAM'deki karmaşık bir obje, ortada paketlenmiş hali (byte/string kolisi), diğer tarafta tekrar objeye dönüşümü. Bu, yeni başlayanların kafasında olayı anında somutlaştırır.

Olayın mantığını anlamak için yazılım mimarisine inmemiz lazım. Bir program çalışırken RAM üzerinde "Objeler" (Nesneler) yaratır. Örneğin bir Kullanici objesi düşünün; içinde adı, yetkisi ve şifresi var.

Eğer bu objeyi veritabanına kaydetmek veya başka bir sunucuya göndermek isterseniz, onu RAM'deki o karmaşık haliyle gönderemezsiniz. Onu düz bir metne (String) veya bayt (Byte) dizisine çevirmeniz gerekir.
  • Tıpkı ev taşırken eşyaları koliye koyup bantlamak gibi. Buna Serialization (Serileştirme) denir.
  • Karşı sunucu bu koliyi aldığında açar, içindeki eşyaları eski formuna (Obje) geri getirir. Buna da Deserialization (Tersine Serileştirme) denir.


Tehlike Nerede Başlıyor? (Koliye Saatli Bomba Koymak)


Sorun şu: Sunucu, kendisine gelen bu "koliyi" açarken içindekilere körü körüne güvenir.

1gvaaef.png



Diyelim ki siteye giriş yaptınız. Sunucu sizin yetkinizi belirleyen bir objeyi serileştirip size Çerez (Cookie) olarak verdi:

Kod:
O:4:"User":2:{s:8:"username";s:5:"admin";s:4:"role";s:4:"user";}

(Bu standart bir PHP serileştirme çıktısıdır. Diyor ki: Bu bir "User" objesi, rolü de "user".)

Normal bir kullanıcı bu çerezi saklar ve gezinir. Ancak bir Ar-Ge'ci ya da Hacker bu koliyi açar, içindeki s:4:"user" kısmını s:5:"admin" olarak değiştirir ve koliyi sunucuya geri yollar.

Sunucu bu paketi alıp unserialize() (Paketi aç) işlemine soktuğu an, artık sistemde yetkisiz bir Admin'siniz demektir.



Gerçek Hayat Senaryosu: VIP Bilet Avı


Düşünün ki bir e-ticaret sitesindesiniz ve Tarkan konserine bilet alacaksınız. Normal bilet 500 TL, VIP bilet 5000 TL. Sepete normal bileti eklediniz. Sistem size bir "Sepet" objesi oluşturdu ve çerez (cookie) olarak tarayıcınıza bıraktı:
Kod:
O:4:"Cart":2:{s:4:"item";s:6:"Normal";s:5:"price";i:500;}

Şimdi bir Hacker şapkasını takın. O çerezi kopyaladınız, Base64'ü çözdünüz ve sadece iki kelimeyi değiştirdiniz:
Kod:
O:4:"Cart":2:{s:4:"item";s:3:"VIP";s:5:"price";i:10;} (VIP bileti 10 TL yaptık!)


b7fu8x8.png



Çerezi geri yükleyip F5'e bastığınızda sunucu o koliyi açar, içindeki verilere körü körüne güvenir ve karşınızda 10 TL'ye VIP bilet durmaktadır. İşte sistemin kendi mekanizmasını, sisteme karşı kullanmak tam olarak budur!



Sadece Yetki Yükseltme mi? (RCE ve Sihirli Metotlar)


Keşke sadece yetki yükselebilseydi... İşin "Sessiz Tehlike" kısmı burada başlıyor. Modern dillerde (Özellikle PHP ve Java) Sihirli Metotlar (Magic Methods) vardır. Mesela PHP'de __destruct() adında bir metot, obje hafızadan silinirken otomatik çalışır.

Eğer sistemde, silinirken "Log dosyasını okuyan" veya "Sistem komutu çalıştıran" bir sınıf (Class) varsa;

Saldırgan o sınıfın adını koliye yazar. İçine de komut olarak rm -rf / veya whoami gibi sunucu komutları yerleştirir.

Sunucu koliyi açtığı an, o sihirli metot tetiklenir ve sunucunun kalbinde (Terminal seviyesinde) kod çalışmış olur. Veritabanına hiç dokunmadan sunucuyu ele geçirirsiniz!

4hkvs3r.png




Nasıl Korunulur? (Son Söz)


Bu zafiyet OWASP Top 10 listesinde yıllarca zirveyi zorlamıştır çünkü tespiti ve çözümü zordur. WAF'lar (Güvenlik Duvarları) genellikle bu saldırıları yakalayamaz çünkü gelen veri "zararlı bir kod" gibi değil, uygulamanın kendi meşru objesi gibi görünür.
  • Asla Kullanıcıya Güvenmeyin: Kullanıcıdan gelen veriyi doğrudan unserialize() ya da ObjectInputStream gibi fonksiyonlara sokmayın.
  • Güvenli Formatlar Kullanın: Objeleri native (kendi dillerindeki) karmaşık serileştirme yerine, sadece veri taşıyan JSON formatında aktarın. JSON, içindeki veriyi obje olarak çalıştırmaz, sadece okur.
  • İmzalama (Integrity): İlla serileştirilmiş veri kullanacaksanız, paketin değiştirilmediğinden emin olmak için HMAC ya da dijital imza (Digital Signature) ile veriyi mühürleyin.
Özetle: Siber güvenlik sadece "yanlış karakterler" aramak değildir. Bazen sistemin tam olarak "tasarlandığı gibi" kusursuz çalışması, en büyük zafiyetin ta kendisidir.

Umarım faydalı olmuştur. Sorunuz olması dahilinde yorumlarda yazmaktan çekinmeyin.