Upload Vulnerabilities - Bypassing Client-Side Filtering


Seperti yang disebutkan sebelumnya, penyaringan Client-Side cenderung sangat mudah untuk dilewati, karena penyaringan tersebut terjadi sepenuhnya pada mesin yang Anda kendalikan. Bila Anda memiliki akses ke kode tersebut, sangat mudah untuk mengubahnya.
Ada empat cara mudah untuk melewati filter unggahan berkas sisi klien rata-rata:

1 Turn off Javascript in your browser -- cara ini akan berfungsi asalkan situs tersebut tidak memerlukan Javascript untuk menyediakan fungsionalitas dasar. Jika menonaktifkan Javascript sepenuhnya akan mencegah situs tersebut berfungsi sama sekali, maka salah satu metode lain akan lebih baik; jika tidak, cara ini dapat menjadi cara yang efektif untuk sepenuhnya melewati filter Client-Side.
2 Intercept and modify the incoming page. Dengan menggunakan Burpsuite, kita dapat menyadap halaman web yang masuk dan menghapus filter Javascript sebelum halaman tersebut sempat berjalan.
3 Intercept and modify the file upload. Jika metode sebelumnya berfungsi sebelum halaman web dimuat, metode ini memungkinkan halaman web dimuat seperti biasa, tetapi mencegat unggahan berkas setelah berkas tersebut lolos (dan diterima oleh filter).
4 Send the file directly to the upload point. Mengapa menggunakan halaman web dengan filter, jika Anda dapat mengirim berkas langsung menggunakan alat seperti curl? Memposting data langsung ke halaman yang berisi kode untuk menangani unggahan berkas adalah metode efektif lain untuk sepenuhnya melewati filter Client-side. Kami tidak akan membahas metode ini secara mendalam dalam tutorial ini, namun, sintaks untuk perintah tersebut akan terlihat seperti ini: curl -X POST -F "submit:<value>" -F "<file-parameter>:@<path-to-file>" <site>. Untuk menggunakan metode ini, pertama-tama Anda harus berusaha untuk mencegat unggahan yang berhasil (menggunakan Burpsuite atau konsol browser) untuk melihat parameter yang digunakan dalam unggahan, yang kemudian dapat dimasukkan ke dalam perintah di atas.

Mari kita asumsikan bahwa, kita telah menemukan halaman unggahan di sebuah situs web:
Seperti biasa, kita akan melihat kode sumbernya. Di sini kita melihat fungsi Javascript dasar yang memeriksa tipe MIME dari file yang diunggah:
if (file.type != "image/jpeg")
Dalam contoh ini kita dapat melihat bahwa filter menggunakan daftar putih untuk mengecualikan tipe MIME apa pun yang bukan image/jpeg.

Langkah kita selanjutnya adalah mencoba mengunggah berkas -- seperti yang diharapkan, jika kita memilih JPEG, fungsi tersebut akan menerimanya. Jika tidak, unggahan akan ditolak.

Setelah menetapkan ini, mari kita mulai Burpsuite dan muat ulang halaman. Kita akan melihat permintaan kita sendiri ke situs tersebut, tetapi yang benar-benar ingin kita lihat adalah respons server , jadi klik kanan pada intercepted, gulir ke bawah ke "Do Intercept", lalu pilih "Response to this request":

Ketika kita mengklik tombol "Forward" di bagian atas jendela, kita akan melihat respons server terhadap permintaan kita. Di sini kita dapat menghapus, memberi komentar, atau menghentikan fungsi Javascript sebelum sempat dimuat:

Setelah menghapus fungsi tersebut, kita klik lagi "Forward" hingga situs selesai dimuat, dan sekarang kita bebas mengunggah jenis file apa pun ke situs web:

Perlu dicatat di sini bahwa Burpsuite tidak akan, secara default, mencegat berkas Javascript eksternal apa pun yang sedang dimuat halaman web. Jika Anda perlu mengedit skrip yang tidak ada di dalam halaman utama yang sedang dimuat, Anda harus membuka tab "Options" di bagian atas jendela Burpsuite, lalu di bawah bagian "Intercept Client Requests", edit kondisi baris pertama untuk menghapus ^js$|:
Kami telah melewati filter ini dengan mencegat dan menghapusnya sebelum laman dimuat, tetapi mari coba melakukannya dengan mengunggah berkas dengan ekstensi dan tipe MIME yang sah , lalu mencegat dan mengoreksi unggahan tersebut dengan Burpsuite.
Setelah memuat ulang halaman web untuk mengembalikan filter ke tempatnya, mari kita ambil reverse shell yang kita gunakan sebelumnya dan ganti namanya menjadi "shell.jpg". Karena tipe MIME (berdasarkan ekstensi file) otomatis diperiksa, filter Sisi Klien membiarkan muatan kita lewat tanpa mengeluh:

Sekali lagi kita akan mengaktifkan intersepsi Burpsuite kita, lalu klik "Unggah" dan tangkap permintaannya:
Perhatikan bahwa tipe MIME shell PHP image/jpeg kita saat ini adalah . Kita akan mengubahnya menjadi text/x-php, dan ekstensi file dari .jpg menjadi .php, lalu meneruskan permintaan ke server:
Sekarang, saat kita menavigasi untuk http://demo.uploadvulns.thm/uploads/shell.php menyiapkan netcat, kita menerima koneksi dari shell!