LOCAL/REMOTE FILE INCLUSION

Local File Inclusion (LFI) dan Remote File Inclusion (RFI) adalah jenis kerentanan yang sering ditemui dalam keamanan aplikasi web. Keduanya melibatkan penggunaan input yang tidak tervalidasi dengan baik, yang memungkinkan penyerang untuk memasukkan file ke dalam aplikasi web, baik dari server lokal (LFI) atau dari server remote (RFI).

Local File Inclusion (LFI)

Local File Inclusion (LFI) terjadi ketika aplikasi web memungkinkan pengguna untuk menyertakan file yang ada di server lokal. Dengan mengeksploitasi LFI, penyerang dapat:

  1. Mengakses file sensitif: File seperti /etc/passwd pada sistem Unix/Linux yang dapat mengungkapkan informasi pengguna.
  2. Menjalankan kode berbahaya: Jika penyerang dapat mengunggah file ke server, mereka mungkin dapat menjalankan kode berbahaya.
  3. Mendapatkan akses ke konfigurasi aplikasi: Termasuk file konfigurasi yang dapat mengandung kredensial database dan informasi sensitif lainnya.

Remote File Inclusion (RFI)

Remote File Inclusion (RFI) terjadi ketika aplikasi web memungkinkan pengguna untuk menyertakan file dari server remote. Dengan mengeksploitasi RFI, penyerang dapat:

  1. Menjalankan kode berbahaya dari server remote: Penyerang dapat menjalankan skrip berbahaya yang ada di server mereka sendiri.
  2. Mengambil alih server: Dengan menjalankan kode berbahaya, penyerang dapat mengambil alih kontrol penuh atas server.
  3. Menginstal malware: Penyerang dapat menginstal malware pada server korban, yang dapat digunakan untuk berbagai tujuan berbahaya.

Demo 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!";
?>

Demo:
  • 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. 

Bentuk mitigasi yang bisa dilakukan:
<?php
// index.php

// Daftar file yang diperbolehkan
$allowed_pages = [
    'home.php',
    'about.php',
    'contact.php'
];

// Ambil nilai 'page' dari query string dan periksa apakah valid
$page = isset($_GET['page']) ? $_GET['page'] : 'home.php';

if (in_array($page, $allowed_pages)) {
    include($page);
} else {
    // Tampilkan pesan kesalahan atau alihkan ke halaman default
    echo "Halaman tidak ditemukan.";
}
?>

Penjelasan:

  1. Daftar File yang Diizinkan: Menggunakan array $allowed_pages untuk menyimpan nama file yang diizinkan dan kunci yang sesuai dengan nilai $_GET['page'].
  2. Validasi Input: Menggunakan array_key_exists untuk memeriksa apakah nilai $_GET['page'] ada dalam daftar yang diizinkan.
  3. 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: SERANGAN RFI

Buat folder di C:\xampp\htdocs\ bernama uploads.

Buat file uploads.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:

<?php
echo "Shell executed!";
?>


Akses http://localhost/lfi/uploads.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:

  1. Batasi jenis file: Hanya izinkan jenis file tertentu untuk diunggah (misalnya, gambar, PDF).
  2. Periksa ekstensi file: Validasi ekstensi file.
  3. Periksa tipe MIME: Validasi tipe MIME dari file yang diunggah.
  4. Sanitasi nama file: Hapus karakter khusus dari nama file.
  5. Batasi ukuran file: Tetapkan ukuran maksimum file untuk unggahan.

Berikut adalah versi yang ditingkatkan dari skrip Anda yang mencakup langkah-langkah keamanan ini:

<?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>


Penjelasan Penambahan:

  1. Jenis File yang Diizinkan: Hanya mengizinkan ekstensi file tertentu (jpgjpegpnggifpdf).
  2. Batas Ukuran File: Memastikan file tidak lebih besar dari 5MB.
  3. Periksa Apakah File Sudah Ada: Mencegah penimpaan file yang sudah ada.
  4. Periksa Tipe MIME: Memastikan tipe MIME file sesuai dengan yang diizinkan.
  5. Sanitasi Nama File: Menghapus karakter berbahaya dari nama file.

Peningkatan ini akan membantu melindungi aplikasi Anda dari berbagai kerentanan unggahan file, termasuk serangan Remote File Inclusion (RFI).

Komentar

Postingan populer dari blog ini

Open Source Intelligence (OSINT)

Mengenal MongoDB For VSCode

GETTING STARTED WITH MATPLOTLIB & SEABORN