Autor Zpráva
FBI Agent
Profil *
Ahoj.

Mám stránky tvořené klasicky pomocí html, css, php a přemýšlím jak je zabezpečit proti legračním nápadům.
Uživatelé můžou na stránkách přidávat komentáře pomocí formuláře a uploadovat soubory.

Zatím jediná věc co sem vymyslel a aplikoval, bylo vypnutí register globals a nastavení skriptu, aby na každé stránce vzal všechny _POST a _GET a protáhl je skrze htmlspecialchars funkci.

Díra o které vím je, že uživatel může nahrát jako soubor nějaký php skript a momentálně se snažím přijít na to, jak nastavit, aby se v tom upload adresáři případné soubory s php, cgi a podobné skripty braly jako obyčejný text a server je neprováděl.

Stačí to, nebo na něco důležitého zapomínám? Děkuji.
Fergi
Profil
nebylo by lepsi rovnou tyto soubory zakazat?
if($_FILES['uploadovanysoubor']['type']=="application/octet-stream"){
    echo "Soubory s příponou PHP jsou zakázány!";}
Joker
Profil
FBI Agent:
momentálně se snažím přijít na to, jak nastavit, aby se v tom upload adresáři případné soubory s php, cgi a podobné skripty braly jako obyčejný text
Stačilo by zablokovat přístup do toho upload adresáře (.htaccess) a na stahování souborů z něj udělat skript, který vezme zadaný soubor a přepošle ho na výstup.

Stačí to, nebo na něco důležitého zapomínám?
Těžko říct, když nevíme, jak je ta aplikace udělaná.
AM_
Profil
Fergi:
if($_FILES['uploadovanysoubor']['type']=="application/octet-stream"){
echo "Soubory s příponou PHP jsou zakázány!";}

Toto je dost špatný vtip. Každý středně pokročilý "hacker" ti uploaduje PHP soubor klidně s MIME typem image/jpeg, příponou .php a pak ho vesele spustí. Musíš ověřovat příponu uploadovaného souboru (protože podle té se rozhoduje i Apache, zda zpracuje PHP), nikoli jaký MIME typ uživatel uvedl, že to je.
Je ale potřeba zakázat většinou víc přípon, t.j. php, php5, php4 atd... lepší řešení je možná nastavením HTTP serveru zakázat vykonávání PHP v adresáři pro upload.
imploder
Profil
Fergi:
$_FILES['uploadovanysoubor']['type'] obsahuje jen informaci o typu souboru poskytnutou klientem (prohlížečem, co soubor posílá). Není vůbec bezpečné se spoléhat na to, že je ta informace pravdivá. Klidně můžu poslat soubor s příponou .php obsahující PHP skript a do $_FILES['uploadovanysoubor']['type'] podstrčit třeba "image/gif". Spolehlivé je kontrolovat přípony bez ohledu na $_FILES['uploadovanysoubor']['type'].

Pak taky existuje možnost nahrávat soubory do adresáře, kde je provádění PHP i případných jiných skriptů zakázané, pak můžou být soubory jakékoliv, i .php obsahující PHP skript - skript se nebude dát v tom adresáři spustit. Spouštění souborů s určitou příponou jako skript jde vypnout direktivou Apache RemoveHandler.
FBI Agent
Profil *
Takže jestli to správně chápu, stačí zajistit aby uploadovaný soubor neměl příponu .php1234 a sem vysmátý? (Jsem na serveru s apache)

AM:
lepší řešení je možná nastavením HTTP serveru zakázat vykonávání PHP v adresáři pro upload.

