[ bokini @ 26.11.2004. 06:39 ] @
Pozdrav,

Dobio sam poruku od mog Hosting Provajdera da je neko preko mog sajta pokusao da hakuje neciji sajt. Rekli su mi da je razlog toga Include komanda koju sam koristio na sajtu. Evo dela koda (ostatak je vrlo slican):

if ($section=="services")
{
if (empty($page))
{
@include("services.php");
} else
{
@include($section."/".$page."_".$lang.".php");
}
}.....

Da li neko moze da mi kaze gde je problem? Da li je problem @ znak. Da li je pomocu ove Include komande moguce pristupiti i nekoj remote stranici (stranici koja nije na mom sajtu?)

Na sajtu su mi iskljucili pristup toj stranici preko http-a (ftp naravno radi), i rekli su mi da ce je pustiti ponovo kada popravim to.

pozdrav i hvala
[ boccio @ 26.11.2004. 07:37 ] @
Uvlaciti fajlove iz URL-a kroz include() je "disaster waiting to happen"...

Ako vec hoces da se drzis toga, onda moras proveravati sta se zapravo prosledjuje kao parametar. Jedan nacin je da napravis niz "dozvoljenih" stranica za include, tipa:

Code:

$dozvoljeno = array( 'home', 'services', 'blabla');

if( in_array( $section, $dozvoljeno)) {
  include( $section.".php");
}
else {
  echo 'Hack!';



Drugi nacin je da koristis preg_match() da proveris da li se slucajno trazi include() iz nekog drugog foldera, kao i nezeljene karaktere. lep primer imas u samoj dokumentaciji za include (zasto to ljudi nikad ne gledaju?)

Code:

  $path = 'pages/';
  $extension = '.php';
 
  if ( preg_match("#^[a-z0-9_]+$#i",$page) ){
   $filename = $path.$page.$extension;
   include($filename);
  }


@ znak nije problem - razlika izmedju include() i @include() je samo u tome sto druga varijanta onemogucava ispis errora u slucaju da postoji...

Preporucio bih ti da prostudiras ovo, moze ti koristiti: Ten Security Checks for PHP
[ bluesman @ 26.11.2004. 13:17 ] @
Postoji citava filozofija oko include i sigurnosti i tu treba biti vrlo oprezan.

Recimo ti imas neke administratorske funkcije u script "admin.php" i hoces da je includeujes?

ako postavis recimo:
if ($admin == 1)
include "admin.php";

medjutim, ako je ukljucen register globals, on moze na tvoj script da doda: script.php?admin=1

i dobice include-ovane sve administratorske fuinkcije. Zato moras da proveris da li je setovan $_GET ili $_POST

if (empty($_REQUEST['admin']) && $admin == 1)
include "admin.php";

a onda u tvom scriptu proveris da je stvarno ulogovan admin i samo postavis variablu pre include:

$admin = 0;
if (ulogovan administrator.... )
$admin = 1;

pa kada naidje na:

if (empty($_REQUEST['admin']) && $admin == 1)
include "admin.php";

Ukljucice i admin funkcije ali samo ako ne postoji GET, POST variabla "admin"

// Napomena: ovo je vrlo prost primer u skladu sa KISS
[ bzero @ 26.11.2004. 14:16 ] @
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.
[ bokini @ 27.11.2004. 05:06 ] @
Hvala na odgovorima,

Popravio sam sajt (vrlo mali i prost sajt) i sada radi.

Od sada vodim vise racuna o ovome.

Pozdrav