Manuel Kaynak Kod Analizinde Command Injection Zafiyetinin Tespit Edilmesi

kaleileriteknoloji
2 min readAug 13, 2021

İ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.

--

--