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-magicuntuk 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.