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

Include i sigurnost

[es] :: PHP :: Include i sigurnost

[ Pregleda: 3028 | Odgovora: 4 ] > FB > Twit

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 - pre 203 meseci
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
 
Odgovor na temu

boccio
Boris Krstović
Spoonlabs.com
nbgd

Član broj: 7594
Poruke: 2458
*.ptt.yu.

Sajt: bocc.io


+771 Profil

icon Re: Include i sigurnost26.11.2004. u 07:37 - pre 203 meseci
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
Jeff, one day you’ll understand that it’s harder to be kind than clever.
 
Odgovor na temu

bluesman

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



+1 Profil

icon Re: Include i sigurnost26.11.2004. u 13:17 - pre 203 meseci
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
 
Odgovor na temu

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 - pre 203 meseci
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.
 
Odgovor na temu

bokini

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



Profil

icon Re: Include i sigurnost27.11.2004. u 05:06 - pre 203 meseci
Hvala na odgovorima,

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

Od sada vodim vise racuna o ovome.

Pozdrav
 
Odgovor na temu

[es] :: PHP :: Include i sigurnost

[ Pregleda: 3028 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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