TDCTF Academy Logo TDCTF ACADEMY

File Upload Vulnerability

Pendahuluan

File Upload Vulnerability adalah kerentanan keamanan yang muncul ketika aplikasi web mengizinkan pengguna mengunggah file tanpa validasi yang memadai. Fungsionalitas unggah file bisa ditemukan di fitur upload profil picture, attachment email, dokumen, video, atau file sharing. Tanpa mekanisme keamanan yang tepat, penyerang dapat mengeksploitasi fitur ini untuk menjalankan kode, mengakses data sensitif, atau merusak sistem.

Tipe Serangan File Upload

1. Malicious File Upload

Penyerang mengunggah file berbahaya yang dapat dieksekusi oleh server:

  • Web Shell: File script (PHP, ASP, JSP) yang memberikan akses shell ke server.
  • Malware: Virus, trojan, ransomware yang disebarkan melalui aplikasi.
  • Macro Virus: Dokumen Office dengan macro berbahaya.

2. Path Traversal

Penyerang memanipulasi path penyimpanan file untuk menimpa file sistem atau menyimpan file di direktori yang tidak diinginkan:

../../../../etc/crontab
../../../var/www/html/shell.php

Jika nama file tidak divalidasi, penyerang bisa menulis file ke direktori sistem.

3. MIME Type Spoofing

Penyerang mengubah header Content-Type untuk melewati validasi tipe file:

Content-Type: image/jpeg

Padahal konten sebenarnya adalah PHP script atau executable. Banyak validasi hanya memeriksa header MIME tanpa memverifikasi isi file.

4. Double Extension

Penyerang menggunakan ekstensi ganda untuk mengelabui validasi:

shell.jpg.php
image.php.jpg
shell.php.txt

Konfigurasi server yang salah (seperti Apache dengan mod_mime atau AddHandler) dapat mengeksekusi file dengan ekstensi ganda.

5. Null Byte Injection

Teknik yang mengeksploitasi perbedaan pemrosesan string antara bahasa pemrograman dan sistem file:

shell.php%00.jpg
file.php\x00.txt

Jika validasi melihat ekstensi terakhir (.jpg) tetapi sistem file memotong di null byte, file disimpan sebagai shell.php. Teknik ini sudah tidak efektif di PHP versi >= 5.3.4.

6. Upload of Configuration Files

Penyerang mengunggah file .htaccess, .env, web.config, __init__.py untuk mengubah konfigurasi server atau membocorkan kredensial.

Webshell Upload

Webshell adalah script berbahaya yang diunggah ke server untuk memberikan akses shell. Contoh webshell dalam PHP:

<?php system($_GET['cmd']); ?>

Setelah diunggah, penyerang bisa menjalankan perintah sistem:

GET http://target.com/uploads/shell.php?cmd=id
GET http://target.com/uploads/shell.php?cmd=cat+/etc/passwd
GET http://target.com/uploads/shell.php?cmd=ls+-la+/root

Webshell yang lebih canggih dapat menyediakan antarmuka web interaktif, file manager, database explorer, dan terminal emulator.

Dampak File Upload Vulnerability

  • Remote Code Execution: Webshell memberikan kontrol penuh atas server.
  • Data Breach: Akses ke database, file konfigurasi, dan data sensitif.
  • Website Defacement: Mengubah halaman web.
  • Malware Distribution: Menggunakan server sebagai host malware.
  • Server Compromise: Akses ke seluruh sistem dan potensi lateral movement.
  • Denial of Service: Upload file raksasa untuk menghabiskan disk space.

Mitigasi

1. Extension Whitelist

Hanya izinkan ekstensi file yang diperlukan. Gunakan whitelist, bukan blocklist:

ALLOWED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.gif', '.pdf', '.docx'}

Blocklist mudah di-bypass dengan kombinasi ekstensi yang tidak terduga.

2. File Content Validation

Validasi isi file, bukan hanya ekstensi atau MIME type:

  • Periksa magic bytes / file signature (misal: JPEG mulai dengan FF D8 FF)
  • Gunakan library seperti python-magic untuk mendeteksi tipe file sesungguhnya.
  • Untuk gambar, reprocess menggunakan library image processing untuk memastikan file benar-benar gambar.

3. Rename File

Generate nama file baru secara acak saat penyimpanan:

import uuid, os
safe_filename = str(uuid.uuid4()) + os.path.splitext(original_filename)[1]

Ini mencegah path traversal dan konflik nama, serta menghilangkan eksekusi file via nama.

4. Store Outside Webroot

Simpan file di direktori yang tidak bisa diakses langsung melalui web:

/webroot/ → kode aplikasi
/uploads/ → file upload (harus di luar webroot)

Berikan akses file melalui script download handler yang melakukan autentikasi dan validasi.

5. Antivirus / Malware Scanning

Scan file yang diunggah dengan antivirus engine (ClamAV, VirusTotal API) sebelum disimpan atau disediakan untuk diunduh pengguna lain.

6. Batasi Ukuran File

Terapkan batas maksimum ukuran file yang diunggah untuk mencegah denial of service:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16 MB

7. Hapus Eksekusi Script

Konfigurasi direktori upload untuk tidak mengeksekusi script:

Apache (.htaccess):

php_flag engine off
RemoveHandler .php .phtml .php5

Nginx:

location /uploads/ {
location ~ \.php$ { deny all; }
}

8. Gunakan Object Storage

Simpan file di layanan storage eksternal (AWS S3, Google Cloud Storage, Azure Blob) dengan akses yang terbatas. Server aplikasi hanya menyediakan signed URL untuk upload/download.

Kesimpulan

File upload adalah fitur penting tetapi berbahaya jika tidak diamankan dengan benar. Pendekatan pertahanan berlapis - validasi konten, whitelist ekstensi, rename file, simpan di luar webroot, dan scan malware - sangat penting untuk memitigasi risiko. Setiap layer pertahanan dapat di-bypass sendiri-sendiri, tetapi kombinasinya membuat eksploitasi jauh lebih sulit.

PADA HALAMAN INI