Directory Traversal vs Local File Inclusion (LFI): Perbandingan Lengkap untuk Developer

Bayangkan seseorang bisa membaca file konfigurasi server Anda hanya dengan menambahkan beberapa titik dan garis miring ke URL. Skenario ini bukan fiksi, melainkan kenyataan yang terjadi setiap hari melalui dua kerentanan yang saling berkaitan: Directory Traversal dan Local File Inclusion (LFI). Meskipun kedua serangan ini sama-sama mengeksploitasi penanganan path file yang buruk, keduanya berbeda secara signifikan dalam mekanisme dan dampaknya.

Berdasarkan klasifikasi Common Weakness Enumeration (CWE) dari MITRE, Directory Traversal tercatat sebagai CWE-22 dan termasuk dalam kategori Broken Access Control di OWASP Top 10. Kedua kerentanan ini sering membingungkan developer pemula karena memiliki pola eksploitasi yang tampak mirip, tetapi teknik mitigasi dan potensi dampaknya tidak sama. Artikel ini akan membandingkan keduanya secara mendetail, dari cara kerja, contoh eksploitasi, hingga langkah pencegahannya.

Apa Itu Directory Traversal?

Directory Traversal, juga dikenal sebagai Path Traversal atau dot-dot-slash attack, adalah kerentanan yang memungkinkan penyerang membaca file di luar direktori root aplikasi web. Serangan ini memanfaatkan sequence ../ yang dalam sistem file berarti “naik satu direktori ke atas.” Setiap kali ../ ditambahkan, path akan bergerak satu level lebih tinggi dalam hierarki direktori.

Misalnya, sebuah aplikasi web memiliki endpoint yang menampilkan gambar dari parameter URL: https://example.com/view?file=cat.jpg. Jika aplikasi tidak memvalidasi input file, penyerang dapat memodifikasi URL menjadi https://example.com/view?file=../../../../etc/passwd. Sequence ../../../ akan menavigasi dari direktori aplikasi menuju root filesystem, lalu membaca file /etc/passwd yang berisi daftar user sistem.

Variasi teknik Directory Traversal mencakup penggunaan absolute path seperti /etc/passwd, encoding karakter khusus (..%2F atau %2e%2e%2f), dan nested traversal (....//....//) untuk melewati filter sederhana. Pada sistem Windows, penyerang menggunakan backslash (..\) atau drive letters (C:\) untuk mencapai direktori sistem.

Apa Itu Local File Inclusion (LFI)?

Local File Inclusion (LFI) adalah kerentanan yang memungkinkan penyerang untuk menyertakan file lokal dari server ke dalam halaman web. LFI terjadi ketika aplikasi menggunakan fungsi seperti include(), require(), atau include_once() di PHP dengan input pengguna yang tidak divalidasi. Alih-alih hanya membaca konten file, LFI membuat server mengeksekusi atau merender file tersebut sebagai bagian dari halaman.

Contoh endpoint yang rentan terhadap LFI: https://example.com/page?file=about. Jika aplikasi menggunakan kode include($_GET['file'] . '.php'), penyerang dapat memanipulasi parameter untuk membaca file sensitif: https://example.com/page?file=../../../../etc/passwd%00. Null byte (%00) digunakan untuk memotong ekstensi .php yang otomatis ditambahkan aplikasi. Teknik ini sudah tidak efektif di PHP versi 5.3.4 ke atas, tetapi penyerang kini beralih menggunakan PHP wrappers.

PHP wrappers seperti php://filter memungkinkan penyerang membaca kode sumber aplikasi dalam format base64 tanpa perlu memotong ekstensi file. Contoh: ?file=php://filter/convert.base64-encode/resource=index. Hasilnya adalah kode sumber index.php yang di-encode base64, yang bisa di-decode untuk menganalisis logika aplikasi. LFI juga dapat dikombinasikan dengan teknik log poisoning, di mana penyerang menyuntikkan kode PHP ke file log server melalui User-Agent header, lalu mengeksekusinya melalui LFI untuk mendapatkan Remote Code Execution (RCE).

Apa Perbedaan Utama Directory Traversal dan LFI?

Meskipun kedua kerentanan melibatkan akses file yang tidak sah, perbedaan utamanya terletak pada mekanisme dan dampak yang dihasilkan. Tabel berikut merangkum perbandingan kunci antara keduanya.

AspekDirectory TraversalLocal File Inclusion (LFI)
MekanismeNavigasi path filesystem langsungFungsi include/require aplikasi
OutputKonten file ditampilkan mentahKonten file dieksekusi atau dirender
Eksekusi KodeTidak bisa langsung eksekusi kodeBisa mencapai RCE via log poisoning
Target FileFile teks dan konfigurasiFile PHP, log, session, dan file terproses
Klasifikasi CWECWE-22CWE-98 (terkait Remote File Inclusion)

Directory Traversal berfokus pada navigasi filesystem dan pembacaan file secara langsung. LFI lebih berbahaya karena melibatkan eksekusi kode melalui fungsi include aplikasi, membuka peluang untuk serangan lanjutan seperti PHP wrapper exploitation dan log poisoning yang dapat berujung pada pengambilalihan server sepenuhnya. Baca juga: Cara Mendeteksi dan Mencegah SSRF di Aplikasi Web untuk memahami kerentanan server-side lainnya yang juga mengeksploitasi validasi input yang lemah.

Bagaimana Cara Mencegah Directory Traversal dan LFI?

Pencegahan kedua kerentanan ini memiliki pendekatan yang tumpang tindih karena akar masalahnya sama: validasi input yang tidak memadai. Berikut adalah langkah-langkah mitigasi yang direkomendasikan untuk mengamankan aplikasi Anda.

Gunakan Whitelist untuk Mapping File

Alih-alih menerima nama file langsung dari input pengguna, gunakan mapping ID ke file yang sudah ditentukan. Contoh di PHP: $allowed = ['home' => 'home.php', 'about' => 'about.php']; $file = $allowed[$_GET['page']] ?? 'home.php'; include($file);. Pendekatan whitelist ini menghilangkan kemungkinan traversal sepenuhnya karena input pengguna tidak pernah langsung digunakan sebagai path file. Ini adalah metode paling aman dan direkomendasikan oleh OWASP.

Sanitasi Path File dengan Fungsi Bawaan

Jika terpaksa menggunakan input pengguna sebagai path, gunakan fungsi bawaan bahasa pemrograman untuk membersihkan input. Di Python, gunakan os.path.basename(user_input) untuk mengambil hanya nama file tanpa komponen direktori. Di PHP, gunakan basename() dan realpath() untuk memverifikasi file berada di direktori yang diizinkan. Namun, pendekatan whitelist tetap lebih aman karena tidak bergantung pada logika sanitasi yang bisa saja memiliki celah.

Batasi Akses File System

Konfigurasikan web server dengan prinsip least privilege. Gunakan chroot jail atau containerization seperti Docker untuk membatasi akses file system proses web server. Di PHP, nonaktifkan wrapper berbahaya dan fungsi berisiko di php.ini: allow_url_include = Off, allow_url_fopen = Off, dan disable_functions = exec, system, passthru, shell_exec. Langkah ini membatasi dampak bahkan jika LFI berhasil dieksploitasi.

Web Application Firewall (WAF) juga dapat mendeteksi pola traversal seperti ../ dan ..\ dalam request HTTP. Namun, WAF sebaiknya menjadi lapisan pertahanan terakhir, bukan satu-satunya. Validasi di level aplikasi tetap wajib karena penyerang dapat menggunakan encoding khusus untuk melewati filter WAF. Baca juga: Cara Mengamankan REST API: Panduan Lengkap Berdasarkan OWASP API Security Top 10 untuk panduan keamanan input yang lebih komprehensif di berbagai arsitektur aplikasi.

Pertanyaan yang Sering Diajukan (FAQ)

Apakah Directory Traversal dan LFI hanya terjadi di PHP?

Tidak. Meskipun PHP adalah bahasa yang paling sering diasosiasikan dengan LFI karena fungsi include()-nya, Directory Traversal dapat terjadi di semua teknologi web yang tidak memvalidasi path file dengan benar, termasuk Python (Flask/Django), Java (Spring), Node.js (Express), dan .NET. LFI spesifik terjadi pada bahasa yang memiliki mekanisme file inclusion dinamis, tetapi konsekuensi traversal path bersifat universal.

Apakah encoding traversal bisa melewati filter keamanan?

Ya. Penyerang dapat menggunakan URL encoding (%2e%2e%2f), double encoding (%252e%252e%252f), atau Unicode encoding untuk melewati filter sederhana yang hanya memblokir string ../ literal. Karena itu, validasi harus dilakukan setelah proses decoding, bukan sebelum. Pendekatan whitelist adalah satu-satunya metode yang kebal terhadap teknik encoding evasion.

Apakah LFI selalu bisa mencapai Remote Code Execution?

Tidak selalu. LFI hanya bisa mencapai RCE jika ada vektor tambahan yang tersedia, seperti file log yang bisa ditulisi penyerang (log poisoning), file session yang bisa dimanipulasi, atau wrapper PHP seperti php://input dan expect://. Tanpa vektor tambahan ini, LFI terbatas pada pembacaan file saja, mirip dengan Directory Traversal.

Kesimpulan

Directory Traversal dan Local File Inclusion adalah dua kerentanan web yang sering membingungkan tetapi memiliki perbedaan fundamental. Directory Traversal berfokus pada navigasi path dan pembacaan file melalui manipulasi input, sementara LFI memanfaatkan fungsi include aplikasi untuk mengeksekusi atau merender file sensitif. LFI berpotensi lebih berbahaya karena dapat mencapai Remote Code Execution melalui teknik lanjutan seperti PHP wrapper exploitation dan log poisoning.

Berdasarkan laporan OWASP Top 10, kerentanan terkait Broken Access Control termasuk Path Traversal menduduki peringkat pertama sebagai kategori risiko keamanan web paling kritis. Kunci pencegahannya sederhana: jangan pernah mempercayai input pengguna untuk menentukan path file, gunakan whitelist untuk mapping file, batasi akses file system dengan prinsip least privilege, dan terapkan validasi di level aplikasi. Dengan menerapkan langkah-langkah ini, developer dapat melindungi aplikasi dari dua kerentanan klasik yang masih relevan hingga saat ini.