Teknik Validasi Input Pada Upload File
Validasi upload file adalah bagian yang sangat penting dari keamanan aplikasi web yang juga sangat sulit untuk dilakukan dengan benar. Dan sayangnya taruhannya tinggi, karena kerentanan yang terkait dengan fungsi pengunggahan file Anda dapat dengan cepat berubah menjadi masalah kritis dan dapat dieksploitasi dengan dampak yang mencakup eksekusi kode jarak jauh pada server web yang mendasarinya. Jadi mari kita meringkas beberapa teknik validasi pengunggahan file umum yang dapat dan harus digunakan untuk menggagalkan banyak pemfilteran pengunggahan file umum.
Apa saja yang perlu divalidasi dalam upload file ?
1. Validasi Ekstensi File
Garis pertahanan pertama Anda terhadap seseorang yang mengunggah file berbahaya ke aplikasi web Anda adalah pemfilteran ekstensi. Ini pada dasarnya di mana Anda memeriksa ekstensi file yang disajikan dan memastikan itu adalah salah satu yang harus diizinkan. Pemeriksaan ini tidak sepele, karena ada beberapa cara untuk menghindari pemfilteran ini bergantung pada cara Anda menerapkannya.Pertama dan terpenting, Anda ingin menggunakan daftar yang diizinkan untuk ekstensi yang harus diterima oleh aplikasi Anda, bukan daftar ekstensi yang ditolak secara eksplisit. Hampir tidak mungkin membuat daftar hitam yang melindungi dari setiap ekstensi berbahaya karena ada cara untuk menutupi ekstensi dari filter dan ekstensi yang mungkin belum pernah Anda dengar dapat disalahgunakan. Pertimbangkan hal-hal seperti .php5 atau .phtml yang dijalankan seperti halaman PHP. Di sisi lain, daftar ekstensi yang diizinkan harus dibatasi semaksimal mungkin dan berdasarkan apa yang diperlukan untuk operasi bisnis.
Hal berikutnya yang harus Anda khawatirkan dengan pemfilteran ekstensi file adalah penggunaan dua teknik bypass yang dikenal. Salah satunya adalah penggunaan ekstensi ganda, karena .jpg.php dapat melewati filter tertentu karena mengandung .jpg sebagai ekstensi pertama yang ditemui dalam string (jika regex Anda adalah “\.jpg”, misalnya), tetapi akan dijalankan seperti Halaman PHP karena itu adalah ekstensi terakhir. Alternatifnya, penyerang dapat menggunakan sesuatu seperti null byte (%00) untuk memanipulasi ekstensi apa yang sebenarnya disimpan dengan file setelah melewati pemfilteran ekstensi. Mengirimkan dokumen dengan “.php%00.jpg” akan menghasilkan file .php yang benar-benar disimpan.
2. Validasi Tipe Konten
Setiap kali file diunggah oleh pengguna, ada header content-type yang terkait dengannya. Ini bisa berupa "image/jpeg" atau "application/php" yang terkait dengan permintaan yang membawa file yang akan diunggah. Header ini tidak boleh dipercaya, karena dapat dengan mudah dimanipulasi oleh pengguna yang mengunggah file, tetapi dapat memberikan pemeriksaan kewarasan cepat bahwa file yang diunggah cocok dengan ekstensi yang diidentifikasi.
Sekali lagi, ini tidak akan menjadi terobosan apa pun dari perspektif pencegahan, tetapi hal ini sedikit meningkatkan batasan pada kerumitan yang diperlukan untuk bypass unggahan file yang berhasil. Sekali lagi, sebaiknya Anda menggunakan daftar izin eksplisit untuk tipe MIME yang Anda terima, tetapi kemudian Anda melangkah lebih jauh dan memastikan tipe MIME yang dinyatakan cocok dengan ekstensi unggahan file.
Baca Juga : Pengertian MIME Type dan Jenisnya
Sekali lagi, ini tidak akan menjadi terobosan apa pun dari perspektif pencegahan, tetapi hal ini sedikit meningkatkan batasan pada kerumitan yang diperlukan untuk bypass unggahan file yang berhasil. Sekali lagi, sebaiknya Anda menggunakan daftar izin eksplisit untuk tipe MIME yang Anda terima, tetapi kemudian Anda melangkah lebih jauh dan memastikan tipe MIME yang dinyatakan cocok dengan ekstensi unggahan file.
Baca Juga : Pengertian MIME Type dan Jenisnya
3. Validasi Tanda Tangan
Pemeriksaan lain yang dapat Anda lakukan adalah memverifikasi bahwa tanda tangan file (signature) yang diunggah juga cocok dengan ekstensi dan jenis kontennya. Ini dapat dilakukan dengan membaca 4 – 6 byte pertama dari file (sebagai contoh, 6 byte pertama GIF harus \x47\x49\x46\x38\x37\x61 ), yang dicadangkan sebagai byte pengidentifikasi untuk konten yang akan menyusul. Meskipun ini lagi-lagi sepele untuk dipalsukan, akan tetapi membuat serangan menjadi lebih kompleks.
4. Sanitasi Nama File
Ada banyak serangan berbeda yang dapat menyalahgunakan penamaan file aplikasi untuk file yang diunggah. Serangan ini akan memanfaatkan hal-hal seperti traversal direktori, karakter khusus/kontrol, atau penggunaan nama file yang dibatasi untuk mencoba dan menimbulkan perilaku berbahaya. Tanpa menyelami lubang kelinci tentang cara kerja serangan ini, cukup untuk mengatakan Anda harus selalu menggunakan model penggantian nama gaya GUID untuk menghasilkan nama file baru untuk setiap file yang diunggah.
File-file ini harus disimpan di host yang berbeda jika memungkinkan (atau bahkan bucket S3 atau gumpalan Azure yang diamankan dengan baik) untuk memastikan ada pemisahan antara mereka dan server web itu sendiri, untuk mengurangi dampak penyusupan.
File-file ini harus disimpan di host yang berbeda jika memungkinkan (atau bahkan bucket S3 atau gumpalan Azure yang diamankan dengan baik) untuk memastikan ada pemisahan antara mereka dan server web itu sendiri, untuk mengurangi dampak penyusupan.
Jika karena alasan tertentu Anda memiliki kebutuhan yang sah bagi klien untuk menentukan nama file mereka sendiri, Anda benar-benar memerlukan validasi input yang ketat di sisi klien dan sisi server untuk menghindari diri Anda terkena serangan. Gunakan panjang maksimum untuk nama file dan buat daftar karakter yang diperbolehkan untuk nama file (misalnya alfanumerik, titik, garis bawah, tanda hubung).
5. Validasi Konten File
Ada beberapa kontrol keamanan tambahan yang dapat diterapkan untuk jenis file yang diunggah tertentu, bergantung pada apa yang Anda terima. Misalnya, penulisan ulang gambar dapat menghancurkan konten jahat yang dimasukkan ke dalam gambar dan dokumen Microsoft memiliki pustaka validasi yang dapat digunakan untuk membantu melegitimasi kontennya. Anda bahkan dapat melakukan peninjauan manual terhadap file yang diunggah jika volumenya rendah atau Anda memiliki sumber daya yang memadai.
Lalu ada perpustakaan pihak ketiga yang dapat Anda pertimbangkan untuk memindai tanda tangan virus yang dikenal, seperti VirusTotal, untuk menghindari menerima malware yang dikenal.
Berikut adalah contoh validasi upload file menggunakan PHP dengan parameter validasi size, type dan dimensi.
Lalu ada perpustakaan pihak ketiga yang dapat Anda pertimbangkan untuk memindai tanda tangan virus yang dikenal, seperti VirusTotal, untuk menghindari menerima malware yang dikenal.
Point Point Validasi Upload File Standar OWASP
Verifikasi Upload
- Gunakan validasi input untuk memastikan nama file yang diunggah menggunakan jenis ekstensi yang diharapkan.
- Pastikan file yang diunggah tidak lebih besar dari ukuran file maksimum yang ditentukan.
- Jika website mendukung upload file ZIP, lakukan pengecekan validasi sebelum meng-unzip file. Pemeriksaan tersebut mencakup jalur target, tingkat kompres, perkiraan ukuran unzip.
Penyimpanan Upload
- Gunakan nama file baru untuk menyimpan file di OS. Jangan gunakan teks yang dikontrol pengguna untuk nama file ini atau untuk nama file sementara.
- Saat file diunggah ke web, disarankan untuk mengganti nama file di penyimpanan. Misalnya, nama file yang diunggah adalah test.JPG , ganti namanya menjadi JAI1287uaisdjhf.JPG dengan nama file acak. Tujuan melakukannya untuk mencegah risiko akses file langsung dan nama file yang ambigu untuk menghindari filter, seperti test.jpg;.asp or /../../../../../test.jpg.
- File yang diunggah harus dianalisis untuk konten berbahaya (anti-malware, analisis statis, dll).
- Jalur file seharusnya tidak dapat ditentukan oleh sisi klien. Diputuskan oleh sisi server.
Jenis File yang Harus Dihindari
Fitur unggahan harus menggunakan pendekatan daftar yang diizinkan untuk hanya mengizinkan jenis dan ekstensi file tertentu. Namun, penting untuk mengetahui jenis file berikut yang, jika diizinkan, dapat menyebabkan kerentanan keamanan:
- crossdomain.xml / clientaccesspolicy.xml: memungkinkan pemuatan data lintas domain di Flash, Java, dan Silverlight. Jika diizinkan di situs dengan autentikasi, ini dapat mengizinkan pencurian data lintas domain dan serangan CSRF. Catatan ini bisa menjadi sangat rumit tergantung pada versi plugin tertentu yang dimaksud, jadi yang terbaik adalah melarang file bernama "crossdomain.xml" atau "clientaccesspolicy.xml".
- .htaccess dan .htpasswd: Menyediakan opsi konfigurasi server per direktori, dan tidak boleh diizinkan. Lihat dokumentasi HTACCESS .
- File skrip yang dapat dieksekusi web disarankan untuk tidak diizinkan seperti aspx, asp, css, swf, xhtml, rhtml, shtml, jsp, js, pl, php, cgi.
Verifikasi Upload Gambar
- Gunakan pustaka penulisan ulang gambar untuk memverifikasi validitas gambar dan menghapus konten asing.
- Setel ekstensi gambar yang disimpan menjadi ekstensi gambar yang valid berdasarkan jenis konten gambar yang terdeteksi dari pemrosesan gambar (mis. jangan hanya mempercayai tajuk dari unggahan).
- Pastikan jenis konten gambar yang terdeteksi berada dalam daftar jenis gambar yang ditentukan (jpg, png, dll)
Contoh Validasi Upload File di PHP
Berikut adalah contoh validasi upload file menggunakan PHP dengan parameter validasi size, type dan dimensi.<?php if (isset($_POST["upload"])) { // Get Image Dimension $fileinfo = @getimagesize($_FILES["file-input"]["tmp_name"]); $width = $fileinfo[0]; $height = $fileinfo[1]; $allowed_image_extension = array( "png", "jpg", "jpeg" ); // Get image file extension $file_extension = pathinfo($_FILES["file-input"]["name"], PATHINFO_EXTENSION); // Validate file input to check if is not empty if (! file_exists($_FILES["file-input"]["tmp_name"])) { $response = array( "type" => "error", "message" => "Choose image file to upload." ); } // Validate file input to check if is with valid extension else if (! in_array($file_extension, $allowed_image_extension)) { $response = array( "type" => "error", "message" => "Upload valid images. Only PNG and JPEG are allowed." ); } // Validate image file size else if (($_FILES["file-input"]["size"] > 2000000)) { $response = array( "type" => "error", "message" => "Image size exceeds 2MB" ); } // Validate image file dimension else if ($width > "300" || $height > "200") { $response = array( "type" => "error", "message" => "Image dimension should be within 300X200" ); } else { $target = "image/" . basename($_FILES["file-input"]["name"]); if (move_uploaded_file($_FILES["file-input"]["tmp_name"], $target)) { $response = array( "type" => "success", "message" => "Image uploaded successfully." ); } else { $response = array( "type" => "error", "message" => "Problem in uploading image files." ); } } } ?>
Validasi file gambar sisi server berlangsung dalam aspek berikut.
- Jika file tidak kosong.
- Jika ekstensi file adalah salah satu dari .jpg, .png, .jpeg.
- Jika ukuran file kurang dari atau 2MB.
- Jika dimensi file berada dalam (300X200).