Pengertian :
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:
- 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
Catatan: Penyerang bisa mencoba berbagai path untuk menemukan file yang bisa diakses.
Bentuk mitigasi yang bisa dilakukan:
Penjelasan:
- Daftar File yang Diizinkan: Menggunakan array $allowed_pages untuk menyimpan nama file yang diizinkan dan kunci yang sesuai dengan nilai $_GET['page'].
- Validasi Input: Menggunakan array_key_exists untuk memeriksa apakah nilai $_GET['page'] ada dalam daftar yang diizinkan.
- Include File yang Valid: Jika valid, include file yang sesuai dari daftar.
Dengan pendekatan ini, dapat menghindari kemungkinan serangan LFI karena hanya file yang ada dalam daftar yang dapat di-include.
DEMO 2 :
- Buat folder di C:\xampp\htdocs\ bernama uploads.
- Buat file upload.php di C:\xampp\htdocs\lfi\ dengan isi sebagai berikut:
- 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
Bentuk mitigasi yang bisa dilakukan:
Untuk mengamankan skrip unggahan file Anda dari serangan Remote File Inclusion (RFI), Anda perlu menerapkan beberapa langkah untuk memastikan hanya file yang sah yang dapat diunggah.
Berikut adalah langkah-langkah kunci untuk meningkatkan keamanan skrip Anda:
- Batasi jenis file: Hanya izinkan jenis file tertentu untuk diunggah (misalnya, gambar, PDF).
- Periksa ekstensi file: Validasi ekstensi file.
- Periksa tipe MIME: Validasi tipe MIME dari file yang diunggah.
- Sanitasi nama file: Hapus karakter khusus dari nama file.
- Batasi ukuran file: Tetapkan ukuran maksimum file untuk unggahan.
perbaikan kode :
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$target_dir = "../uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// Periksa apakah file adalah gambar atau dokumen yang valid
$allowedFileTypes = array("jpg", "jpeg", "png", "gif", "pdf");
if (!in_array($fileType, $allowedFileTypes)) {
echo "Maaf, hanya file JPG, JPEG, PNG, GIF, & PDF yang diizinkan.";
$uploadOk = 0;
}
// Periksa ukuran file (dibatasi hingga 5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "Maaf, file Anda terlalu besar.";
$uploadOk = 0;
}
// Periksa apakah file sudah ada
if (file_exists($target_file)) {
echo "Maaf, file sudah ada.";
$uploadOk = 0;
}
// Periksa tipe MIME
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["fileToUpload"]["tmp_name"]);
$allowedMimes = array("image/jpeg", "image/png", "image/gif", "application/pdf");
if (!in_array($mime, $allowedMimes)) {
echo "Maaf, tipe file tidak diizinkan.";
$uploadOk = 0;
}
finfo_close($finfo);
// Sanitasi nama file
$safeFilename = preg_replace("/[^a-zA-Z0-9_\-\.]/", "", basename($_FILES["fileToUpload"]["name"]));
$target_file = $target_dir . $safeFilename;
// Periksa apakah $uploadOk disetel ke 0 oleh kesalahan
if ($uploadOk == 0) {
echo "Maaf, file Anda tidak diunggah.";
// Jika semuanya ok, coba unggah file
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "File ". htmlspecialchars($safeFilename). " telah diunggah.";
} else {
echo "Maaf, terjadi kesalahan saat mengunggah file Anda.";
}
}
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Pilih file untuk diunggah:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Unggah File" name="submit">
</form>
</body>
</html>
keterangan :
- Jenis File yang Diizinkan: Hanya mengizinkan ekstensi file tertentu (jpg, jpeg, png, gif, pdf).
- Batas Ukuran File: Memastikan file tidak lebih besar dari 5MB.
- Periksa Apakah File Sudah Ada: Mencegah penimpaan file yang sudah ada.
- Periksa Tipe MIME: Memastikan tipe MIME file sesuai dengan yang diizinkan.
- Sanitasi Nama File: Menghapus karakter berbahaya dari nama file.
Hasilnya saat di eksekusi :
Peningkatan ini akan membantu melindungi aplikasi Anda dari berbagai kerentanan unggahan file, termasuk serangan Remote File Inclusion (RFI).
Komentar
Posting Komentar