Tohle je přesně to co bych chtěl udělat. Jak na to? Mám k dispozici .htaccess, z té stránky moc moudrý nejsem. Chtěl bych právě pomocí htaccessu vypnout provádění jakýchkoliv serverových skriptů v onom nastaveném adresáři.
Fergi
Profil
aha omlouvam se o tom jsem moc nevedel :(
FBI Agent
Profil *
Zkusil sem toto php_flag register_globals off nicméně server mi vyhodí chybu o špatné konfiguraci
Nox
Profil
FBI Agent:
Toto dělá něco jiného, každopádně je to přínosné taky....syntakticky je to myslím správně...nedělá neplechu BOM? (viz FAQ)

Vypíná se to viz konec příspěvku implodera
FBI Agent
Profil *
překlep, měl sem na mysli toto php_admin_flag engine off

Pokud zkusím to řešení takto

AddHandler server-parsed .php

tak to funguje, ale musím mít .htaccess přímo v tom adresáři ve kterém to chci zakazovat, když to dám o adresář výš do htaccess takto

/upload/.htaccess:
AddHandler server-parsed .php

tak už to hází tu chybu o špatné konfiguraci
Nox
Profil
Ty přece nechceš AddHandler

Ta adresa je tuším spíš pro informaci, ve vlastním souboru nebude, takže:
RemoveHandler .php
RemoveHandler .php4
RemoveHandler .php5

nebo tak nějak
FBI Agent
Profil *
Nox, přišel sem na to že php_flag engine off snad vypne to php ve té složce úplně, nezáležíc na příponě souboru, co jsem tak zkoušel....

Teď mi už chybí jen jedna informace, jak můžu to php_flag engine off nasměrovat do toho adresáře upload z .htaccessu který je v jiném adresáři? (o jeden adresář výše ve struktuře konkrétně)
Chci to kvůli tomu abych ty povypínané adresáře mohl mít hezky nastavené v hlavním htaccessu a nemusel do každého adresáře který chci vypnutí strkat zvlášť samostatný htaccess
vynalezce
Profil
Pozor na věci jako je ../ v adrese a na přepsání nebo vytvoření .htaccessu, tím to lze obejít
imploder
Profil
FBI Agent:
Doporučuju dát do .htaccess
SetHandler default-handler

viz SetHandler a Apache's Handler Use

To způsobí, že všechno v adresáři bude zasláno Apachem jako statický obsah (MIME typ se určí podle přípony) a žádný skript (PHP, ani jiné skripty) se nebude provádět.

vynalezce:
Pozor na věci jako je ../ v adrese a na přepsání nebo vytvoření .htaccessu, tím to lze obejít
Že aplikace nesmí uživateli dovolit nahrát .htaccess je jasné, ale s tím ../ v adrese to nějak nechápu, mohl bys to vysvětlit?
vynalezce
Profil
imploder:
s tím ../ v adrese to nějak nechápu, mohl bys to vysvětlit?

Myslel jsem tím, aby hacker nenahrál soubor s názvem ../neprijemnykod.php. Tím by vylezl z adresáře s vypnutým vykonáváním PHP a soubor by se spustil.
imploder
Profil
vynalezce:
Myslel jsem tím, aby hacker nenahrál soubor s názvem ../neprijemnykod.php. Tím by vylezl z adresáře s vypnutým vykonáváním PHP a soubor by se spustil.
jj, to je pravda. Vyřeší to kontrola, že $_FILES['uploadovanysoubor']['name'] nesmí obsahovat lomítko ("/") a nesmí začínat na dvě tečky ("..").
FBI Agent
Profil *
Super. To SetHandler default-handler je přesně co jsem hledal, jestli to zastaví provádění všech skriptů.
To s ../ v názvu naštěstí nehrozí, protože se všechny soubory při uložení přejmenovávají.
Koudis
Profil *
POKUD TO MÁTE V unixu ... můžete všechny soubory nastavit jako nespustitelné ... pro oddělání PHP sciptů (pokud chcete jenom vypisovat) soubor přečíst a pak normálně vypsat pomocí echo... nobo rovnou celé zakázat ... myslím hned druhý příspěvek :)
imploder
Profil
Koudis:
Ne, druhý příspěvek opravdu nic neřeší. Při vyzkoušení v prohlížeči to ty "špatné" soubory nebude brát, takže zdánlivě OK, ale ve skutečnosti to není OK, dá se to snadno obejít a každý hacker to dokáže.
Koudis
Profil
imploder:
dá se to nastavit tak aby to jenom tak obejít nešlo ... přiznám se že nevím jak, kdysi jsem psal modul pro nějaké CMS a tam to měli velice podobně ... pak to nějak ještě kontrolovali modulem který si sami napsali a "přisestavili" k PHP ....
imploder
Profil
Koudis:
dá se to nastavit tak aby to jenom tak obejít nešlo ... přiznám se že nevím jak, kdysi jsem psal modul pro nějaké CMS a tam to měli velice podobně ... pak to nějak ještě kontrolovali modulem který si sami napsali a "přisestavili" k PHP ....
Tak to nevím, v každém případě ve výchozím nastavení je to naprosto k ničemu (typ závisí jenom na tom, co pošle prohlížeč - tj. může tam být podvrženo cokoliv) a je lepší způsob jak bezpečnost řešit - kontrolovat přípony nebo zakázat v adresáři s uloženými soubory provádění skriptů.
Koudis
Profil
imploder:
To je pravda, je také pravda že radit , dovolím si říct začátečníkovi, "napiš si modul v C/C++ a pak ho sestav i scelím PHP" není moc moudré ...
tomule
Profil *
A jak to je s JavaScriptem, co když na server někdo nahraje *.js. To sice půjde spustit, ale neplechu na serveru by to dělat nemělo, protože JavaScript nemá možnost číst soubory. A co flash?
tomule
Profil *
Jinak do .htaccess v dané složce nastavím "SetHandler default-handler" a zakážu vkládání souborů začínajících tečkou - tím zamezím i vložení .htaccess.
FBI Agent
Profil *
Tááákže. Do všech adresářů kam jde uploadovat, jsem nastrkal htaccessy s SetHandler default-handler (díky přejmenování souboru se nestane že by někdo nahrál .htaccess) a všechny $_GET $_POST a $_COOKIE protahuji skrze htmlspecialchars a addslashes, pokud jsou vyplé kouzelné kvóty. (To htmlspecialchars doufám vyřeší i případné XSS)

Zapomínám ještě na něco dalšího?
AM_
Profil
FBI Agent:
To htmlspecialchars doufám vyřeší i případné XSS
Pokud tam nepoužíváš JavaScript, tak ano. Pokud používáš, tak sice taky, ale stringy echované do JS není vhodné escapovat htmlspecialchars (ale to je složitější, pokud tam JS nemáš nebo do něj necpeš žádný vstup, nechce se mi o tom rozepisovat).

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: