Generalno, NIKAD ne veruj korisnikovom inputu. Nikad ne treba koristiti promenjive koje su stigle od korisnika (ili mogu biti modifikovane korisinikovim inputom) za bilo sta, a pogotovo direktno za pristup fajlovima na sistemu, bazi podataka, u okviru upita na bazu, za izvrsenje komandi na sistemu preko exec(), system() i sl. UVEK treba proveriti ove vrednosti pre nego sto se koriste.
Konkretno, u tvom slucaju:
Citat:
@include($section."/".$page."_".$lang.".php");
omogucava da se otvori bilo koji fajl na sistemu koji php moze da cita. Pretpostavljam da promenjive $page i $lang mogu da se slobodno postave preko GET upita, kada se pozove strana, npr kao:
http://tvoj.server/strana.php?page=XXX&lang=XXX
E sad zamisli da neko pozove tvoju stranu tako da postavi $page i $lang na neke ovakve vrednosti:
$page = "../../../../zabranjen/pristup/nekifajl\0";
$lang = "bilo_koja_vrednost";
tvoj include ce izgledati ovako:
@include("services/../../../../zabranjen/pristup/nekifajl");
znaci u promenjivu page ubaci path to nekog fajla na sistemu, na kraj stavi null byte da odsece sve iza tvoje promenjive $page i eto ga, otvara fajlove okolo koji nemaju veze sa tvojim sajtom.
Ovo je samo na brzinu primer, inace se konkretno moze uraditi na vise nacina, u zavisnosti od konfiguracije PHP-a na serveru, a ocigledno radi, jer te je i provajder upozorio na to.
Never trust an operating system you don't have sources for.