User Tools

Site Tools


local_file_inclusion

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
local_file_inclusion [2023/11/09 15:18] zrinkalocal_file_inclusion [2026/06/11 19:23] (current) mbunic
Line 1: Line 1:
 ====Local file inclusion==== ====Local file inclusion====
  
-**Napad uključenja lokalne datoteke (Local File Inclusion, LFI)** je napad koji prisiljava HTTP poslužitelj da odgovor na zahtjev ugradi datoteku koja je pohranjena na napadnutom poslužitelju.  +**Ranjivost uključivanja lokalnih datoteka** (//Local File Inclusion//, LFI) napadačomogućuje uključivanje, dohvaćanje ili čitanje datoteka iz datotečnog sustava poslužitelja, uključujući datoteke koje sadržosjetljive podatke i ne bi trebale biti izložene korisnicima. 
-Datoteka može izravno izvršiti neki maliciozan kod ili sadržavati osjetljive informacije +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.
-kojima prosječan korisnik ne bi trebao imati pristup.+
  
-Ako HTTP zaglavlje sadrži "Content-Disposition: attachment; filename=file.pdf" 
-datoteke se neće prikazati, već odmah preuzeti. To predstavlja problem u slučaju 
-nepročišćenog zahtjeva jer napadač može uključiti datoteku  
  
-Najčešće je pristuan u PHP web aplikacijama i to u naredbama include(<filename>ili include_once(<filename>+Primjeri funkcija u PHP web aplikacijama koje nepravilnim korištenjem mogu omogućiti ovaj napad su funkcije include(<filename>include_once(<filename>). Ranjivost nastaje 
-koje primaju putanju do datoteke koja se uključuje u programRanjivost se javlja +kada se korisnički unos, izravno ili neizravno, koristi kao argument funkcije bez provjere ili adekvatnih ograničenja. To omogućuje napadačda navede proizvoljne datoteke iz lokalnog datotečnog sustava kao argumente funkcije, navodeći njihovu apsolutnu ili relativnu putanju
-kad nema provjere primljenog argumenta jer tada napadač može dobiti  + 
-mogućnost čitanja svih datoteka na poslužitelju na koje korisnički račun web +Posljedica toga, osim dohvaćanja osjetljivih datoteka iz datotečnog sustava poslužitelja, u određenim okolnostima može biti čak 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). 
-aplikacije ima pravo pristupa i čitanja.+ 
 + 
 +Pretpostavimo da korisnik unese sljedeći URL:
  
-Recimo da korisnik unese: 
 <code> <code>
 http://vulnerable_host/preview.php?file=../../../../etc/passwd http://vulnerable_host/preview.php?file=../../../../etc/passwd
 </code> </code>
  
-Ova naredba ispisat će sve korisnike prisutne na ranjivom poslužitelju budući da  +Ovaj zahtjev ispisat će sadržaj datoteke "/etc/passwd"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šavaOznaka ".." putanji predstavlja roditeljski direktorij, odnosno direktorij jednu razinu iznad trenutačnog. Budući da //file// parametar ne ograničava kretanje kroz strukturu direktorijanapadač bi to mogao iskoristiti tako da 
-parametar page nema nikakvu provjeru i pročišćavanje putanje. Oznaka .. Linux sustavima +se popne četiri razine direktorija iznad trenutačnog direktorija.
-označava naddirektorij. Ako se putanja do neke datoteke zadaje relativno (u odnosu +
-na trenutnu poziciju korisnika), oznaka .. u toj putanju označava jedan direktorij +
-iznad. Budući da page parametar nema nikakvu provjeru koliko se daleko korisnik +
-može pomicati prema gorenapdač bi to mogao iskoristiti tako da +
-se popne čak četiri direktorija iznad trenutnoga. Korisnik je u ovome primjeri došao +
-do root direktorija kojemu nitko osim administratora ne bi trebao imati pristup. +
-U root direktoriju nalazi se etc direktorij koji u Linux sustavima +
-sadrži sve informacije vezane uz konfiguraciju sustava, uključujući korisnike  +
-i njihove lozinke. Zato je napadač uspio doći do svih korisnika sustava. To je potencijalno +
-opasno jer jednom kad napadač uspije enumerirati sve korisnike u nekom sustavu, može grubom silom  +
-(//brute force//) probiti njihove lozinke i steći njihova prava.+
  
-Ranjivost se može iskoristiti i kod naprednijih naredbim, primjerice:+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:
  
 <code> <code>
-<?php include($_GET['file'].".php"); ?>+<?php include($_GET['file'] . ".php"); ?>
 </code> </code>
  
-U ovom slučaju datoteka koju dohvaćamo ima predefiniranu ekstenziju .php pa  +U ovom slučaju datoteka koja se dohvaćima predefiniranu ekstenziju .php pa se 
-ne možemo jednostavno poslati drugu datoteku u zahtjevu. Jedan od načina zaobilaženja +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 nazica datoteke jednostavno dodajemo %00+je tzv. Null Byte Injection, odnosno na kraju naziva datoteke se dodaju null bajtovi "%00".
 <code> <code>
 http://vulnerable_host/preview.php?file=../../../../etc/passwd%00 http://vulnerable_host/preview.php?file=../../../../etc/passwd%00
 </code> </code>
 +
 +Funkcije napisane u C-u koje obrađuju ovaj unos bi ostatak niza nakon pojave nul bajta zanemarile, jer se nul bajt interpretira kao kraj stringa, te bi se ekstenzija .php učinkovito uklonila iz parisrane putanje.
  
  
-__**PRIMJER**__ **Zadatak sa Hacknite platforme - Lokalne datoteke**+__**PRIMJER**__ **Zadatak Hacknite platforme - Lokalne datoteke**
 <file> <file>
 Ivica je zaključio kako je za njegov daljnji razvoj karijere neophodno naučiti PHP te prebaciti  Ivica je zaključio kako je za njegov daljnji razvoj karijere neophodno naučiti PHP te prebaciti 
Line 60: Line 58:
 </file> </file>
  
-Ulaskom na stranicu i pritiskom na na "O meni" primjećujemo da se ime stranice pojavljuje u URL-u: +Ulaskom na stranicu i pritiskom na "O meni" primjećujemo da se ime stranice pojavljuje u URL-u u parametru //page//
  
  
Line 66: Line 64:
  
  
-To nas upućuje da pokušamo u parametar page upisati ime neke osjetljive datoteke i pristupimo njezinim \\ podatcima. Također, vidimo da su lozinke zapisane u datoteci /usr/local/lozinke.txt. \\+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: U tražilicu pod page parametar ubacimo "../../../usr/local/lozinke.txt" i dobili smo rješenje:
  
 {{ :lfi2-rj.png?600 |}} {{ :lfi2-rj.png?600 |}}
  
-Važno je primijetiti da su na početku dodane sekvence 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 \\+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. bi uopće trebao imati pristup.
  
-__**PRIMJER**__ **Zadatak sa Hacknite platforme - Local Login inclusion**+__**PRIMJER**__ **Zadatak Hacknite platforme - Local Login inclusion**
 <file> <file>
 Petru je bilo dosadno tijekom ljetnih praznika, i odlučio je napraviti jednostavnu web stranicu. 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 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 +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+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 ž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.  i siguran je da nije napravio nikakav propust. 
Line 89: Line 87:
 {{ :lfi1-zad.png?600 |}} {{ :lfi1-zad.png?600 |}}
  
-Ako se pokušamo ulogirati kao administrator, vidimo da se šalje GET zahtjev jer URL izgleda ovako:  +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: \\
-http://chal.platforma.hacknite.hr:10015/**admin.php** +
-To znači da potencijalno možemo dobiti pristup access logu. To ćemo pokušati primjenom Local \\ file inclusiona tako što ćemo u tražilicu upisati: \\+
 /view.php?file=../../../var/log/apache2/access.log /view.php?file=../../../var/log/apache2/access.log
  
Line 98: Line 94:
 {{ :lfi1-rj.png?600 |}} {{ :lfi1-rj.png?600 |}}
  
 +===Izvori===
 +[1] https://platforma.hacknite.hr/challenges\\
 +[2] https://www.zemris.fer.hr/~sgros/students/diploma_thesis/saric_darian_diplomski.pdf\\
 +[3] https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion \\
local_file_inclusion.1699543133.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki