Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Include i sigurnost

[es] :: PHP :: Include i sigurnost

[ Pregleda: 1093 | Odgovora: 4 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bokini

Član broj: 7372
Poruke: 101
*.smin.sezampro.yu.



Profil

icon Include i sigurnost26.11.2004. u 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
26.11.2004. u 06:39 

boccio
Boris Krstović
Spoonlabs.com
nbgd

SuperModerator
Član broj: 7594
Poruke: 2392
*.ptt.yu.

Sajt: blog.krstovic.info


Profil

icon Re: Include i sigurnost26.11.2004. u 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
26.11.2004. u 07:37 

bluesman
Goran Pilipović
Beograd

Član broj: 4505
Poruke: 1885
*.54.EUnet.yu.

ICQ: 7987706
Sajt: www.revolution.co.yu


Profil

icon Re: Include i sigurnost26.11.2004. u 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
Goran Pilipović fka bluesman
26.11.2004. u 13:17 

bzero
dev null
europe

Član broj: 5907
Poruke: 371
195.252.85.*

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: Include i sigurnost26.11.2004. u 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.

Never trust an operating system you don't have sources for.
26.11.2004. u 14:16 

bokini

Član broj: 7372
Poruke: 101
*.dialup.sezampro.yu.



Profil

icon Re: Include i sigurnost27.11.2004. u 05:06
Hvala na odgovorima,

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

Od sada vodim vise racuna o ovome.

Pozdrav
27.11.2004. u 05:06 

[es] :: PHP :: Include i sigurnost

[ Pregleda: 1093 | Odgovora: 4 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.