Teknik Validasi Input Pada Upload File - Rumah IT

Baru

recent

Teknik Validasi Input Pada Upload File

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

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.

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.

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).
All Rights Reserved by Rumah IT - Rumah Teknologi Informasi © 2013 - 2022
Powered By Blogger

Contact Form

Name

Email *

Message *

Powered by Blogger.