Manuel Kaynak Kod Analizinde File Upload Zafiyetinin Tespit Edilmesi

kaleileriteknoloji
2 min readAug 16, 2021

--

İlk olarak aşağıdaki basit php shellimizi yazalım ve shell.php olarak kaydedelim.

Upload menüsünden oluşturmuş olduğumuz shell.php dosyasını yükleyelim. Dosya bulunduğumuz dizine göre ../../hackable/uploads/ dizinine yüklenmektedir.

Shell.php’nin cmd parametresiyle whoami komutunun çalıştırılmasını aşağıdaki şekilde sağlayalım.

File upload zafiyeti için php projede aşağıdaki fonksiyonlar aratılabilir:

move_uploaded_file

Dvwa makinasında yer alan Upload bölümündeki low sekmesinden kaynak kodu inceleyelim:

1.<?php

2. if (isset($_POST[‘Upload’])) {

3. $target_path = DVWA_WEB_PAGE_TO_ROOT.”hackable/uploads/”;

4. $target_path = $target_path . basename( $_FILES[‘uploaded’][‘name’]);

5. if(!move_uploaded_file($_FILES[‘uploaded’][‘tmp_name’],$target_path)) {

6. $html .= ‘<pre>’;

7. $html .= ‘Your image was not uploaded.’;

8. $html .= ‘</pre>’;

9. } else {

10. $html .= ‘<pre>’;

11. $html .= $target_path . ‘ succesfully uploaded!’ ;

12. $html .= ‘</pre>’;

13. }

14. }

15. ?>

5.satırda dosyayı yükleme işlemi kontrol edilmekte eğer yüklenebilirse path ile birlikte yüklemenin başarılı olduğu bilgisi html değişkenine eklenmektedir.

Zafiyetli fonksiyon tespit ettikten sonra fonksiyonda kullanılan değişkenden girdi ve çıktı noktasına kadar ilerleyerek ağaç yapısını oluşturalım.

Şimdi ise bunu bir ağaç yapısında gösterelim.

4.satırda yüklenmek istenen dosyanın adı hedef yol şeklinde oluşturulmuştur.

$target_path = $target_path . basename( $_FILES[‘uploaded’][‘name’]);

5.satırda herhangi bir kontrol yapılmadan dosya yüklenmeye çalışılmıştır.

if(!move_uploaded_file($_FILES[‘uploaded’][‘tmp_name’],$target_path)) {

7.satırda satırda yükleme başarılı değilse aşağıdaki ifade html değişkenine eklenmiştir:

$html .= ‘Your image was not uploaded.’;

11.satırda yükleme başarılı ise aşağıdaki ifade html değişkenine eklenmiştir:

$html .= $target_path . ‘ succesfully uploaded!’

Dosya yüklenen alan web sunucusunun dışında seçilirse yüklenen dosyaya erişim ortadan kalkacaktır.

Eğer dosya yükleme işlemi devre dışı bırakılması isteniyorsa php.ini içerisinde file_uploads=’off’ olarak değiştirilmelidir.

Dosya yükleme mecbur tutuluyorsa ve web sunucusundan yüklenen veriye erişilmek isteniyorsa aşağıdaki kontrollerin yapılması faydalı olacaktır.

-Dosya boyut kontrolü

$uploaded_name = $_FILES[‘uploaded’][‘name’];

$uploaded_size = $_FILES[‘uploaded’][‘size’];

if ($uploaded_size < 100000)

-Dosya tip kontrolü

$uploaded_name = $_FILES[‘uploaded’][‘name’];

$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, ‘.’) + 1);

if (($uploaded_ext == “jpg” || $uploaded_ext == “JPG” || $uploaded_ext == “jpeg” || $uploaded_ext == “JPEG”)

-MIME tip kontrolü

$uploaded_name = $_FILES[‘uploaded’][‘name’];

$uploaded_type = $_FILES[‘uploaded’][‘type’];

if (($uploaded_type == “image/jpeg”)

-Dosya içerik kontrolü

Burada shell olup olmadığının kontrolü için dosya.txt system ifadesinin kontrolü sağlanmıştır.

<?php

$dosya = @fopen ( “dosya.txt”, ‘r’ );

$veri = fread($dosya, 1024);

fclose ( $dosya );

if(strstr($veri,”system”)){

echo “Dosyada var <br />”;

}else{

echo “Dosyada yok <br />”;

}

?>

File Upload zafiyetine ait trafik analizi yazımıza https://kaleileriteknoloji.medium.com/file-upload-trafik-analizi-31fc06dfec3c linkinden ulaşabilirsiniz.

--

--