Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Stworzenie bezpiecznego uploadu.
Forum PHP.pl > Forum > PHP
koxfx
Można weryfikować rozszerzenia, mime_types, sprawdzić czy plik jest obrazkiem. Wszystko to da się obejść. Czy dodanie tego do .htaccess załatwi sprawe:

  1. ForceType application/octet-stream
  2. <FilesMatch "(?i).jpe?g$">
  3. ForceType image/jpeg
  4. </FilesMatch>
  5. <FilesMatch "(?i).gif$">
  6. ForceType image/gif
  7. </FilesMatch>
  8. <FilesMatch "(?i).png$">
  9. ForceType image/png
  10. </FilesMatch>


Jest jakieś lepsze rozwiązanie?
redeemer
Jak tylko obrazki to getimagesize.
koxfx
Zastanawia mnie czy archiwa niosą jakies zagrożenia.(.rar,.zip,.7zip)
Dozwolone będą nie tylko pliki graficzne. Trzeba prawdopodobnie pozbawić pliki możliwości wykonywania. Czy zaszyfrowanie pliku podczas uploadu i odszyfrowanie podczas ściągania może być zebezpieczeniem?
Pyton_000
Pytanie podstawowe co biędziesz z tymi plikami robił.
koxfx
Pliki będą wrzucone na serwer.(upload dostępny dla każdego) Póżniej ktoś sobie je ściągnie.
Tomplus
możesz zapisywać na serwerze pliki bez rozszerzeń, a w bazie zapisujesz informację o prawdziwej nazwie i prawdziwym rozszerzeniu, a potem gdy ma plik zostać pobrany, to pobiera ten plik z oryginalną nazwą i rozszerzeniem.
Pyton_000
Wydaje mi się (jeśli tylko się wydaje to mnie poprawcie) ale jak będziesz serwował pliki poprzez skrypt php, to wrzucając nagłówek "application/octet-stream" ktoś sobie to pobierze. Wczytanie pliku przez stream nie powinno wywołać żadnego nieszczęścia.

W skrócie, jeśli zablokujesz dostęp publiczny do plików i będziesz serwował przez skrypt to nie musisz martwić się o zabezpieczenia.
viking
Chyba wszystkie wysłane do przeglądarki pliki jako download będą bezpieczne chociaż nigdy nie można mieć w 100% pewności co tam pomysłowi włamywacze wymyślą.
Lepszą opcją jest moim zdaniem serwowanie plików z domeny statycznej gdzie nie ma żadnego parsera, co za tym idzie możliwości uruchomienia kodu.
redeemer
Cytat(koxfx @ 10.11.2015, 19:11:14 ) *
Zastanawia mnie czy archiwa niosą jakies zagrożenia.(.rar,.zip,.7zip)
W pewnych sytuacjach tak. Na początek warto zapoznać się z tzw. "Zip bomb" i 42.zip czyli zipe, który zajmuje 42 kilobajty, a rozpakowuje się do 4.5 PETAbajtów :-)

Dodatkowo do zipa oprócz zwykłych plików i katalogów możesz dodać linki symboliczne, które po rozpakowaniu na serwerze, w pewnych sytuacjach mogą zaburzać logikę aplikacji, albo udostępniać informacje. Przykład:
Jest panel, gdzie użytkownik uploaduje zipa, który jest rozpakowany na serwerze za pomocą system("unzip $plik -d $katalog"). Może sobie także na stronie przeglądać spakowane pliki, ale tylko *.jpg. W takich okolicznościach atakujący może wrzucić do zipa link symboliczny z nazwą test.jpg, kierujący do jakiegoś pliku php (albo chociażby /etc/passwd) aby zobaczyć jego zawartość. W przeglądarce będzie to wyglądać jak "zepsuty obrazek" bo obrazkiem oczywiście nie będzie, tylko źródłem pliku do którego linkowaliśmy.

Jak zrobić takiego zipa na linuxie:
Kod
mkdir evilzip
cd evilzip/
ln -s /etc/passwd evil.jpg
ln -s ../albo/jakis/plik.php evil2.jpg
zip --symlinks -r ../evil.zip *


Edit: No i polecam też obejrzeć sobie prezentację Gynvaela "Dziesięć tysięcy pułapek: ZIP, RAR, etc." z SEConference 2013
Comandeer
Cytat(Pyton_000 @ 11.11.2015, 09:06:30 ) *
Wydaje mi się (jeśli tylko się wydaje to mnie poprawcie) ale jak będziesz serwował pliki poprzez skrypt php, to wrzucając nagłówek "application/octet-stream" ktoś sobie to pobierze.

Od tego jest nagłówek Content-Disposition. Niemniej ustawienie egzotycznego typu MIME też działa, chociaż w teorii jest niezgodne ze sztuką wink.gif
koxfx
Według mnie jest jeszcze jeden sposób. Można pobrać plik przez skrypt. Następnie zapakować go do archiwum z losową nazwą i hasłem. Zapisać to w bazie danych. Przed ściągnięciem rozpakować i wysłać.
!*!
Zacznijmy od tego że plików graficznych się nie wgrywa, tylko na ich podstawie konwertuje do odpowiedniego formatu. Prócz wspomnianych podstaw mime type, getimagesize jest jeszcze exif_imagetype. Jednak to wszystko można obejść dość prosto zmieniając metatagi danego pliku. Dlatego wrzucasz plik, jakąś biblioteką do obróbki grafiki konwertujesz na odpowiedni format, kasujesz oryginał i dopiero wtedy pokazujesz to światu. Prócz tego w katalogu w którym zapisujesz pliki od użytkowników blokujesz możliwość wykonywania.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.