Nilhir’s Blog

Archive for the 'Bezpieczeństwo' Category

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