This is an old revision of the document!
Local file inclusion
Ranjivost uključivanja lokalnih datoteka (Local File Inclusion, LFI) napadaču omogućuje uključivanje, dohvaćanje ili čitanje datoteka iz datotečnog sustava poslužitelja, uključujući datoteke koje sadrže osjetljive podatke i ne bi trebale biti izložene korisnicima. To mogu biti konfiguracijske datoteke, datoteke s kodom koji se izvršava na poslužitelju, datoteke baze podataka (npr. ako se koristi SQLite), “/etc/passwd” datoteka i druge.
Primjeri funkcija u PHP web aplikacijama koje nepravilnim korištenjem mogu omogućiti ovaj napad su funkcije include(<filename>) i include_once(<filename>). Ranjivost nastaje kada se korisnički unos, izravno ili neizravno, koristi kao argument funkcije bez provjere ili adekvatnih ograničenja. To omogućuje napadaču da navede proizvoljne datoteke iz lokalnog datotečnog sustava kao argumente funkcije, navodeći njihovu apsolutnu ili relativnu putanju.
Posljedica toga, osim dohvaćanja osjetljivih datoteka iz datotečnog sustava poslužitelja, u određenim okolnostima može biti čak i izvršavanje koda u datotekama, ako je npr. kao argument navedena datoteka s kodom i *.php* ekstenzijom te se učitava funkcijom *include*. Tako napad potencijalno može eskalirati i do izvršavanja koda (Remote Code Execution, RCE).
Pretpostavimo da korisnik unese sljedeći URL:
http://vulnerable_host/preview.php?file=../../../../etc/passwd
Ovaj zahtjev ispisat će sadržaj datoteke “/etc/passwd” s poslužitelja ako parametar file nema nikakvu provjeru i pročišćavanje vrijednosti putanje. U ovom URL-u putanja je zadana relativno, tj. u odnosu na radni direktorij u kojem se aplikacija izvršava. Oznaka “..” u putanji predstavlja roditeljski direktorij, odnosno direktorij jednu razinu iznad trenutačnog. Budući da file parametar ne ograničava kretanje kroz strukturu direktorija, napadač bi to mogao iskoristiti tako da se popne četiri razine direktorija iznad trenutačnog direktorija.
Napadač bi u ovom slučaju došao do korijenskog (root) direktorija, čime može pristupiti osjetljivim datotekama koje aplikacija inače ne bi smjela izlagati korisnicima. U tom direktoriju nalazi se /etc direktorij koji u Linux sustavima sadrži informacije vezane uz konfiguraciju sustava, uključujući korisnike i njihove hashirane lozinke (/etc/shadow datoteka).
To je potencijalno opasno jer ako napadač uspije enumerirati sve korisničke račune u sustavu, može grubom silom (brute force ili korištenjem rječnika) nad hashevima njihovih lozinki pokušati otkriti izvorne lozinke i koristiti njihove račune (iako obično samo administrator ima pristup /etc/shadow datoteci, proces može biti neispravno pokrenut s prevelikom razinom privilegija ili se napad može kombinirati s napadom podizanja privilegija).
Ranjivost se može iskoristiti i kod zaštićenijih oblika poziva funkcija, primjerice:
<?php include($_GET['file'] . ".php"); ?>
U ovom slučaju datoteka koja se dohvaća ima predefiniranu ekstenziju .php pa se ne možemo jednostavno zatražiti proizvoljnu datoteku bez te ekstenzije. Jedan od prijašnjih načina zaobilaženja (u modernim PHP verzijama više nije primjenjiv) je tzv. Null Byte Injection, odnosno na kraju naziva datoteke se dodaju null bajtovi “%00”.
http://vulnerable_host/preview.php?file=../../../../etc/passwd%00
PRIMJER Zadatak s Hacknite platforme - Lokalne datoteke
Ivica je zaključio kako je za njegov daljnji razvoj karijere neophodno naučiti PHP te prebaciti svoju web stranicu na Apache HTTP server. U procesu izrade web stranice i konfiguracije Apache HTTP servera, Ivica je zavolio Linux te je odlučio prebaciti i neke svoje datoteke na Linux računalo koje poslužuje web stranicu. Možeš li pogledati kako Ivica napreduje s izradom web stranice te provjeriti je li možda napravio neki propust? http://chal.hacknite.hr:8002/
Ulaskom na stranicu i pritiskom na “O meni” primjećujemo da se ime stranice pojavljuje u URL-u u parametru page:
To nas upućuje da pokušamo u parametar page upisati ime neke osjetljive datoteke i pristupimo njezinim podacima.
Također, vidimo da su lozinke zapisane u datoteci /usr/local/lozinke.txt.
U tražilicu pod page parametar ubacimo “../../../usr/local/lozinke.txt” i dobili smo rješenje:
Važno je primijetiti da su na početku dodane oznake za odlazak u naddirektorij (..) jer bez njih Local file inclusion ne bi funkcionirao. Korisnik se uobičajeno nikad neće naći u usr direktoriju jer njemu ne bi uopće trebao imati pristup.
PRIMJER Zadatak s Hacknite platforme - Local Login inclusion
Petru je bilo dosadno tijekom ljetnih praznika, i odlučio je napraviti jednostavnu web stranicu. Nije bio siguran kako bi pokrenuo svoju stranicu i gdje bi ju posluživao, ali se na kraju odlučio za svoje računalo gdje se nalaze razne datoteke. Petar ima Linux računalo i odlučio je posluživati svoju stranicu uz pomoć Apache HTTP servera. Petar je sebi napravio račun na stranici kao admin i njime se služi kad god želi pristupiti stranici. Stranica nije skroz gotova i postoje neke greške, ali Petar je jako ponosan nju i siguran je da nije napravio nikakav propust. Možeš li provjeriti i vidjeti je li Petar u pravu? http://chal.platforma.hacknite.hr:10015
Ovako izgleda stranica:
Ako se pokušamo ulogirati kao administrator, vidimo da se šalje GET zahtjev jer se u URL-u nalazi path datoteke u kojoj se nalazimo (admin.php). To znači da potencijalno možemo dobiti pristup access logu. To ćemo pokušati primjenom LFI tako što ćemo u tražilicu upisati:
/view.php?file=../../../var/log/apache2/access.log
Rezultat je ispis access.log datoteke u kojoj se ujedno i nalazi rješenje zadatka:



