( Pawe│ *peewee* Subocz )
Na pocz▒tku om≤wie kr≤tko jak w PHP dzia│a uploadowanie plik≤w, a p≤╝niej przejde do sedna problemu.
Ka┐dy plik wys│any do naszego skryptu za pomoc▒ formularza jest zapisywany do katalogu tymczasowego z unikalna nazw▒
(np. /tmp/php9jsikE). Informacje o tym gdzie siΩ znajduje s▒ zapisywane w odpowiedniej zmiennej.
Tekst powsta│ na podstawie postu Zeeva Suraskiego na BUGTRAQ'u.
Na pocz▒tku om≤wie kr≤tko jak w PHP dzia│a uploadowanie plik≤w, a p≤╝niej przejde do sedna problemu.
Ka┐dy plik wys│any do naszego skryptu za pomoc▒ formularza jest zapisywany do katalogu tymczasowego z unikalna nazw▒
(np. /tmp/php9jsikE). Informacje o tym gdzie siΩ znajduje s▒ zapisywane w odpowiedniej zmiennej. Jej nazwa zale┐y od nazwy
wybranej w formularzu. Np. W formularzu napisali╢my: <input type=file name=userfile> w zmiennej $userfile bΩdzie znajdowaµ siΩ
scie┐ka do tymczasowego pliku na serwerze.
Problem polega na tym, ┐e kto╢ mo┐e jako parametr w urlu podaµ userfile z nazwa jakiego╢ normalnego pliku na serwerze.
Czy to mo┐e nam zaszkodziµ zale┐y tylko od tego, co robimy z danym plikiem. Je╢li kopiujemy go do jakiegos publicznie
dostΩpnego miejsca, to mo┐na wpisaµ w swojej przegl▒darce np. http://serwer.pl/upload.php?userfile=/etc/passwd i ju┐ dostajemy
pe│n▒ listΩ u┐ytkownik≤w na tym serwerze... Trzeba jednak pamiΩtaµ, ┐e w ten spos≤b mo┐na dostaµ siΩ jedynie do plik≤w, do
kt≤rych ma dostΩp user, z prawami kt≤rego dziala demon http (najczΩ╢ciej nobody). Mimo wszystko jest to niebezpieczne.
Rozwi▒zania:
Zeev proponuje wy│▒czenie funkcji register_globals, przez co parametry z urla nie zostan▒ wpisane do odpowiadaj▒cym im
zmiennym i wyci▒gniΩcie danych z $HTTP_POST_VARS. Jednak moim zdaniem to niewiele pomo┐e bo przecie┐ te informacje
mog▒ byµ tak samo sfa│szowane, bΩdzie to tylko wymaga│o trochΩ wiΩcej pracy.
Jedynym sensownym rozwi▒zaniem jest dok│adne sprawdzanie pliku, kt≤ry dostajemy.
Nowe wersje PHP (4.0.3RC1 i 3.0.17RC1) zosta│y ju┐ wyposa┐one w funkcjΩ, kt≤ra pomaga w zabezpieczeniu siΩ przed tego
typu oszustwami - is_uploaded_file($sciezka);
PHP 4.0.3 zawiera tak┐e funkcjΩ move_uploaded_file($sciezka, $nowa_sciezka), kt≤ra kopiuje plik pod warunkiem, ┐e zosta│
zuploadowany.
Je╢li pracujemy na starszym PHP i nie zamierzamy, lub nie mo┐emy zaktualizowaµ go musimy sami napisaµ odpowiednie funkcje.
Mo┐emy np. sprawdziµ datΩ utworzenia domniemanego pliku tymczasowego i odrzuciµ go, je╢li jest mniejsza o np minutΩ.
Je╢li oczekujemy rysunku to za pomoc▒ funkcji PHP mo┐emy sprawdziµ czy plik rzeczywi╢cie jest rysunkiem.
Napewno mo┐na wymy╢liµ te┐ inne regu│y specyficzne dla danego typu plik≤w.
|