Manuel Kaynak Kod Analizinde Command Injection Zafiyetinin Tespit Edilmesi
İlk olarak Command injection zafiyetini tespit edelim. Bunun için dvwa ‘da command injection sekmesine geliyoruz. Payload yerine 127.0.0.1;id yazıyoruz.
Phpde muhtemelen aşağıdaki gibi bir kod çalışmaktadır:
system(‘ping –c 3’ . $ip)
Ve sonuç aşağıdaki şekildedir:
Command Injection için php projede aşağıdaki fonksiyonlar aratılabilir:
exec
eval
system
passthru
shell_exec
proc_open
pcntl_exec
Dvwa makinasında yer alan command injection bölümündeki low sekmesinden kaynak kodu inceleyelim:
1.<?php
2.if( isset( $_POST[ ‘submit’ ] ) ) {
3. $target = $_REQUEST[ ‘ip’ ];
4. if (stristr(php_uname(‘s’), ‘Windows NT’)) {
5. $cmd = shell_exec( ‘ping ‘ . $target );
6. $html .= ‘<pre>’.$cmd.’</pre>’;
7. } else {
8. $cmd = shell_exec( ‘ping -c 3 ‘ . $target );
9. $html .= ‘<pre>’.$cmd.’</pre>’;
10. }
11.}
5. ve 8.satırda işletim sistemine göre farklı kodlar çalıştırılmaktadır.
Zafiyeti fonksiyon olarak tespit ettikten sonra fonksiyonda kullanılan değişkenden girdi ve çıktı noktasına kadar ilerliyoruz. Burada komut çalıştırmak için shell_exec fonksiyonu kullanılmıştır.
Şimdi ise bunu bir ağaç yapısında gösterelim.
3.satırda ip parametresi ile alınan veri target değişkenine atanmaktadır.
$target = $_REQUEST[ ‘ip’ ];
5.satırda Windows işletim sistemi kullanılıyorsa komut çalıştırılmaktadır.
$cmd = shell_exec( ‘ping ‘ . $target );
6.satırda Windows işletim sistemi kullanılıyorsa çalıştırılan komutun çıktısı html değişkenine atanmaktadır.
$html .= ‘<pre>’.$cmd.’</pre>’;
8.satırda işletim sistemi Windowstan farklı ise komut çalıştırılmaktadır.
$cmd = shell_exec( ‘ping -c 3 ‘ . $target );
9.satırda işletim sistemi Windowstan farklı ise çalıştırılan komutun çıktısı html değişkenine atanmaktadır.
$html .= ‘<pre>’.$cmd.’</pre>’;
Zafiyeti gidermek için sadece IP adresi girildiği kontrol edilebilir.
$target = $_REQUEST[“ip”];
$target = stripslashes( $target );
$octet = explode(“.”, $target);
if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4) ) {
$target = $octet[0].’.’.$octet[1].’.’.$octet[2].’.’.$octet[3];
#işlem yapılmaktadır.
else {
$html .= ‘<pre>ERROR: You have entered an invalid IP</pre>’;
}
Veya aşağıdaki şekilde kod düzenlenerek özel karakterlerden kaçması sağlanabilir.
$target = escapeshellcmd($target);
$cmd = shell_exec( ‘ping -c 3 ‘ . $target );
Command injection trafik analizi yazısına https://kaleileriteknoloji.medium.com/command-injection-trafik-analizi-50e746878299 ‘den ulaşabilirsiniz.