Bootcamp XVI: rozwiązanie

Radekk jest pierwszą osobą, która rozwiązała najnowsze zadanie na bootcamp. Przy okazji dołączył do bardzo nielicznego grona osób, które poradziły sobie z wyzwaniem (swoją drogą zapraszam, dostępnych jest kilka wskazówek). Tym razem również nie podam dokładnego opisu rozwiązania, zarówno XSS (w ramach inspiracji: JS Ninja) jak i SQLi (jeśli ktoś potrzebuje pomocy: Lekcja 7: (blind) SQL injection) nie są wyjątkowo interesujące. W przykładzie tym ważne jest coś innego...

Podałem trzy podpowiedzi do zadania:

Na pierwsze pytanie łatwo odpowiedzieć patrząc na wysyłane przez przeglądarkę żądanie:

Nazwa (czasami również cała ścieżka) przekazywanego pliku zawarta jest w atrybucie filename , który ustawiany jest przez przeglądarkę na podstawie nazwy (ścieżki) wskazanego pliku. Praktycznie każdy system plików narzuca pewne ograniczenia odnośnie nazwy pliku, a i system operacyjny nie jest tu bez znaczenia. Ogólnie rzecz biorąc nazwa pliku nie może być dowolna.

Dwie kolejne podpowiedzi łączą się w zasadzie w jeden scenariusz: wartość atrybutu filename w żądaniu wysyłanym przez przeglądarkę może zostać dowolnie zmodyfikowana przez atakującego. Nowej nazwy pliku prawie nie dotyczą żadne z ograniczeń, które “wymusza” system operacyjny czy system plików. Innymi słowy jeśli ktoś oczekuje, że nazwa pliku nie będzie zawierała znaków typu < czy > tylko dlatego, że nie można utworzyć pliku o takiej nazwie, to jest w błędzie.

Przy okazji warto zauważyć, że w analogiczny sposób w jaki można zmienić “nazwę pliku”, można zmienić również jego “typ”. Typ (w sensie typu MIME) pliku przekazywany jest w atrybucie Content-Type i, podobnie jak filename , może zostać dowolnie zmodyfikowany przez atakującego. A co z tego wynika, łatwo można się domyślić.

Na zakończenie przypomnę jeszcze raz o wpisie File upload security recommendations. Warto zapoznać się z tymi zaleceniami i je stosować.

Oryginał tego wpisu dostępny jest pod adresem Bootcamp XVI: rozwiązanie

Autor: Paweł Goleń