O bezpieczeństwie aplikacji webowych z lotu ptaka

W niniejszym artykule chcemy nakreślić podstawowe zagadnienia związane z bezpieczeństwem aplikacji webowych.

Można śmiało powiedzieć, że aplikacje webowe to obecnie jeden z najbardziej rozpowszechnionych typów oprogramowania. Używając słowa „aplikacja”, mamy na myśli serwisy WWW, które generują zawartość dynamicznie, tj. zmieniają swój wygląd pod wpływem działań użytkownika. W tym znaczeniu aplikacją webową nie będzie np. statyczna (tj. zawsze posiadająca ten sam, niezmienny dla użytkownika wygląd) strona napisana w czystym języku HTML. Będzie nią natomiast już serwis napisany choćby w języku PHP, który przyjmuje i wykonuje akcje od użytkownika, np. wysłanie formularza, wyszukanie produktu czy zalogowanie. W wypadku wspomnianego PHP wypadałoby jednak zastrzec, że złośliwi twierdzą, iż pojęcie takie jak „programista PHP” jest sprzeczne samo w sobie (a wręcz że to oksymoron) i, co za tym idzie, taki sam charakter ma “aplikacja webowa w PHP”. Tak naprawdę jednak kod witryn pisanych w tym języku potrafi być zarówno bardzo skomplikowany, jak też może sprowadzać się oczywiście do pojedynczych wstawek PHP w kodzie HTML.

Z punktu widzenia bezpieczeństwa aplikacje webowe są znacznie bardziej interesujące niż statyczne strony HTML. Te ostatnie posiadają przede wszystkim znacznie mniejszą powierzchnię ataku. Dla porównania możemy wyobrazić sobie długi i gruby mur pozbawiony bram, zbudowany z dużych i identycznych cegieł – w charakterze strony statycznej, oraz drugi – równie gruby ale zbudowany z różnorakich budulców, jak cegły, pustaki, drewno czy kamienie użyte w różnych konfiguracjach i do tego wyposażony w wiele różnych bram. W tym drugim wypadku możliwość znalezienia słabego punktu będzie znacznie bardziej prawdopodobna – wspomniana powierzchnia ataku będzie większa. Tak jak właśnie w wypadku dynamicznych stron WWW – aplikacji webowych.

Strony WWW, które reagują zmianą wyglądu i zachowania na działania użytkownika, przede wszystkim muszą przyjmować od niego wartości różnych zmiennych, jak choćby login i hasło, język w którym będzie wyświetlana treść, wspomniana fraza do wyszukania treści czy nazwa produktu, którego szczegółowe dane zostaną wyświetlone. Takie zmienne przesyłane przez przeglądarkę (tzw. parametry zapytań) pozwalają witrynie WWW wejść w interakcję z użytkownikiem, przy okazji stanowiąc też niestety potencjalną furtkę do włamania. Przeglądarka WWW ogranicza co prawda zakres danych, które mogą zostać przesłane do danego serwisu webowego, ale atakujący nie jest z kolei ograniczony do używania przeglądarki. Sztandarowym narzędziem atakujących aplikacje webowe (ale także testujących ich bezpieczeństwo) jest tzw. „intercepting proxy” – czyli program, który pozwala przechwycić wysyłane przez przeglądarkę żądania, a następnie już dowolnie je modyfikować i przesyłać w takiej formie do atakowanego serwera.

W jaki sposób spreparowany parametr żądania może naruszyć bezpieczeństwo aplikacji? Otóż treść żądania HTTP przetwarzana w aplikacji jest zazwyczaj przez wiele warstw programowych, np. żądanie jest dekodowane, następnie mapowane na zasób dyskowy bądź konkretny segment kodu wykonywalnego aplikacji, dalej może trafić do systemu bazodanowego, z którego to zostanie pobrana odpowiedź. Na końcu użytkownikowi zostanie wyświetlona odpowiedź na jego żądanie, która będzie z nim związana pośrednio (np. poprzez zapytanie do bazy danych) lub bezpośrednio (np. użytkownik zobaczy jakie przed chwilą zapytanie wpisał w polu wyszukiwania). W praktyce warstw tych może być więcej, a na każdej z nich może okazać się, że programista za nią odpowiedzialny nie przewidział skutków jakie wywoła dostarczenie odpowiednio spreparowanych danych (czyli głównie parametrów żądań) bądź ich konfiguracji. Co więcej, może zdarzyć się także, że pozornie nieznaczące uchybienia bezpieczeństwa na kilku warstwach mogą zsumować się do bardzo groźnej podatności (zaryzykujmy tu użycie pojęcia synergii). Pojęcie warstw aplikacji możemy rozszerzyć na komponenty, tj. dana warstwa może być zbudowana z wielu różnych komponentów, którymi są najczęściej biblioteki programistyczne.

Ten krótki artykuł pozwoli nam zrozumieć, jak skomplikowany system może stać za zmieniającymi się podstronami w naszej przeglądarce WWW. Niestety, wysoki poziom skomplikowania powoduje adekwatne ryzyko występowania błędów.