Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

Filtracja przesyłanego pliku na podstawie rozszerzenia

W notce Bezpieczny upload plików przedstawiłem różne sposoby zabezpieczania uploadu plików. Po jej przeczytaniu można by odnieść wrażenie, że kontrola rozszerzenia pliku w oparciu o białe listy jest najskuteczniejszym sposobem obrony. Stwierdzenie to wydaje się być sensowne. Umożliwiając użytkownikom przesłanie obrazków wymagamy, aby rozszerzenie pliku zawierało się w następującej grupie: gif, png, bmp, jpg, w przeciwnym razie plik zostaje odrzucony.

Jako wadę takiego rozwiązania podałem zależność bezpieczeństwa uploadu od konfiguracji serwera. Dodatkowo ostrzegałem, że często zdarza się traktowanie plików graficznych jako skrypty. Prawdę mówiąc miało to na celu bardziej przestraszenie przez pewnością tego typu filtracji niż oddanie prawdziwego stanu rzeczy.

Jak się okazało moje straszenie nie było tak bardzo bezpodstawne. Jak wie każdy kto miał do czynienia z konfiguracją Apache, aby umożliwić poprawne działanie PHP należy w pliku httpd.conf dodać poniższą dyrektywę, która sprawi, że pliki *.php będą przesyłane do parsera PHP.

AddType application/x-httpd-php .php

Niewielu jednak wie, że działanie AddType nie jest do końca takie oczywiste. Mogłoby się wydawać, że powyższy kod przepuści każdy plik z rozszerzeniem *.php przez parser. Nie do końca tak się jednak dzieje. Do parsera przesyłany jest każdy plik, którego nazwa zawiera „.php”, tak więc nie ma znaczenia czy będzie to skrypt.php czy obrazek.php.jpg oba pliki trafią do parsera.

Aby osiągnąć zamierzony efekt, tzn przesyłać do parsera pliki, które mają rozszerzenia *.php, a nie po prostu zawierają ten ciąg znaków należy zamiast dyrektywy AddType skorzystać z SetHandler.

<FilesMatch .php$>
   SetHandler php5-script
</FilesMatch>
AddType text/html .php

W przypadku, gdy nie mamy możliwości grzebania w plikach konfiguracyjnych możemy zabezpieczyć się korzystając z pliku .htaccess.

SetHandler EE_Upload_Security_Do_Not_Remove

Powyższa dyrektywa sprawi, że Apache nie będzie interpretował podwójnych rozszerzeń.

Notkę dedykuję adminom Progreso, którzy nie lubią grzebać w konfigu Apache :-)


Tagi: , ,
Kategoria: Bezpieczeństwo, Apache, Bezpieczeństwo, Upload


3 komentarze

  1. megawebmaster napisał(a):

    Witaj!
    Bardzo ciekawa informacja – nigdy nie spodziewałem się, że w tej konfiguracji jest aż taka luka. Bardzo ciekawe ostatnie artykuły o uploadzie plików. Przyda się ;)

    Pozdrawiam.

  2. noexa napisał(a):

    Pięknie. Po co to komu? mv obrazek.jpg skrypt.php – boom. mv skrypt.php obrazek.jpg – kaboom.

    Identyfikacja plików po rozszerzeniu to straszna naleciałość z winzgrozy. Żaden szanujący się programista nie będzie identyfikował plików tylko po tym, bo sensu to nie ma najmniejszego; vide BASH, jak nie nazwiesz pliku, zadziala – liczy się tylko wskazanie interpretera w nagłówku pliku.
    Co do samego uploadu (nie chce mi sie teraz przeskakiwac na drugi post), warto wspomniec o tym, ze obecnie, uzytkownicy sharedhostingów, maja strasznie nikłe szanse na poprawną identyfikację uploadowanych plików. Przeważnie brakuje dostępu do takich narzędzi jak EXIF, czy FILE (nie, nie file() z php).

  3. tylko weź pod uwage, że użycie mv wiąże się z dostępem do shella, a raczej nikt nie takich opcji swoim użytkownikom :-)

Dodaj komentarz