Upload Vulnerabilities - Bypassing Server-Side Filtering: File Extensions


apa yang terjadi jika Anda tidak dapat melihat atau memanipulasi kode tersebut? Nah, itulah filter sisi server. Singkatnya, kita harus melakukan banyak pengujian untuk membangun ide tentang apa yang diizinkan atau tidak diizinkan melalui filter, lalu secara bertahap menyusun payload yang sesuai dengan batasan.

situs web yang menggunakan daftar hitam untuk ekstensi file sebagai filter sisi server. Ada berbagai cara berbeda untuk mengkodekannya, dan jalan pintas yang kita gunakan bergantung pada hal itu. Di dunia nyata, kita tidak akan dapat melihat kode untuk ini, tetapi untuk contoh ini, kode tersebut akan disertakan di sini:

<?php
//Get the extension
$extension = pathinfo($_FILES["fileToUpload"]["name"])["extension"];
//Check the extension against the blacklist -- .php and .phtml
switch($extension){
case "php":
case "phtml":
case NULL:
$uploadFail = True;
break;
default:
$uploadFail = False;
}
?>


Dalam contoh ini, kode mencari titik terakhir ( .) pada nama berkas dan menggunakannya untuk mengonfirmasi ekstensi, jadi itulah yang akan coba kita lewati di sini. Cara lain kode tersebut dapat berfungsi meliputi: mencari titik pertama pada nama berkas, atau membagi nama berkas pada setiap titik dan memeriksa apakah ada ekstensi yang masuk daftar hitam. Kita akan membahas kasus terakhir ini nanti, tetapi sementara ini, mari kita fokus pada kode yang kita miliki di sini.

Kita dapat melihat bahwa kode tersebut menyaring ekstensi .phpdan .phtml, jadi jika kita ingin mengunggah skrip PHP, kita harus mencari ekstensi lain. Halaman wikipedia untuk PHP memberi kita beberapa ekstensi umum yang dapat kita coba; namun, sebenarnya ada berbagai ekstensi lain yang jarang digunakan yang mungkin masih dikenali oleh server web. Ini termasuk: .php3, .php4, .php5, .php7, .phps, .php-s, .phtdan .phar. Banyak dari ini melewati filter (yang hanya memblokir .phpdan .phtml), tetapi tampaknya server dikonfigurasi untuk tidak mengenalinya sebagai file PHP , seperti dalam contoh di bawah ini:
Extension
Ini sebenarnya merupakan default untuk server Apache2, pada saat penulisan; namun, sysadmin mungkin telah mengubah konfigurasi default (atau server mungkin sudah kedaluwarsa), jadi patut dicoba.
Akhirnya kami menemukan bahwa .pharekstensi tersebut melewati filter -- dan berfungsi -- sehingga memberi kami shell:


Mari kita lihat contoh lain, dengan filter yang berbeda. Kali ini kita akan melakukannya secara black-box: yaitu tanpa kode sumber.
Sekali lagi, kami memiliki formulir unggah:

Oke, kita akan mulai dengan menyelidiki hal ini dengan unggahan yang sepenuhnya sah. Mari kita coba mengunggah gambar spaniel.jpg dari sebelumnya:

Nah, itu memberi tahu kita bahwa JPEG diterima setidaknya. Mari kita pilih yang kita yakin akan ditolak (shell.php):

Dalam kasus ini kami menemukan bahwa tidak ada ekstensi shell yang dieksekusi, dan tidak difilter, jadi kembali ke papan gambar.
Dalam contoh sebelumnya kita melihat bahwa kode tersebut menggunakan fungsi pathinfo() PHP untuk mendapatkan beberapa karakter terakhir setelah ., tetapi apa yang terjadi jika ia memfilter input sedikit berbeda?
Mari kita coba mengunggah file bernama shell.jpg.php. Kita sudah tahu bahwa file JPEG diterima, jadi bagaimana jika filter hanya memeriksa apakah .jpg ekstensi file ada di suatu tempat dalam input?

Saat kami mencoba mengunggah berkas, kami mendapat pesan berhasil. Menavigasi ke direktori /uploads mengonfirmasi bahwa muatan berhasil diunggah:

Dengan mengaktifkannya, kita menerima shell kita:

Ini bukanlah daftar lengkap kerentanan unggahan yang terkait dengan ekstensi file. Seperti halnya semua hal dalam peretasan, kita berupaya mengeksploitasi kelemahan dalam kode yang ditulis orang lain; kode ini mungkin saja ditulis secara unik untuk tugas yang sedang dikerjakan. Ini adalah poin yang sangat penting untuk diambil dari tugas ini: ada sejuta cara berbeda untuk mengimplementasikan fitur yang sama dalam hal pemrograman -- eksploitasi Anda harus disesuaikan dengan filter yang sedang dikerjakan. Kunci untuk melewati semua jenis filter sisi server adalah dengan menghitung dan melihat apa yang diizinkan, serta apa yang diblokir; kemudian mencoba membuat payload yang dapat melewati kriteria yang dicari oleh filter.