Command Exec

Bu zafiyet türü doğrudan sunucuya erişim sağlar. Alınan girdinin arka planda çalışması gereken durumlar olabilir. Bir örnek üzerinden gidelim. Uygulamada bir input olsun. Kullanıcı buradan domain adresini girsin, domainin ip adresini öğrensin. Yazılımcı aldığı domainin ip adresini bulmak için nslookup, ping ya da traceroute gibi komutları kullanmalıdır. Ping komutu ile kullanıcıdan gelen veriyi almış olsun. İp adresini bulmak için exec() veya system_exec() gibi bir komut kullanmalıdır. Bu komutlar terminal üzerinden çalışmayı gerektiren komutlardır. Burada saldırgan bir açık bulduğunda doğrudan sunucuya erişmiş olur.

Yazılımcının, aldığı girdiyi hiçbir filtrelemeden geçirmeden doğrudan komut içerisine eklediğini düşünelim. Girdi olarak site.com; uname; yazıp gönderdiğimizde noktalı virgül yapılan işlemi sonlandırır. Bir sonraki komut çalışır.
Uname ile sunucu hakkında bilgileri çekmiş oluruz.(işletim sistemi, versiyon vs.). Noktalı virgül engellenmiş ise komut çalışmadığında | işareti kullanarak deneriz. Yine başarısız olursak < ya da << işaretleriyle deneriz.

Bu denemeleri yapmak için http://php.testparker.com/nslookup.php adresini kullanabilirsiniz. Buradaki sunucuda windows kurulu olduğu için cmd komutları çalıştırmanız gerekir.'& dir & komutu girdiğinizde dosyaların listelendiğini görebilirsiniz. Burada ip bilgisi string olarak alındığı için ' ile ip istek tarafını kapattık.

Command Exec Saldırılarından Nasıl Korunabiliriz?

Whitelist kullanılmalıdır. RegEx kural yazılmalıdır.

Örneğin,

if(!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/', $_GET['ip']))){
 die("formata uygun bir ip adresi girin.");
}
 system(ping -c $_GET['ip']);

Yazılımcı burada sadece en çok üç haneli, dört blok olacak formatta girilen ip değerini aramaya çalışır. Bu şekilde kontroller yazmak güvenlidir. Tabi öncesinde sadece . nokta işareti kullanmaya izin verilmelidir.

results matching ""

    No results matching ""