Memcache Injection
PHP kendi içerisinde Memcached adında bir cache kütüphanesi bulundurur. Memcached kütüphanesi nesne oluşturarak çalışır. Gelen cache değerini addServer ile sunucuya bağlanıp kaydeder.
Örnek verelim;
<?php
$m = new Memcached();
$m->addServer("localhost", 11211);
$m->set($_GET["key"], "123456", 0, 10);
echo $m->get($_GET["key"]); //123456
Memcached, 11211 portundan çalışır. Port kontrolü yapılmamış ve dışarıya açık bırakılmışsa zafiyet açığa çıkabilir. Gelen key değeri filtreleme yapılmadan Memcached içerisine alınmış.
Php telnet ile 11211 portuna bağlantı kurar.telnet 127.0.0.1 11211
Şimdi set ile kayıt altında tutacağımız değeri gönderelim.set key 0 10 5
Burada key kelimesini set ediyoruz. Sırasıyla;
0 -> Gönderilen değerin sıkıştırılıp sıkıştırılmaması bilgisidir. 0, sıkıştırma. 1, sıkıştır
10-> Gönderilen değerin ne kadar süre cache’de duracağını bildirdik (Saniye cinsinden).
5-> Gönderdiğimiz değerin karakter uzunluğu bilgisidir.
Port dışarıya açık olduğu için, saldırgan burada telnet kullanarak cache bağlantısı kurabilir. Cache içersindeki değerleri okuyabilir.
Telnet bağlantısı yaptıktan sonra alt satıra geçip set ile değer gönderebilir.
Memcache Injection Saldırılarından Nasıl Korunabiliriz?
Yazılımcı alt satıra geçmeyi önlemiş olsun. Memcache en fazla 250 karaktere kadar değer alabilir. 250'den fazla bir değer verildiğinde hata verir. Burada saldırgan 250'den fazla bir değer vererek hata verdirebilir ve terminalin alt satıra geçmesini sağlar.
Bu durumu önlemek için;
Gönderilen değerin en fazla 250 karakter olmasına izin verecek kontrol yapılabilir. Gelen tüm değerler ord ile decimal hale çevrilebilir. Nullbyte ve Crlf girdileri engellenebilir.
11211 portu dışarıdan erişime kapatılmalıdır. Açık bırakılması gerekiyorsa parola konulmalıdır.