Nilhir’s Blog

Fałszywy Upload

Postanowiłem zacząć nowy cykl o bezpieczeństwie skryptów php - postaram się opisać wiele znanych i mniej znanych spraw związanych z pisaniem w miare bezpiecznych skryptów :)

W 1 notce postanowiłem opisać dość znany jednak często pomijany z uwagi na ‘niskie zagrożenie’ (chociaż tak naprawde jest bardzo wysokie) - źle napisany skrypt do uploadu który pozwala na wgranie dowolnego pliku.

Dla przykładu (przykładowy skrypt znaleziony w googlach):

Pomińmy już fakt, że to pseudo-zabezpieczenie o wielkości pliku (input o name=”MAX_FILE_SIZE”) można obejść w kilka minut, ale o tym kiedy indziej ;)

Skrypt wogóle nie sprawdza rodzaju pliku tylko go odrazu akceptuje. Co jeśli ktoś np. wrzuci tam plik .php który dla przykładu będzie kasował wszystko katalog niżej ? No właśnie :) Oczywiście może zrobić też inne rzeczy - nie mówiąc już o tym co może zrobić przy źle skonfigurowanym serwerze …

Jak można się przed tym zabezpieczyć ? Dużo początkujących stosuje coś w stylu

Czemu to zabezpieczenie jest głupie ? Wystarczy nazwać plik dla przykładu plik.jpg.php - i $ext[1] będzie = “jpg”

Można np za to dać.

Które sprawdza ostatnie to co występuje po .

Do końca bezpieczne to też nie będzie bo czasami można podszyć jakiś plik pod inny (przykład - chociażby przy niektórych ustawieniach serwera może parsować php w plikach html).

Często stosuje się też substr() i sprawdza 3 ostatnie znaki, co jeśli jednak rozszerzenie ma np 4 litery ? (np. plik .mpeg albo .torrent)

Obecnie chyba najlepszą metodą jest sprawdzanie mime-type (co to jest ?) - jest on zapisywany w $_FILES jako $_FILES[’plik’][type]

Możemy wtedy zapisać do tablicy liste dozwolonych typów mime i sprawdzać czy wysyłany pasuje do któregoś z nich (przykładową liste typów mime można znaleźć tutaj)

10 Comments so far

  1. Vicer November 17th, 2006 10:05 pm

    ty, moge tą notke umieścić jako art na webPacket ? :P

  2. Jasiu December 10th, 2006 1:36 am

    W celu wyciagniecia rozszerzenia pliku polecam zapoznac sie z funkcja pathinfo w manualu php.

  3. Lol March 14th, 2007 1:30 pm

    Obecnie chyba najlepszą metodą jest sprawdzanie mime-type (co to jest ?) - jest on zapisywany w $_FILES jako $_FILES[’plik’][type]

    - takie stwierdzenie to przesada typ można łatwo podmienić dodając kolejne np.obraz.php.jpg i wpisując cała ścieżkę uruchamia sie skrypt php (obraz.php.jpg)

  4. Eddie March 30th, 2007 7:01 pm

    Hi people! Great job! Would you please also visit my homepage?

  5. Lawrence March 30th, 2007 7:01 pm

    Your site looks great! Would you please also visit my homepage?

  6. Lillian March 30th, 2007 7:01 pm

    This is a wonderful page for everyone! Visit my sites, please:

  7. Coleman March 30th, 2007 7:01 pm

    I really enjoyed this page. I will be linking and I will be trying to read and research all that there is to offer from this site! Visit my sites, please:

  8. zlpwggdmcj May 28th, 2007 9:53 pm

    Hello! Good Site! Thanks you! dhjygxovgtwmy

  9. howkknfwml May 29th, 2007 10:45 am
  10. Piotr November 5th, 2007 1:50 am

    Niestety nie skuteczne, żadne z w/w metod nie spełniają do końca swojego zadania, zmiana pliczku abc.html na abc.gif i mime-type pokazuje nam image/gif ..fakt ze z takim plikiem nic się później nie zrobi,ale można komuś zakrzaczyć formularz czy okienko z pseudo zdięciem… :- )

Leave a reply