Autor Zpráva
Dusann
Profil
Čo verifikuje táto funkcia ? Veď argument $filename odkazuje stále na $_FILES[...]['tmp_name'] čo je PHPčkom vygenerovaná cesta do temporary adresára + PHP formát názvu tmp súboru. Túto hodnotu predsa nie je možné nejak zmeniť pred PHP skriptom, tak aké riziko hrozí ak priamo použijem $_FILES[...]['tmp_name'] pre kopírovanie ?
Martin2
Profil *
Pokud vzápětí používáš funkci move_uploaded_file, tak je kontrola pomocí is_uploaded_file zbytečná.

Jinak do superglobálních polí (jako je $_FILES) lze, žel bohu, při běhu programu stále zapisovat, takže teoreticky bys mohl chtít někdy kontrolovat, jestli je cesta k temporary souboru korektní, ale jak jsem psal – v typickém případě následuje uložení souboru pomocí move_uploaded_file.
Dusann
Profil
Martin2:
Pokud vzápětí používáš funkci move_uploaded_file, tak je kontrola pomocí is_uploaded_file zbytečná.

inak do superglobálních polí (jako je $_FILES) lze, žel bohu, při běhu programu stále zapisovat

To je známa vec, to viem. Ale aké riziko hrozí ak by move_uploaded_file() nepoužívala to isté čo is_uploaded_file() ? To by niekto musel z prostredia PHP skriptu zapisovať do $_FILES. Ak pokiaľ má niekto už kontrolu nad PHP skriptom, tak môže robiť úplne iné veci. Zaujíma ma konkrétny príklad zneužitia $_FILES[...]['tmp_name'].
Davex
Profil
Dusann:
Ak pokiaľ má niekto už kontrolu nad PHP skriptom, tak môže robiť úplne iné veci.
No právě. Nedívej se na to z pohledu útoku na PHP skript zvenčí, ale pohledem využití PHP skriptu na serveru.

Kdyby funkce move_uploaded_file() nekontrolovala, že je zdrojový soubor nahraný přes HTTP POST, tak by za vhodných podmínek mohl útočník získat obsah cizích souborů na serveru. Ona totiž nekontroluje, na rozdíl od jiných souborových funkcí, zda je zdrojový soubor umístěn na povolených cestách v rámci open_basedir.
Dusann
Profil
Davex:
Kdyby funkce move_uploaded_file() nekontrolovala, že je zdrojový soubor nahraný přes HTTP POST, tak by za vhodných podmínek mohl útočník získat obsah cizích souborů na serveru.

Čo sú to tie vhodné podmienky ? Stále je to pre mňa trochu abstraktné, rád by som videl nejaký konkrétny postup, ktorý do demonštruje. Dík
Davex
Profil
Dusann:
Čo sú to tie vhodné podmienky ?
Třeba nastavení práv u souborů, které umožňuje změnu komukoliv nebo uživateli, pod kterým jsou spouštěny PHP skripty.

Stále je to pre mňa trochu abstraktné
Nedovedeš si představit, že by se dalo přistoupit k souborům jiného uživatele na webserveru mimo „domovský/kořenový“ adresář webu?

Třeba
move_uploaded_file("/var/www/virtual/example.com/www/wp-config.php", "./ukradeny-wp-config.php");
Dusann
Profil
Davex: No ale pokiaľ sa bavíme o skripte ktorý vlastní niekto iný, tak stačí keď použije napr. copy()...stále mi uniká pointa ochrany v move_uploaded_file() v mojom skripte.
Davex
Profil
Dusann:
stačí keď použije napr. copy()
Nestačí, protože copy() ho pustí pouze do adresářů, které jsou uvedené v open_basedir.

stále mi uniká pointa ochrany v move_uploaded_file() v mojom skripte
Ochrana spočívá v tom, že na serveru můžeš přesouvat pouze soubory, které byly na server nahrány přes HTTP POST. Nemůžeš přesouvat cizí soubory a škodit.
Dusann
Profil
Ešte k tej ukážke Example #1 v tomto linku: php.net/manual/en/function.is-uploaded-file.php

Ako sa môže niekto cudzí dostať ku premennej $_FILES[...]['tmp_name'] v mojom skripte a prepísať ju ? (Keďže je nutná kontrola cez is_uploaded_file())
Davex
Profil
Dusann:
Ako sa môže niekto cudzí dostať ku premennej $_FILES[...]['tmp_name'] v mojom skripte a prepísať ju ?
Může třeba využít nějakou slabinu ve skriptech a vložit svůj skript, který to udělá, ale moc nechápu, k čemu by mu to mělo být dobré?

Keďže je nutná kontrola cez is_uploaded_file()
Pokud použiješ superglobální pole $_FILES, tak není potřeba.
Dusann
Profil
Davex:
Pokud použiješ superglobální pole $_FILES, tak není potřeba.

Viď. ukážka v linku vyššie - tam je is_uploaded_file () použité.

Může třeba využít nějakou slabinu ve skriptech a vložit svůj skript, který to udělá, ale moc nechápu, k čemu by mu to mělo být dobré?

No aby sa nebolo možné dostať napr. ku /etc/passwd. Aj keď tomuto zamedzuje predsa open_basedir, ak je nastavený na website root. Čiže is_uploaded_file () potom nemá využitie ?
Martin2
Profil *
Dusann:
Čiže is_uploaded_file () potom nemá využitie ?
Má využití. Kontroluje, jestli odkazovaný soubor na disku serveru vznikl jako výsledek přijetí přílohy aktuálního požadavku. Třeba kdyby chtěl script ověřit úspěch uploadu, ale soubor nechal skartovat garbage collectorem – třeba, co já vím?

Jaký smysl má tvé pachtění po „zbytečných“ funkcích PHP? Jsou jich desítky. Historii Apache serveru a PHP psali pankáči, proto musí PHP dodnes řešit bezpečnost a rozdělení pravomocí svých uživatelů tímto prasečím způsobem. Apache sám o sobě je minové pole sdílených prostředků ve kterém rejdí zbastlené céčkové moduly, které napsal někdo dřív než ses narodil.
Dusann
Profil
Martin2:
Třeba kdyby chtěl script ověřit úspěch uploadu, ale soubor nechal skartovat garbage collectorem
Veď PHP automaticky maže upload v tempe, nie ? A úspech uploadu zistíš cez [error] vo $_FILES.

Jaký smysl má tvé pachtění po ‚zbytečných‘ funkcích PHP? Jsou jich desítky.
Nepachtím sa, ale na viacerých miestach som sa dočítal o používaní is_uploaded_file() kde bola stále len nekonkrétna zmienka že bez tejto funkcie môže dôjsť k zneužitiu, tak ma len zaujímalo proti čomu funkcia ochraňuje.
Martin2
Profil *
Dusann:
úspech uploadu zistíš cez [error] vo $_FILES.
No a nějakého důvodu, který nebudeš nikomu prozrazovat, můžeš chtít udělat metodu pracující s uploadovanými i jinými soubory. Pak se ti bude hodit is_uploaded_file pro přípravu souboru před dalšími operacemi.

tak ma len zaujímalo proti čomu funkcia ochraňuje.
Na což jsme ti odpověděli už tady [#2] a tady [#4]

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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