Lompat ke konten Lompat ke sidebar Lompat ke footer

Demo Local/Remote File Inclusion

    Local File Inclusion (LFI) dan Remote File Inclusion (RFI) adalah dua jenis kerentanan keamanan web yang umum ditemui. Keduanya terjadi ketika aplikasi web secara tidak aman memasukkan file dari server lokal (LFI) atau dari server remote (RFI) ke dalam aplikasi tersebut. Ini dapat mengakibatkan pelanggaran keamanan serius, termasuk eksekusi kode berbahaya, pengungkapan informasi sensitif, dan lain-lain.

Local File Inclusion (LFI)

Definisi: LFI adalah kerentanan yang terjadi ketika sebuah aplikasi web memungkinkan pengguna untuk memasukkan file dari sistem file server lokal tanpa validasi yang tepat. Ini bisa dimanfaatkan untuk membaca file sistem yang sensitif atau bahkan menjalankan kode berbahaya.

Cara Kerja:

  1. Inklusi File: Aplikasi web mengambil nama file dari input pengguna dan menggunakannya untuk menyertakan file dalam halaman web.
  2. Eksekusi: File tersebut kemudian dieksekusi atau ditampilkan sebagai bagian dari respon web.

Dampak:

  • Pengungkapan Informasi: Penyerang dapat membaca file sensitif seperti /etc/passwd atau file konfigurasi aplikasi.
  • Eksekusi Kode: Dalam beberapa kasus, penyerang dapat menjalankan kode berbahaya dengan menyertakan file yang berisi skrip PHP.

Mitigasi:

  • Validasi Input: Memastikan bahwa input pengguna hanya mengarah ke file yang diizinkan.
  • Penggunaan Fungsi Secure: Menggunakan fungsi yang lebih aman dan membatasi akses file, seperti readfile() dengan daftar putih.
  • Pembatasan Direktori: Membatasi akses hanya ke direktori tertentu dengan open_basedir pada PHP.

Remote File Inclusion (RFI)

Definisi: RFI adalah kerentanan yang terjadi ketika aplikasi web memungkinkan pengguna untuk memasukkan file dari lokasi remote (server lain) tanpa validasi yang tepat. Ini dapat dimanfaatkan untuk menjalankan kode berbahaya dari server lain.

Cara Kerja:

  1. Inklusi File: Aplikasi web mengambil URL dari input pengguna dan menggunakannya untuk menyertakan file dalam halaman web.
  2. Eksekusi: File tersebut kemudian dieksekusi sebagai bagian dari respon web.

Dampak:

  • Eksekusi Kode Jarak Jauh: Penyerang dapat menjalankan skrip berbahaya dari server mereka.
  • Pengambilalihan Sistem: Penyerang dapat mengambil alih server dengan menjalankan perintah sistem.

Mitigasi:

  • Nonaktifkan Inklusi URL: Pada PHP, atur allow_url_include ke Off dalam file konfigurasi.
  • Validasi Input: Memastikan bahwa input pengguna hanya mengarah ke file yang diizinkan.
  • Penggunaan Fungsi Secure: Menggunakan fungsi yang lebih aman dan membatasi akses file.

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

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


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

Akses http://localhost/lfi/upload.php,

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).


Posting Komentar untuk "Demo Local/Remote File Inclusion"