LOCAL/REMOTE FILE INCLUSION
DEFINISI
- Local File Inclusion (LFI) adalah sebuah kerentanan dalam
aplikasi web yang memungkinkan penyerang untuk
memasukkan file lokal ke dalam eksekusi kode melalui
input yang tidak divalidasi.
- Sedangkan serangan yang melibatkan upload file lalu
mengeksekusi file tersebut disebut Remote File Inclusion
(RFI)
TUJUAN SERANGAN
- Membaca file sensitif di server.
- Mengeksekusi skrip berbahaya.
- Mencuri data atau mendapatkan akses lebih lanjut.
DEMO 1: SERANGAN LFI
- Buat sebuah folder di C:\xampp\htdocs\ bernama lfi.
- Di dalam folder lfi, buat file bernama index.php dengan
isi sebagai berikut:
<?php
// index.php
$page = isset($_GET['page']) ? $_GET['page'] : 'home.php';
include($page);
?>
- Buat file home.php di folder yang sama dengan isi:
<?php
echo "Welcome to the home page!";
?>
- Buka browser dan akses http://localhost/lfi/index.php.
- Untuk membaca file di sistem Windows, kita bisa mencoba
membaca file C:\xampp\htdocs\lfi\home.php dengan
mengubah parameter URL:
http://localhost/lfi/index.php?page=C:/xampp/htdocs/lfi/home.php - Coba akses file sensitif seperti konfigurasi Apache:
http://localhost/lfi/index.php?page=C:/xampp/apache/conf/httpd.conf
Catatan: Penyerang bisa mencoba berbagai path untuk
menemukan file yang bisa diakses
DEMO 2: SERANGAN RFI
- Buat folder di C:\xampp\htdocs\ bernama uploads.
Buat file upload.php di C:\xampp\htdocs\lfi\ dengan isi
sebagai berikut:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
</body>
</html>
- Buat file PHP berbahaya (shell.php) dengan isi:
- Akses http://localhost/lfi/upload.php, pilih file shell.php, dan
upload.
- Setelah file diupload, akses URL untuk mengeksekusi:
http://localhost/uploads/shell.php
Tambahkan script pada file tersebut agar terhindar dari
serangan LFI & RFI
Pada file index.php kita menambahkan script sebagai berikut;
<?php
// index.php
$page = isset($_GET['page']) ? $_GET['page'] : 'home.php';
include($page);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Upload</title>
<script>
function validateFile() {
const fileInput = document.getElementById('fileToUpload');
const filePath = fileInput.value;
const allowedExtensions = /(\.jpg|\.jpeg|\.png|\.gif|\.pdf)$/i;
if (!allowedExtensions.exec(filePath)) {
alert('Please upload file having extensions .jpeg/.jpg/.png/.gif/.pdf only.');
fileInput.value = '';
return false;
}
return true;
}
</script>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data" onsubmit="return validateFile()">
<label for="fileToUpload">Select file to upload:</label>
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
</body>
</html>
Pada script diatas bertujuan untuk membatasi file apa saja yang bisa di upload, sehingga file yang du upload tidak sembarangan.
Selanjutnya adalah pada file upload.php kita menambahkan sript atau mengedit script sebelumnya menjadi :
<?php
// Tentukan direktori upload
$target_dir = "uploads/";
// Buat direktori jika belum ada
if (!is_dir($target_dir)) {
mkdir($target_dir, 0755, true);
}
// Tentukan file yang akan diupload
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// Cek apakah file adalah file gambar atau tipe file yang diizinkan
$allowedExtensions = array("jpg", "jpeg", "png", "gif", "pdf");
if (!in_array($fileType, $allowedExtensions)) {
echo "Sorry, only JPG, JPEG, PNG, GIF, & PDF files are allowed.";
$uploadOk = 0;
}
// Cek apakah $uploadOk sudah diatur menjadi 0 oleh kesalahan
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
// Gunakan move_uploaded_file untuk menghindari LFI & RFI
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
</body>
</html>
Serangan Local File Inclusion (LFI) dan Remote File Inclusion (RFI) adalah jenis serangan keamanan web yang mengeksploitasi kerentanan dalam aplikasi web yang memungkinkan penyerang untuk memasukkan file dari sistem lokal atau remote ke dalam aplikasi. Berikut adalah dampak dari kedua jenis serangan ini:
Dampak dari Serangan LFI
1. Pembocoran Informasi Sensitif:
- Penyerang dapat membaca file sensitif dari server, seperti konfigurasi server (e.g., `php.ini`), file sistem (e.g., `/etc/passwd`), atau file aplikasi yang mengandung informasi rahasia (e.g., file database).
2. Eksekusi Kode Arbitrer:
- Jika penyerang dapat memasukkan file yang berisi kode berbahaya, mereka bisa menjalankan kode tersebut di server. Ini bisa dilakukan dengan menggabungkan serangan LFI dengan teknik lain, seperti file upload yang tidak aman.
3. Pengambilan Informasi Pengguna:
- Penyerang dapat mengakses file log yang mungkin mengandung informasi pengguna atau detail sesi yang sensitif.
4. Eskalasi Privilege:
- Dengan mengakses file yang berisi kredensial atau detail konfigurasi lainnya, penyerang bisa mendapatkan akses yang lebih tinggi dalam sistem.
Dampak dari Serangan RFI
1. Eksekusi Kode Berbahaya:
- Penyerang dapat memasukkan file dari server remote yang berisi kode berbahaya. Kode ini akan dieksekusi oleh server, memungkinkan penyerang untuk mengontrol server atau melakukan aksi berbahaya lainnya.
2. Deface Website:
- Penyerang bisa mengganti konten situs web dengan konten berbahaya atau ofensif, merusak reputasi organisasi.
3. Penyebaran Malware:
- Penyerang dapat menggunakan RFI untuk menyebarkan malware ke pengguna yang mengunjungi situs web tersebut. File remote yang dimasukkan bisa berisi skrip yang menginfeksi pengguna dengan malware.
4. Pengambilan Informasi Pengguna:
- Mirip dengan LFI, penyerang bisa mengakses informasi sensitif yang bisa diekspos oleh skrip yang mereka masukkan.
Pencegahan LFI dan RFI
1. Validasi Input:
- Validasi dan sanitasi input pengguna dengan benar. Jangan pernah menggunakan input pengguna langsung dalam fungsi file.
2. Konfigurasi Server yang Aman:
- Konfigurasi server untuk mencegah inklusi file dari sumber yang tidak dipercaya. Misalnya, menonaktifkan `allow_url_include` dan `allow_url_fopen` di konfigurasi PHP.
3. Penggunaan Fungsi yang Aman:
- Gunakan fungsi PHP yang aman untuk menangani file, seperti `move_uploaded_file()`.
4. Pengaturan Izin File yang Tepat:
- Pastikan bahwa file yang tidak perlu diakses oleh aplikasi web memiliki izin yang tepat untuk mencegah akses yang tidak sah.
5. Keamanan Aplikasi yang Komprehensif:
- Selalu lakukan peninjauan keamanan terhadap aplikasi web dan implementasikan praktik pengkodean yang aman untuk mencegah kerentanan seperti LFI dan RFI.