📧 [email protected] 📞 +381 61 161 2299
OWASP A01: Broken Access Control

Path Traversal i LFI: Kako napadači čitaju fajlove sa vašeg servera

2026-07-22 · Shieldome Scout

Sekvenca ../../ u URL-u može biti ulaznica do /etc/passwd, .env fajla sa API ključevima ili čak PHP source koda vaše aplikacije. Ove ranjivosti su češće nego što mislite.

← Blog

Šta je Path Traversal?

Path Traversal (Directory Traversal) je napad u kome napadač manipuliše putanjom fajla u URL-u ili parametru da bi pristupio fajlovima van namenjenog direktorijuma. Sekvenca ../ (dot-dot-slash) pomera "gore" u hijerarhiji direktorijuma.

Klasičan primer

Aplikacija prikazuje slike ovako: https://sajt.rs/files?name=slika.jpg

Napadač menja zahtev u: https://sajt.rs/files?name=../../../../etc/passwd

Ako aplikacija ne sanitizuje putanju, server vraća sadržaj /etc/passwd — listu korisnika sistema.

Šta je LFI (Local File Inclusion)?

LFI je specifičan oblik path traversal kod PHP aplikacija: napadač može da "uključi" (include) lokalni fajl u izvršavanje PHP skripte. Ovo je ozbiljnije od čitog čitanja jer inkludovani fajl se izvršava kao PHP kod.

// Ranjivi PHP kod:
$page = $_GET['page'];
include($page . '.php');

Zahtev: /index.php?page=../../../../etc/passwd%00

%00 je null byte koji "odseca" .php nastavak na starijim PHP verzijama.

Šta napadač može da pročita

LFI + log poisoning = Remote Code Execution. Napadač najpre ubacuje PHP payload u access log (kroz User-Agent header), pa inkluduje log fajl kroz LFI. Rezultat: arbitrarno izvršavanje koda na serveru.

Tipična mesta ranjivosti

Odbrana

1. Whitelist dozvoljenih putanja

Nikada ne konstruišite putanje fajlova direktno iz korisničkog unosa. Koristite whitelist: dozvolite samo tačno definisane vrednosti.

$allowed = ['home', 'about', 'contact'];
if (!in_array($page, $allowed)) {
    die('Invalid page');
}
include($page . '.php');

2. Canonicalize putanje

Koristite realpath() i proverite da li rezultujuća putanja počinje dozvoljenim baznim direktorijumom.

$base = '/var/www/html/files/';
$path = realpath($base . $filename);
if (strpos($path, $base) !== 0) {
    die('Access denied');
}

3. Onemogućite null byte obradu

Na PHP 5.3+, null byte u putanji generiše grešku. Svakako filtrirajte \0 iz korisničkog unosa.

4. Minimalna privilegija za web server

Web server proces treba da ima pristup samo fajlovima neophodnim za rad aplikacije — ne /etc/, ne home direktorijumima korisnika, ne logovima sistema.

5. Onemogućite include wrappers (PHP)

U php.ini: allow_url_include = Off — sprečava Remote File Inclusion (RFI).

Proverite bezbednost vašeg sajta

Profesionalna procena ranjivosti. OWASP Top 10, dark web monitoring, PDF izveštaj za 2–3 radna dana.

Zatražite procenu →