( 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.
|