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:
- skąd serwer “wie”, jak nazywa się przekazywany plik,
- “co z tego, że tak nie można nazwać pliku?”,
- trust boundary,
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ń