Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Stworzenie bezpiecznego uploadu.
koxfx
post 10.11.2015, 18:34:42
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 18.04.2015

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
redeemer
post 10.11.2015, 18:58:51
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


Jak tylko obrazki to getimagesize.


--------------------
Go to the top of the page
+Quote Post
koxfx
post 10.11.2015, 19:11:14
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 18.04.2015

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Pyton_000
post 10.11.2015, 19:41:42
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Pytanie podstawowe co biędziesz z tymi plikami robił.
Go to the top of the page
+Quote Post
koxfx
post 10.11.2015, 20:25:42
Post #5





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 18.04.2015

Ostrzeżenie: (0%)
-----


Pliki będą wrzucone na serwer.(upload dostępny dla każdego) Póżniej ktoś sobie je ściągnie.
Go to the top of the page
+Quote Post
Tomplus
post 10.11.2015, 22:25:45
Post #6





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Pyton_000
post 11.11.2015, 09:06:30
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post 11.11.2015, 09:13:16
Post #8





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
redeemer
post 11.11.2015, 10:50:16
Post #9





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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

Ten post edytował redeemer 11.11.2015, 10:52:40


--------------------
Go to the top of the page
+Quote Post
Comandeer
post 11.11.2015, 13:11:28
Post #10





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
koxfx
post 11.11.2015, 17:47:48
Post #11





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 18.04.2015

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
!*!
post 11.11.2015, 18:38:53
Post #12





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował !*! 11.11.2015, 18:45:48


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 13:47