Ders 6 - Command Injection (High Level) | |||||
Bu yazıda güvenlik düzeyi High seviyesine yükseltilmiş DVWA'ya karşı Command Injection saldırısı yapılabilir mi yapılamaz mı sorusunun cevabı irdelenecektir.
Konuya giriş yapmadan önce bu yazının dahil olduğu dvwa eğitim serisindeki tüm makalelere şu adresten bu yazının ilintili olduğu dvwa eğitim serisindeki diğer makalelere ise şu adreslerden
erişebilirsiniz. Dersin HedefiCommand Injection önlemlerinde yapılabilecek bir hata örneğine göz atın, atlatın ve command injection'a karşı nasıl korunulurun cevabını keşfedin.Command Injection'a Karşı Önlemi Atlatmaİlk Command Injection dersinde bir command injection saldırısında bulunmuştuk ve bir sayfa hack'lemiştik. İkinci Command Injection dersinde seviyesi arttırılmış güvenliği atlatmanın yolunu göstermiştik. Bu Command Injection dersinde ise seviyenin bir kademe daha yükseltildiği bir sayfanın güvenliğini nasıl temin ettiğine bakacağız. High Level'ın kaynak kodu şu şekildedir:Command Injection (High Level): <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = trim($_REQUEST[ 'ip' ]); // Set blacklist $substitutions = array( '&' => '', ';' => '', '| ' => '', '-' => '', '$' => '', '(' => '', ')' => '', '`' => '', '||' => '', ); // Remove any of the charactars in the array (blacklist). $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // Determine OS and execute the ping command. if( stristr( php_uname( 's' ), 'Windows NT' ) ) { // Windows $cmd = shell_exec( 'ping ' . $target ); } else { // *nix $cmd = shell_exec( 'ping -c 4 ' . $target ); } // Feedback for the end user echo "{$cmd}"; } ?> Güvenlik Medium seviyesinde iken sadece && ve ; karakterleri metin kutusundan gelen veriden siliniyordu. Güvenlik High seviyesinde iken yukarıdaki $substitution dizisinden de görülebileceği gibi silinecek operatörlerin sayısı arttırılmıştır. Şimdi bir önceki derste kullandığımız sofistike yöntemin bu güvenlik seviyesini geçip geçemediğine bir bakalım. Geçen derste güvenliği atlatan kod şu şekilde idi: 1 &;& cat /etc/passwd Bu numara bu sefer sökmeyecektir. Çünkü filtrelenecekler listesinde bu sefer && silinsin denilmemiş, & silinsin denilmiş. Dolayısıyla yukarıdaki kod str_replace() fonksiyonundan geçince şu hale dönüşecektir: 1 cat /etc/passwd Yukarıdakini alan shell_exec() fonksiyonu bunu bir IP adresi diye alacaktır ve bu yorumlanamayacağı için de komut satırı hata verecektir ve bir çıktı döndürmeyecektir. Sonuç olarak ekrana enjekte edilmesini umduğumuz cat komutunun çıktısı yansımayacaktır. Fakat kara liste güvenlik önlemine daha dikkatli bakalım. Web uygulama "high" güvenlik seviyesinde bu sefer farklı bir nedenden dolayı gol yiyecektir ve hack'lenebilir olacaktır. 11nci satırda | karakterini silme işlemi yerine | ve (boşluk) karakter dizisini silme işlemi uygulanmaktadır. Yani | operatörünün sağına klavye yazım hatası nedeniyle black list güvenlik önleminde boşluk karakteri eklenmiş. Bu hata saldırganların boşluk girmeden | karakterini kullanabileceği anlamına geliyor. Yani boşluk girmeden | karakterini kullanarak saldırganlar halen command injection saldırısı yapabilirler. Örneğin high seviyede command injection metin kutusuna sonrasına boşluk bırakmadan enjekte edilecek komut girildiğinde sonuç başarılı olacaktır. 1 |cat /etc/passwd veya 1|cat /etc/passwd Bu iki kullanım ile de high seviye güvenlik önlemi atlatılabilecektir ve enjeksiyon çalışacaktır. ![]() ![]() Shell kodlamasında | operatörü ilk komutun stdout'unu sonraki komutun stdin'ine aktarmaya yarar. Yani ilk komutun çıktısı | operatörü ile ikinci komutu girdi olarak verilir. Burada ilk komut ping 1'dir. Bu komuttan gelen hata çıktısı enjekte ettiğimiz cat komutuna aktarılacaktır, fakat cat komutu arguman olarak /etc/passwd aldığından bu ilk komuttan gelen çıktıyı ele almayacaktır. Kendi çıktısını ekrana verecektir. Sonuç olarak | operatörü ile de enjeksiyonu kesintisiz şekilde sürdürebilmekteyiz. Command Injection'a Karşı ÖnlemHigh güvenlik seviyesinde yazım hatası yapılabileceği durum ele alınmıştır. Peki bu hatayı da yapmamış olsaydık bu güvenlik bizim için yeterli miydi? Cevap hayır. Daha da sıkı bir güvenlik önlemi vardır. Impossible seviyesine bir göz atalım.Command Injection (Impossible): <?php if( isset( $_POST[ 'Submit' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $target = $_REQUEST[ 'ip' ]; $target = stripslashes( $target ); // Split the IP into 4 octects $octet = explode( ".", $target ); // Check IF each octet is an integer if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) { // If all 4 octets are int's put the IP back together. $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; // Determine OS and execute the ping command. if( stristr( php_uname( 's' ), 'Windows NT' ) ) { // Windows $cmd = shell_exec( 'ping ' . $target ); } else { // *nix $cmd = shell_exec( 'ping -c 4 ' . $target ); } // Feedback for the end user echo "<pre>{$cmd}</pre>"; } else { // Ops. Let the user name theres a mistake echo '<pre>ERROR: You have entered an invalid IP.</pre>'; } } // Generate Anti-CSRF token generateSessionToken(); ?>12, 15 ve 17nci satırlarda çok sıkı bir güvenlik tedbiri alındığını görebilirsiniz. Girdi olarak gelen veri önce . karakterine göre parçalara (veri gerçekten de ip ise 4 parçaya) ayırılıyor. Her parça sayı mı diye kontrol ediliyor. Ardından kontrol edilen parçalar birleştiriliyor ve shell_exec() fonksiyonuna bu denetim sonrası veriliyor. Burada alınan önlem teorik açıdan daha sıkı bir önlemdir ve aşılamazdır. Dolayısıyla geliştiriciler command injection zafiyetlerine karşın bu v.b. beyaz liste önlemlerine başvurmalıdırlar. SonuçGüvenlik Medium seviyesinde iken kara liste diye tabir edilen güvenlik prosedürü uygulanmıştır. Yani kara listede olanları filtrele, gerisini salıver mantığı... Bu yazının konusu olan High seviyesinde ise yine kara liste yöntemi uygulanmıştır, fakat kara listenin kapsamı genişletilmiş ve daha hassas oluşturulmuştur. Güvenlik camiasında bir de beyaz liste ile güvenlik sağlama yöntemi vardır. Bu yönteme göre sözgelimi metin kutusundan gelecek veri içerisinden beyaz listede olanları çek, gerisini sil mantığı güdülür. Kara liste ise bunun tam tersidir: "Kara listede olanları sil, gerisini çek". Güvenlik uzmanları tarafından beyaz liste önerilmektedir. Çünkü en kaliteli ve sağlam güvenlik beyaz liste ile temin edilebilir. Kara liste güvenliği belli bir miktar sağlar, fakat gelecekte gelebilecek yeni tür ataklara karşı savunmasızdır. |
|||||
![]() |
|||||
|
|||||
Yorumlar |
|||||
Henüz yorum girilmemiştir. | |||||
Yorum Ekle | |||||