Testowanie bezpieczeñstwa
aplikacji internetowych.
Receptury
Autor: Paco Hope, Ben Walther
T³umaczenie: Rados³aw Meryk
ISBN: 978-83-246-2208-5
Tytu³ orygina³u:
Web Security Testing Cookbook
Format: 168x237, stron: 312
Poznaj i wykorzystaj mechanizmy testowania zabezpieczeñ,
a nikt nie przeœlizgnie siê przez Twoj¹ witrynê!
•
Jak zainstalowaæ i skonfigurowaæ narzêdzia do testowania zabezpieczeñ?
•
Jak szybko i sprawnie znaleŸæ problemy w aplikacjach?
•
Jak wykorzystywaæ testy powtarzalne?
Witryny internetowe oraz ich aplikacje stanowi¹ swoist¹ wirtualn¹ furtkê do wszystkich
korporacji i instytucji. Jak zatem zadbaæ, aby nikt niepo¿¹dany nie przedosta³ siê
do œrodka? Co sprawia, ¿e witryna jest naprawdê bezpieczna? I w jaki sposób testowaæ
aplikacjê, aby nie by³ to proces ¿mudny i czasoch³onny, a raczej sprawny i skuteczny?
Oto rozwi¹zanie — niniejsza ksi¹¿ka zawiera proste receptury, dziêki którym z ³atwoœci¹
znajdziesz luki w aplikacjach, zanim zrobi¹ to ró¿ni hakerzy.
Ksi¹¿ka
„
Testowanie bezpieczeñstwa aplikacji internetowych. Receptury
”
to napisany
zrozumia³ym jêzykiem podrêcznik, dziêki któremu szybko poznasz mechanizmy
testowania zabezpieczeñ. Praktyczne przyk³ady zawarte w tym przewodniku sprawi¹,
¿e szybko nauczysz siê w³¹czaæ systemy zabezpieczeñ do standardowych procedur
kontroli aplikacji. Bez problemu stworzysz testy dotycz¹ce funkcji AJAX, a tak¿e
przeprowadzisz rozbudowane, wieloetapowe testy podatnoœci na klasyczne problemy:
skrypty krzy¿owe oraz wstrzykiwanie kodu.
•
Bezpieczeñstwo oprogramowania
•
Instalacja darmowych narzêdzi i rozszerzeñ
•
Kodowanie danych w Internecie
•
Manipulowanie danymi wejœciowymi
•
Fa³szowanie informacji przesy³anych w nag³ówkach przez przegl¹darki
•
Przesy³anie na serwer plików o du¿ej objêtoœci
•
Obchodzenie ograniczeñ interfejsu u¿ytkownika
•
Autoryzacja masowego skanowania
•
Ataki przeciwko aplikacjom AJAX
•
Manipulowanie sesjami
•
Testy wielostronne
Niech bezpieczeñstwo Twoich aplikacji nie spêdza Ci snu z powiek!
5
Spis tre
ļci
S
ĥowo wstýpne .............................................................................................................11
Przedmowa .................................................................................................................. 13
1. Wprowadzenie ............................................................................................................23
1.1. Co to jest testowanie zabezpieczeþ?
23
1.2. Czym sñ aplikacje internetowe?
27
1.3. Podstawowe pojöcia dotyczñce aplikacji internetowych
31
1.4. Testowanie zabezpieczeþ aplikacji internetowej
36
1.5. Zasadnicze pytanie brzmi: „Jak”
37
2. Instalacja darmowych narz
ýdzi .................................................................................. 41
2.1. Instalacja przeglñdarki Firefox
42
2.2. Instalacja rozszerzeþ przeglñdarki Firefox
42
2.3. Instalacja rozszerzenia Firebug
43
2.4. Instalacja programu WebScarab grupy OWASP
44
2.5. Instalowanie Perla i pakietów w systemie Windows
45
2.6. Instalacja Perla i korzystanie z repozytorium CPAN w systemie Linux
46
2.7. Instalacja narzödzia CAL9000
47
2.8. Instalacja narzödzia ViewState Decoder
47
2.9. Instalacja cURL
48
2.10. Instalacja narzödzia Pornzilla
49
2.11. Instalacja Ĉrodowiska Cygwin
49
2.12. Instalacja narzödzia Nikto 2
51
2.13. Instalacja zestawu narzödzi Burp Suite
52
2.14. Instalacja serwera HTTP Apache
53
6
_ Spis tre
ļci
3. Prosta obserwacja .......................................................................................................55
3.1. Przeglñdanie Ēródäa HTML strony
56
3.2. Zaawansowane przeglñdanie kodu Ēródäowego
58
3.3. Obserwacja nagäówków Ĕñdaþ „na Ĕywo” za pomocñ dodatku Firebug
60
3.4. Obserwacja danych POST „na Ĕywo” za pomocñ narzödzia WebScarab
64
3.5. Oglñdanie ukrytych pól formularza
68
3.6. Obserwacja nagäówków odpowiedzi „na Ĕywo”
za pomocñ dodatku TamperData
69
3.7. PodĈwietlanie kodu JavaScript i komentarzy
71
3.8. Wykrywanie zdarzeþ JavaScript
73
3.9. Modyfikowanie specyficznych atrybutów elementów
74
3.10. Dynamiczne Ĉledzenie atrybutów elementów
76
3.11. Wnioski
78
4. Kodowanie danych w internecie ................................................................................ 79
4.1. Rozpoznawanie binarnych reprezentacji danych
80
4.2. Korzystanie z danych Base64
82
4.3. Konwersja liczb zakodowanych w Base36 na stronie WWW
84
4.4. Korzystanie z danych Base36 w Perlu
85
4.5. Wykorzystanie danych kodowanych w URL
85
4.6. Wykorzystywanie danych w formacie encji HTML
88
4.7. Wyliczanie skrótów
89
4.8. Rozpoznawanie formatów czasowych
91
4.9. Programowe kodowanie wartoĈci oznaczajñcych czas
93
4.10. Dekodowanie wartoĈci ViewState jözyka ASP.NET
94
4.11. Dekodowanie danych zakodowanych wielokrotnie
96
5. Manipulowanie danymi wej
ļciowymi ........................................................................99
5.1. Przechwytywanie i modyfikowanie Ĕñdaþ POST
100
5.2. ObejĈcia ograniczeþ pól wejĈciowych
103
5.3. Modyfikowanie adresu URL
104
5.4. Automatyzacja modyfikowania adresów URL
107
5.5. Testowanie obsäugi däugich adresów URL
108
5.6. Edycja plików cookie
110
5.7. Faäszowanie informacji przesyäanych przez przeglñdarki w nagäówkach
112
5.8. Przesyäanie na serwer plików o zäoĈliwych nazwach
115
5.9. Przesyäanie na serwer plików o duĔej objötoĈci
117
5.10. Przesyäanie plików XML o zäoĈliwej zawartoĈci
118
5.11. Przesyäanie plików XML o zäoĈliwej strukturze
120
5.12. Przesyäanie zäoĈliwych plików ZIP
122
5.13. Przesyäanie na serwer przykäadowych plików wirusów
123
5.14. Obchodzenie ograniczeþ interfejsu uĔytkownika
124
Spis tre
ļci _
7
6. Automatyzacja masowego skanowania ...................................................................127
6.1. Przeglñdanie serwisu WWW za pomocñ programu WebScarab
128
6.2. Przeksztaäcanie wyników dziaäania programów typu pajñk
do postaci listy inwentaryzacyjnej
130
6.3. Redukowanie listy adresów URL do testowania
133
6.4. Wykorzystanie arkusza kalkulacyjnego do redukcji listy
134
6.5. Tworzenie kopii lustrzanej serwisu WWW za pomocñ programu LWP
134
6.6. Tworzenie kopii lustrzanej serwisu WWW za pomocñ polecenia wget
136
6.7. Tworzenie kopii lustrzanej specyficznych elementów
za pomocñ polecenia wget
138
6.8. Skanowanie serwisu WWW za pomocñ programu Nikto
138
6.9. Interpretacja wyników programu Nikto
140
6.10. Skanowanie serwisów HTTPS za pomocñ programu Nikto
142
6.11. UĔywanie programu Nikto z uwierzytelnianiem
143
6.12. Uruchamianie Nikto w okreĈlonym punkcie startowym
144
6.13. Wykorzystywanie specyficznego pliku cookie sesji z programem Nikto
145
6.14. Testowanie usäug sieciowych za pomocñ programu WSFuzzer
146
6.15. Interpretacja wyników programu WSFuzzer
148
7. Automatyzacja wybranych zada
ħ z wykorzystaniem cURL .....................................151
7.1. Pobieranie strony za pomocñ cURL
152
7.2. Pobieranie wielu odmian strony spod adresu URL
153
7.3. Automatyczne Ĉledzenie przekierowaþ
154
7.4. Wykorzystanie cURL do testowania podatnoĈci
na ataki za pomocñ skryptów krzyĔowych
155
7.5. Wykorzystanie cURL do testowania podatnoĈci
na ataki typu „przechodzenie przez katalog”
158
7.6. NaĈladowanie specyficznego typu przeglñdarki lub urzñdzenia
161
7.7. Interaktywne naĈladowanie innego urzñdzenia
162
7.8. Imitowanie wyszukiwarki za pomocñ cURL
165
7.9. Pozorowanie przepäywu poprzez faäszowanie nagäówków referer
166
7.10. Pobieranie samych nagäówków HTTP
167
7.11. Symulacja Ĕñdaþ POST za pomocñ cURL
168
7.12. Utrzymywanie stanu sesji
169
7.13. Modyfikowanie plików cookie
171
7.14. Przesyäanie pliku na serwer za pomocñ cURL
171
7.15. Tworzenie wieloetapowego przypadku testowego
172
7.16. Wnioski
177
8
_ Spis tre
ļci
8. Automatyzacja zada
ħ z wykorzystaniem biblioteki LibWWWPerl ........................ 179
8.1. Napisanie prostego skryptu Perla do pobierania strony
180
8.2. Programowe modyfikowanie parametrów
181
8.3. Symulacja wprowadzania danych za poĈrednictwem formularzy
z wykorzystaniem Ĕñdaþ POST
183
8.4. Przechwytywanie i zapisywanie plików cookie
184
8.5. Sprawdzanie waĔnoĈci sesji
185
8.6. Testowanie podatnoĈci na wymuszenia sesji
188
8.7. Wysyäanie zäoĈliwych wartoĈci w plikach cookie
190
8.8. Przesyäanie na serwer zäoĈliwej zawartoĈci plików
192
8.9. Przesyäanie na serwer plików o zäoĈliwych nazwach
193
8.10. Przesyäanie wirusów do aplikacji
195
8.11. Parsowanie odpowiedzi za pomocñ skryptu Perla w celu sprawdzenia
odczytanych wartoĈci
197
8.12. Programowa edycja strony
198
8.13. Wykorzystanie wñtków do poprawy wydajnoĈci
200
9. Wyszukiwanie wad projektu ....................................................................................203
9.1. Pomijanie obowiñzkowych elementów nawigacji
204
9.2. Próby wykonywania uprzywilejowanych operacji
206
9.3. NaduĔywanie mechanizmu odzyskiwania haseä
207
9.4. NaduĔywanie äatwych do odgadniöcia identyfikatorów
209
9.5. Odgadywanie danych do uwierzytelniania
211
9.6. Wyszukiwanie liczb losowych w aplikacji
213
9.7. Testowanie liczb losowych
215
9.8. NaduĔywanie powtarzalnoĈci
217
9.9. NaduĔywanie operacji powodujñcych duĔe obciñĔenia
219
9.10. NaduĔywanie funkcji ograniczajñcych dostöp do aplikacji
221
9.11. NaduĔywanie sytuacji wyĈcigu
222
10. Ataki przeciwko aplikacjom AJAX ............................................................................225
10.1. Obserwacja Ĕñdaþ AJAX „na Ĕywo”
227
10.2. Identyfikacja kodu JavaScript w aplikacjach
228
10.3. ćledzenie operacji AJAX do poziomu kodu Ēródäowego
229
10.4. Przechwytywanie i modyfikowanie Ĕñdaþ AJAX
230
10.5. Przechwytywanie i modyfikowanie odpowiedzi serwera
232
10.6. Wstrzykiwanie danych do aplikacji AJAX
234
10.7. Wstrzykiwanie danych w formacie XML do aplikacji AJAX
236
10.8. Wstrzykiwanie danych w formacie JSON do aplikacji AJAX
237
10.9. Modyfikowanie stanu klienta
239
10.10. Sprawdzenie moĔliwoĈci dostöpu z innych domen
240
10.11. Odczytywanie prywatnych danych dziöki przechwytywaniu danych JSON 241
Spis tre
ļci _
9
11. Manipulowanie sesjami ...........................................................................................245
11.1. Wyszukiwanie identyfikatorów sesji w plikach cookie
246
11.2. Wyszukiwanie identyfikatorów sesji w Ĕñdaniach
248
11.3. Wyszukiwanie nagäówków autoryzacji
249
11.4. Analiza terminu waĔnoĈci sesji
252
11.5. Analiza identyfikatorów sesji za pomocñ programu Burp
256
11.6. Analiza losowoĈci sesji za pomocñ programu WebScarab
258
11.7. Zmiany sesji w celu unikniöcia ograniczeþ
262
11.8. Podszywanie siö pod innego uĔytkownika
264
11.9. Preparowanie sesji
265
11.10. Testowanie pod kñtem podatnoĈci na ataki CSRF
266
12. Testy wielostronne ....................................................................................................269
12.1. Wykradanie plików cookie za pomocñ ataków XSS
269
12.2. Tworzenie nakäadek za pomocñ ataków XSS
271
12.3. Tworzenie Ĕñdaþ HTTP za pomocñ ataków XSS
273
12.4. Interaktywne wykonywanie ataków XSS bazujñcych na modelu DOM
274
12.5. Pomijanie ograniczeþ däugoĈci pola (XSS)
276
12.6. Interaktywne przeprowadzanie ataków XST
277
12.7. Modyfikowanie nagäówka Host
279
12.8. Odgadywanie nazw uĔytkowników i haseä metodñ siäowñ
281
12.9. Interaktywne przeprowadzanie ataków wstrzykiwania kodu
w instrukcji wäñczania skryptów PHP
283
12.10. Tworzenie bomb dekompresji
285
12.11. Interaktywne przeprowadzanie ataków wstrzykiwania
poleceþ systemu operacyjnego
286
12.12. Systemowe przeprowadzanie ataków wstrzykiwania
poleceþ systemu operacyjnego
288
12.13. Interaktywne przeprowadzanie ataków wstrzykiwania instrukcji XPath
291
12.14. Interaktywne przeprowadzanie ataków wstrzykiwania SSI
293
12.15. Systemowe przeprowadzanie ataków wstrzykiwania SSI
294
12.16. Interaktywne przeprowadzanie ataków wstrzykiwania LDAP
296
12.17. Interaktywne przeprowadzanie ataków
wstrzykiwania zapisów w dziennikach
298
Skorowidz ................................................................................................................. 301
79
ROZDZIA
Ĥ 4.
Kodowanie danych w internecie
Je
Ĉli chodzi o obserwacjö,
los nagradza tylko przygotowane umys
äy.
— Louis Pasteur
Pomimo Ĕe aplikacje internetowe speäniajñ caäy szereg róĔnych funkcji, majñ róĔne wymagania
i oczekiwane zachowania, istniejñ podstawowe technologie i bloki budulcowe, które pojawiajñ
siö czöĈciej niĔ inne. JeĈli zapoznamy siö z tymi blokami budulcowymi i opanujemy je, bö-
dziemy dysponowaè uniwersalnymi narzödziami, które moĔna zastosowaè do róĔnych apli-
kacji internetowych, niezaleĔnie od specyficznego przeznaczenia aplikacji lub technologii uĔytych
do ich zaimplementowania.
Jednym z takich podstawowych bloków budulcowych jest kodowanie danych. W aplikacjach
internetowych pomiödzy serwerem WWW a przeglñdarkñ dane przesyäane sñ na wiele spo-
sobów. W zaleĔnoĈci od typu danych, wymagaþ systemu oraz preferencji okreĈlonego programi-
sty dane te mogñ byè zakodowane lub spakowane z wykorzystaniem wielu róĔnych formatów.
W celu przygotowania uĔytecznych przypadków testowych czösto trzeba zdekodowaè dane,
wykonaè na nich operacje i ponownie je zakodowaè. W szczególnie skomplikowanych sytu-
acjach trzeba przeliczyè prawidäowe wartoĈci testów integralnoĈci takie jak sumy kontrolne
lub skróty (ang. hash). Znakomita wiökszoĈè testów w Ĉrodowisku internetowym obejmuje mani-
pulowanie parametrami przekazywanymi pomiödzy serwerem a przeglñdarkñ. Zanim jednak
przystñpimy do wykonywania operacji z parametrami, powinniĈmy zrozumieè, w jaki sposób
sñ one pakowane i przesyäane.
W niniejszym rozdziale opowiemy o rozpoznawaniu, dekodowaniu i kodowaniu róĔnych
formatów: Base64, Base36, czasu Unix, kodowania URL, kodowania HTML i innych. Informacje
zamieszczone w niniejszym rozdziale nie majñ peäniè roli materiaäów referencyjnych (istnieje
wiele dobrych materiaäów na ten temat). Majñ one jedynie pomóc w rozpoznaniu podstawowych
formatów i sposobów manipulowania nimi. Dopiero gdy bödziemy mieli pewnoĈè, Ĕe aplika-
cja zinterpretuje dane wejĈciowe w sposób, jakiego siö spodziewamy, bödziemy mogli uwaĔ-
nie opracowaè testowe dane.
Typy parametrów, które bödziemy analizowaè, sñ wykorzystywane w wielu niezaleĔnych
miejscach podczas interakcji z aplikacjñ internetowñ. Mogñ to byè ukryte wartoĈci pól formularzy,
parametry GET przekazywane za poĈrednictwem adresów URL oraz wartoĈci w obröbie plików
80
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
cookie. Mogñ to byè krótkie informacje, na przykäad szeĈcioznakowy kod rabatu, lub rozbu-
dowane dane, na przykäad setki znaków o wewnötrznej wielowarstwowej strukturze. Tester
powinien przeprowadziè testy przypadków granicznych oraz testy negatywne dotyczñce in-
teresuj
ñcych przypadków. Nie moĔna jednak stwierdziè, co jest interesujñce, jeĈli siö nie ro-
zumie formatu danych. Trudno jest metodycznie wygenerowaè wartoĈci graniczne i dane te-
stowe, jeĈli nie zna siö struktury danych wejĈciowych. Na przykäad jeĔeli zobaczymy ciñg
dGVzdHVzZXI6dGVzdHB3MTIz
w nagäówku HTTP, moĔemy czuè pokusö, aby zmodyfikowaè
go w losowy sposób. Wystarczy jednak zdekodowaè ten ciñg za pomocñ dekodera Base64,
aby dowiedzieè siö, Ĕe kryje siö pod nim ciñg
testuser:testpw123
. W tym momencie Czy-
telnik powinien mieè znacznie lepsze rozeznanie na temat danych i wiedzieè, Ĕe naleĔy je
modyfikowaè zgodnie ze sposobem ich wykorzystania. Dziöki temu moĔna przygotowaè
prawidäowe przypadki testowe, które sñ wäaĈciwie ukierunkowane na dziaäanie aplikacji.
4.1. Rozpoznawanie binarnych reprezentacji danych
Problem
ZdekodowaliĈmy pewne dane w obröbie parametrów, pól wejĈciowych lub pliku danych i chce-
my przygotowaè dla nich wäaĈciwe przypadki testowe. PowinniĈmy okreĈliè, jakiego typu sñ
to dane, abyĈmy mogli przygotowaè dobre przypadki testowe pozwalajñce na manipulowa-
nie danymi w interesujñcy sposób.
Analizie poddamy nastöpujñce rodzaje danych:
x
szesnastkowe (Base16),
x
ósemkowe (Base8),
x
Base36.
Rozwi
ézanie
Dane szesnastkowe
W skäad cyfr szesnastkowych (Base16) wchodzñ znaki cyfr dziesiötnych 0 – 9 oraz litery A – F.
Czasami sñ pisane samymi wielkimi bñdĒ samymi maäymi literami. Rzadko jednak moĔna
spotkaè pisowniö, w której wielkoĈè tych liter jest mieszana. Wystöpowanie dowolnych liter,
które w alfabecie sñ za literñ F, oznacza, Ĕe nie mamy do czynienia z danymi Base16.
ChociaĔ informacje, które tu przedstawiamy, to komputerowy elementarz, warto go powtó-
rzyè w kontekĈcie testowania. KaĔdy bajt danych jest reprezentowany w wyniku przez dwa
znaki. Warto tu zwróciè uwagö na kilka szczególnych przypadków, na przykäad Ĕe ciñg
00
oznacza bajt o wartoĈci
0
, czyli
NULL
. Jest to jedna z naszych ulubionych wartoĈci granicznych
wykorzystywanych do testowania. Z kolei ciñg
FF
to
255
lub
–1
w zaleĔnoĈci od tego, czy
mamy do czynienia z wartoĈciñ ze znakiem, czy bez. To kolejna nasza ulubiona wartoĈè gra-
niczna. Do innych interesujñcych wartoĈci naleĔy
20
— kod ASCII znaku spacji oraz
41
—
kod ASCII wielkiej litery
A
. PowyĔej kodu ASCII
7F
nie ma drukowalnych znaków. W wiök-
szoĈci jözyków programowania wartoĈci szesnastkowe moĔna rozróĔniè po literach
0x
na po-
czñtku. JeĈli zobaczymy ciñg
0x24
, powinniĈmy instynktownie interpretowaè tö wartoĈè jako
4.1. Rozpoznawanie binarnych reprezentacji danych
_
81
liczbö szesnastkowñ. Inny popularny sposób reprezentacji wartoĈci szesnastkowych polega
na oddzieleniu poszczególnych bajtów dwukropkami. W ten sposób czösto przedstawiane sñ
sieciowe adresy MAC, wartoĈci MIB protokoäu SNMP, certyfikaty X.509, a takĔe inne proto-
koäy i struktury danych korzystajñce z kodowania ASN.1. Na przykäad adres MAC moĔna
przedstawiè w nastöpujñcy sposób:
00:16:00:89:0a:cf
. NaleĔy zwróciè uwagö na to, Ĕe nie-
którzy programiĈci pomijajñ niepotrzebne wiodñce zera. Zgodnie z tym powyĔszy adres MAC
moĔna przedstawiè w nastöpujñcy sposób:
0:16:0:89:a:cf
. ChociaĔ w takim ciñgu niektóre
dane sñ pojedynczymi cyframi, nie oznacza to, Ĕe nie jest to seria bajtów szesnastkowych.
Dane ósemkowe
Kodowanie ósemkowe — Base8 — jest stosunkowo rzadkie, ale od czasu do czasu moĔna
siö z nim spotkaè. W odróĔnieniu od innych rodzajów kodowania BaseX (16, 64, 36) w tym
przypadku wykorzystywanych jest mniej niĔ dziesiöè cyfr i w ogóle nie sñ uĔywane litery.
UĔywane sñ jedynie cyfry od 0 do 7. W jözykach programowania liczby ósemkowe sñ czösto
reprezentowane za pomocñ wiodñcego zera — na przykäad
017
to taka sama wartoĈè jak
15
dziesiötnie lub
0F
szesnastkowo. Nie naleĔy jednak zakäadaè, Ĕe wybrana liczba jest ósem-
kowa wyäñcznie na podstawie wiodñcego zera. Dane ósemkowe wystöpujñ zbyt rzadko, aby
na podstawie tej jednej wskazówki przyjmowaè takie zaäoĔenie. Wiodñce zera zwykle ozna-
czajñ staäy rozmiar pola i niewiele poza tym. Kluczowñ cechñ rozpoznawczñ danych ósem-
kowych jest to, Ĕe skäadajñ siö one z samych cyfr, z których Ĕadna nie jest wartoĈciñ wiökszñ
od 7. OczywiĈcie ciñg
00000001
równieĔ pasuje do tego opisu, choè raczej nie sñ to dane
ósemkowe. W rzeczywistoĈci powyĔszy ciñg moĔe byè zapisany z uĔyciem dowolnego ko-
dowania i nie ma to znaczenia.
1
zawsze oznacza
1
, niezaleĔnie od kodowania!
Base36
Base36 to rzadko spotykana hybryda pomiödzy kodowaniem Base16 a Base64. Podobnie jak
w przypadku Base16, cyfry rozpoczynajñ siö od 0, a za cyfrñ 9 sñ wykorzystywane w tej roli
litery alfabetu. Ostatniñ cyfrñ w tym przypadku nie jest jednak
F
. W skäad cyfr kodowania
Base36 wchodzi wszystkie dwadzieĈcia szeĈè liter, aĔ do
Z
. Jednak w odróĔnieniu od kodo-
wania Base64 wielkoĈè liter nie ma tu znaczenia oraz nie sñ wykorzystywane Ĕadne znaki
interpunkcyjne. A zatem jeĈli zobaczymy mieszankö liter i cyfr, gdzie wszystkie litery bödñ
wielkie bñdĒ maäe oraz gdzie bödñ wystöpowaäy litery alfabetu spoza
F
, bödzie to prawdo-
podobnie liczba zapisana z uĔyciem kodowania Base36.
Co powinni
ļmy wiedzieë o kodowaniu Base36?
NajwaĔniejszñ rzeczñ, którñ naleĔy wiedzieè o kodowaniu Base36, podobnie jak w przypad-
ku innych systemów liczenia, jest fakt, iĔ jest to liczba, pomimo Ĕe wyglñda jak dane. Pod-
czas wyszukiwania problemów zwiñzanych z przewidywalnymi i sekwencyjnymi identyfi-
katorami (omówimy je w recepturze 9.4) powinniĈmy pamiötaè, Ĕe nastöpna wartoĈè za
9X67DFR
to
9X67DFS
, natomiast o jeden niĔsza to
9X67DFQ
. KiedyĈ spotkaliĈmy siö ze skle-
pem internetowym, w którym dziöki manipulowaniu parametrami zapisanymi z wykorzy-
staniem kodowania Base36 przekazywanymi w adresie URL udaäo siö nam uzyskaè dziewiöè-
dziesiöcioprocentowy rabat!
82
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
Dyskusja
Znalezienie narzödzia do kodowania Base16 i Base8 jest bardzo proste. Do tego celu moĔna
posäuĔyè siö nawet prostym kalkulatorem w systemie Windows. Znalezienie narzödzia ko-
dowania (dekodowania) dla standardu Base36 jest jednak nieco trudniejsze.
4.2. Korzystanie z danych Base64
Problem
Kodowanie Base64 wypeänia bardzo szczególnñ niszö: pozwala na kodowanie danych binar-
nych, które sñ niedrukowalne lub nie sñ bezpieczne dla kanaäu, w którym sñ przesyäane. Da-
ne sñ kodowane do postaci stosunkowo nieczytelnej dla czäowieka i bezpiecznej do transmisji
za pomocñ wyäñcznie znaków alfanumerycznych i kilku znaków interpunkcyjnych. Czösto
moĔna spotkaè zäoĔone parametry zakodowane w Base64. W zwiñzku z tym bardzo potrzeb-
na jest umiejötnoĈè ich dekodowania, modyfikowania i ponownego kodowania.
Rozwi
ézanie
NaleĔy zainstalowaè OpenSSL w Ĉrodowisku Cygwin (w systemie Windows) lub upew-
niè siö, Ĕe mamy dostöp do polecenia
openssl
w przypadku korzystania z innego systemu
operacyjnego. Pakiet OpenSSL wystöpuje we wszystkich znanych dystrybucjach systemu
Linux i Mac OS X.
Dekodowanie ci
égu
% echo 'Q29uZ3JhdHVsYXRpb25zIQ==' | openssl base64 -d
Kodowanie ca
ĥej zawartoļci pliku
% openssl base64 -e -in input.txt -out input.b64
Wykonanie powyĔszego polecenia spowoduje umieszczenie wyniku zakodowanego w Base64
w pliku o nazwie input.b64.
Kodowanie prostego ci
égu znaków
% echo -n '&a=1&b=2&c=3' | openssl base64 -e
Dyskusja
Z kodowaniem Base64 moĔna siö spotkaè bardzo czösto. Wykorzystuje siö je w wielu na-
gäówkach HTTP (na przykäad w nagäówku
Authorization:
). TakĔe wiökszoĈè wartoĈci prze-
syäanych w plikach cookie jest kodowana za pomocñ Base64. RównieĔ wiele aplikacji koduje
zäoĔone parametry za pomocñ Base64. JeĈli zobaczymy kodowane dane, zwäaszcza zawiera-
jñce znaki równoĈci, najpierw powinniĈmy zaäoĔyè, Ĕe sñ to dane Base64.
4.2. Korzystanie z danych Base64
_
83
Zwróèmy uwagö na opcjö
-n
w instrukcji
echo
. W taki sposób wyäñcza siö dodawanie znaku
przejĈcia do nowego wiersza na koþcu ciñgu znaków przekazanego jako argument. JeĈli nie
wyäñczy siö dodawania znaku przejĈcia do nowego wiersza, stanie siö on czöĈciñ wyniku. W li-
stingu 4.1 zamieszczono dwa róĔne polecenia wraz z odpowiadajñcymi im wynikami dziaäania.
Listing 4.1. Wbudowane znaki przej
Ĉcia do nowego wiersza w ciñgach znaków zakodowanych z uĔyciem
standardu Base64
% echo -n '&a=1&b=2&c=3' | openssl base64 -e # Prawid
áowo.
JmE9MSZiPTImYz0z
% echo '&a=1&b=2&c=3' | openssl base64 -e # Nieprawid
áowo.
JmE9MSZiPTImYz0zCg==
Niebezpieczeþstwo wystöpuje takĔe wtedy, gdy wstawimy dane binarne do pliku, a nastöp-
nie skorzystamy z opcji
-in
w celu zakodowania caäego pliku. Prawie wszystkie edytory do-
dajñ znak przejĈcia do nowego wiersza na koþcu ostatniego wiersza w pliku. JeĈli nie o to nam
chodzi (poniewaĔ plik zawiera dane binarne), to powinniĈmy zachowaè szczególnñ ostroĔ-
noĈè podczas tworzenia danych wejĈciowych.
Dla wielu czytelników moĔe byè zaskakujñce to, Ĕe do kodowania danych z wykorzystaniem
Base64 uĔywamy OpenSSL, skoro wyraĒnie widaè, Ĕe nie ma tu SSL ani innego szyfrowania.
Polecenie
openssl
jest w pewnym sensie szwajcarskim noĔem wojskowym. Za jego pomocñ
moĔna wykonaè wiele operacji, nie tylko kryptograficznych.
Rozpoznawanie kodowania Base64
W kodowaniu Base64 wykorzystuje siö wszystkie znaki alfabetu, wielkie i maäe litery oraz
cyfry 0 – 9. W sumie daje to szeĈèdziesiñt dwa znaki. Ponadto wykorzystuje siö znaki plusa
(
+
) oraz ukoĈnika (
/
), co w sumie daje szeĈèdziesiñt cztery znaki. Znak równoĈci równieĔ na-
leĔy do zestawu dostöpnych znaków, ale dodaje siö go wyäñcznie na koþcu. Ciñgi zakodo-
wane w Base64 zawsze zawierajñ liczbö znaków podzielnñ przez 4. JeĈli dane wejĈciowe po
zakodowaniu nie zawierajñ liczby bajtów podzielnej przez 4, dodaje siö jeden lub kilka zna-
ków równoĈci (
=
), tak by uzyskaè liczbö znaków bödñcñ wielokrotnoĈciñ 4. Tak wiöc w ciñgu
zakodowanym w Base64 bödñ wystöpowaäy maksymalnie trzy znaki równoĈci, choè moĔe
ich tam nie byè wcale bñdĒ moĔe wystöpowaè tylko jeden lub dwa znaki. Co wiöcej, jest to
jedyne kodowanie, w którym wykorzystuje siö kombinacjö wielkich i maäych liter alfabetu.
NaleĔy pamiötaè o tym, Ĕe Base64 to kodowanie. Nie jest to szyfrowanie (poniewaĔ
moĔna je w prosty sposób odwróciè, bez koniecznoĈci wykorzystania specjalnych
kluczy). JeĈli zetkniemy siö z bardzo waĔnymi danymi (na przykäad poufnymi da-
nymi, danymi majñcymi wpäyw na bezpieczeþstwo, danymi do zarzñdzania pro-
gramami) zakodowanymi w Base64, powinniĈmy traktowaè je tak samo, jakby byäy zapi-
sane zwykäym tekstem. Biorñc to pod uwagö, Czytelnik moĔe zaäoĔyè swój czarny
hakerski kapelusz i zapytaè siebie, co zyskuje, potrafiñc czytaè zakodowane dane.
Zwróè równieĔ uwagö na to, Ĕe w danych zakodowanych w Base64 nie wykorzy-
stuje siö kompresji. Wröcz przeciwnie, zakodowane dane zawsze majñ wiökszñ ob-
jötoĈè od niezakodowanych. MoĔe to stwarzaè problemy, na przykäad podczas pro-
jektowania bazy danych. JeĈli zmienimy w programie sposób przechowywania
identyfikatorów uĔytkownika — z danych w postaci zwykäego tekstu (na przy-
käad o maksymalnym rozmiarze oĈmiu znaków) na dane zakodowane w Base64 —
bödziemy zmuszeni do zwiökszenia rozmiaru pola do dwunastu znaków. MoĔe to
mieè istotny wpäyw na projekt caäego systemu — jest to zatem dobre miejsce do
przeprowadzania testów zabezpieczeþ.
84
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
Inne narz
ýdzia
W tym przykäadzie posäuĔyliĈmy siö OpenSSL, poniewaĔ jest to program szybki, niewielki i äatwo
dostöpny. Kodowanie i dekodowanie w standardzie Base64 moĔna równieĔ z äatwoĈciñ wy-
konaè za pomocñ programu CAL9000. NaleĔy postöpowaè zgodnie z instrukcjami zamiesz-
czonymi w recepturze 4.5, ale wybraè Base64 jako typ kodowania lub dekodowania. TakĔe
w przypadku korzystania z programu CAL9000 powinniĈmy siö zabezpieczyè przed przy-
padkowym wklejaniem znaków przejĈcia do nowego wiersza w polach tekstowych.
MoĔna równieĔ skorzystaè z moduäu
MIME::Base64
dla jözyka Perl. ChociaĔ nie jest to mo-
duä standardowy, z pewnoĈciñ wiökszoĈè czytelników ma go w swoim systemie, poniewaĔ
instaluje siö on razem z moduäem LibWWWPerl, który omówimy w rozdziale 8.
4.3. Konwersja liczb zakodowanych w Base36
na stronie WWW
Problem
Potrzebujemy zakodowaè lub zdekodowaè liczby Base36, a nie chcemy pisaè w tym celu skryptu
lub programu. Sposób zaprezentowany w tej recepturze jest prawdopodobnie najäatwiejszym
sposobem okazjonalnej konwersji liczb zapisanych w róĔnych systemach kodowania.
Rozwi
ézanie
Brian Risk stworzyä demonstracyjny serwis WWW pod adresem http://www.geneffects.com/briarskin/
programming/newJSMathFuncs.html. MoĔna w nim przeprowadzaè dowolne konwersje z jednego
systemu kodowania na inny. Aby przeprowadziè konwersjö z kodowania Base10 na Base36
(lub odwrotnie), wystarczy wprowadziè wartoĈci podstaw systemów kodowania w odpo-
wiednich polach formularza. Przykäad konwersji duĔej liczby Base10 na Base36 pokazano na
rysunku 4.1. Aby przeprowadziè konwersjö z kodowania Base36 na Base10, wystarczy za-
mieniè wartoĈci
10
i
36
na stronie WWW.
Rysunek 4.1. Konwersja pomi
ödzy kodowaniem Base36 i Base10
4.5. Wykorzystanie danych kodowanych w URL
_
85
Dyskusja
Fakt, Ĕe konwersja jest wykonywana w przeglñdarce, nie oznacza, Ĕe w celu jej przepro-
wadzenia trzeba byè podäñczonym do internetu. MoĔna zapisaè kopiö tej strony na lokalnym
dysku twardym i zaäadowaè jñ w przeglñdarce w momencie, gdy zajdzie potrzeba wykonania
konwersji (analogicznie jak w przypadku programu CAL9000 — zobacz: receptura 4.5).
4.4. Korzystanie z danych Base36 w Perlu
Problem
Mamy potrzebö kodowania lub dekodowania duĔej iloĈci danych w standardzie Base36. Na
przykäad jest wiele liczb, które naleĔy poddaè konwersji, lub trzeba przeprowadziè progra-
mowe testowanie.
Rozwi
ézanie
SpoĈród narzödzi zaprezentowanych w niniejszej ksiñĔce do tego zadania najbardziej nadaje siö
Perl. Zawiera bibliotekö
Math::Base36
, którñ moĔna zainstalowaè za pomocñ repozytorium
CPAN lub z wykorzystaniem standardowej metody instalacji moduäów ActiveState (patrz: roz-
dziaä 2.). Sposób kodowania i dekodowania liczb w standardzie Base36 pokazano w listingu 4.2.
Listing 4.2. Skrypt Perl do konwersji liczb Base36
#!/usr/bin/perl
use Math::Base36 qw(:all);
my $base10num = 67325649178; # Po konwersji powinna przyj
ąü postaü UXFYBDM
my $base36num = "9FFGK4H"; # Po konwersji powinna przyj
ąü postaü 20524000481
my $newb36 = encode_base36( $base10num );
my $newb10 = decode_base36( $base36num );
print "b10 $base10num\t= b36 $newb36\n";
print "b36 $base36num\t= b10 $newb10\n";
Dyskusja
Wiöcej informacji na temat moduäu
Math::Base36
moĔna uzyskaè za pomocñ polecenia
perldoc
Math::Base36
. Jednñ z moĔliwoĈci, jakñ oferuje moduä, jest wypeänienie liczb dziesiötnych wio-
dñcymi zerami z lewej strony.
4.5. Wykorzystanie danych kodowanych w URL
Problem
W danych kodowanych w URL wykorzystuje siö znak
%
i cyfry szesnastkowe po to, by prze-
syäaè w adresie URL dane, których nie moĔna przesyäaè tam bezpoĈrednio. Kilka przykäadów
86
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
znaków tego typu to spacja, nawiasy trójkñtne (
<
i
>
) oraz ukoĈnik (
/
). JeĈli w aplikacji inter-
netowej wystöpujñ dane kodowane w URL (na przykäad w postaci parametrów, danych wej-
Ĉciowych lub kodu Ēródäowego), które chcemy zrozumieè bñdĒ przetworzyè, musimy najpierw
je zdekodowaè bñdĒ zakodowaè.
Rozwi
ézanie
NajproĈciej operacje te moĔna wykonaè za pomocñ programu CAL9000 grupy OWASP. Jest
to seria stron WWW w HTML, które wykorzystujñ JavaScript do wykonywania podstawo-
wych obliczeþ. Za ich pomocñ moĔna interaktywnie kopiowaè i wklejaè dane oraz kodowaè
je i dekodowaè na Ĕñdanie.
Kodowanie
NaleĔy wprowadziè zdekodowane dane w polu Plain Text, a nastöpnie kliknñè opcjö Url (%XX)
znajdujñcñ siö z lewej strony w obszarze Select Encoding Type. Ekran aplikacji z wynikami tej ope-
racji pokazano na rysunku 4.2.
Rysunek 4.2. Kodowanie URL za pomoc
ñ narzödzia CAL9000
Dekodowanie
NaleĔy wprowadziè zakodowane dane w polu Encoded Text, a nastöpnie kliknñè opcjö Url
(%XX) znajdujñcñ siö z lewej strony w obszarze Select Decoding Type. Ekran aplikacji z wynikami
tej operacji pokazano na rysunku 4.3.
4.5. Wykorzystanie danych kodowanych w URL
_
87
Rysunek 4.3. Dekodowanie danych zakodowanych w URL za pomoc
ñ narzödzia CAL9000
Dyskusja
Dane kodowane wewnñtrz adresu URL powinny byè znane wszystkim osobom, które kiedy-
kolwiek oglñdaäy kod Ēródäowy HTML lub dowolne dane przesyäane z przeglñdarki WWW
do serwera WWW. Ten sposób kodowania zapisano w dokumencie RFC 1738 (ftp://ftp.isi.edu/
in-notes/rfc1738.txt). Standard ten nie wymaga kodowania niektórych znaków ASCII. Warto
zwróciè uwagö na to, Ĕe chociaĔ nie jest to obowiñzkowe, nic nie stoi na przeszkodzie, by kodo-
waè te znaki. Przykäad pokazano w zakodowanych danych na rysunku 4.3. Nadmiarowe ko-
dowanie to jeden ze sposobów, w jaki napastnicy maskujñ zäoĈliwe dane wejĈciowe. Nieskompli-
kowane systemy „czarnych list” sprawdzajñce wystöpowanie ciñgu
<script>
lub nawet
%3cscript%3e
mogñ nie zauwaĔyè ciñgu
%3c%73%63%72%69%70%74%3e
, który oznacza dokäadnie
to samo co dwa poprzednie.
Jednñ z doskonaäych wäasnoĈci programu CAL9000 jest fakt, iĔ w rzeczywistoĈci nie jest to
program. Jest to raczej kolekcja stron WWW zawierajñcych osadzony kod JavaScript. Nawet
jeĈli w jakiejĈ firmie jest stosowana drakoþska polityka zabraniajñca instalowania czegokol-
wiek na stacjach roboczych, moĔna przecieĔ otworzyè strony WWW w przeglñdarce i uruchomiè
odpowiednie funkcje. Strony WWW moĔna bez trudu zapisaè na dysku USB i zaäadowaè je
bezpoĈrednio z niego, dziöki czemu nie ma potrzeby instalowania czegokolwiek.
88
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
4.6. Wykorzystywanie danych w formacie encji HTML
Problem
Specyfikacja HTML zapewnia sposób kodowania znaków o specjalnym znaczeniu, tak by nie
byäy interpretowane jako HTML, JavaScript czy innego rodzaju polecenia. Aby moĔna byäo
generowaè przypadki testowe i przeprowadzaè potencjalne ataki, trzeba umieè kodowaè i deko-
dowaè dane zgodnie z tym standardem.
Rozwi
ézanie
Kodowanie i dekodowanie tego typu najäatwiej przeprowadziè za pomocñ narzödzia CAL9000.
Nie bödziemy tu zamieszczaè szczegóäowych instrukcji posäugiwania siö programem CAL9000,
poniewaĔ jest to narzödzie, którego uĔywa siö w doĈè prosty sposób. Szczegóäowe informacje
na ten temat moĔna znaleĒè w recepturze 4.5.
W celu zakodowania specjalnych znaków naleĔy wprowadziè specjalne znaki w polu Plain
Text i wybraè swoje kodowanie. W polu Trailing Characters w programie CAL9000 naleĔy
wprowadziè Ĉrednik (
;
).
Dekodowanie znaków zakodowanych w postaci encji HTML wykonuje siö tak samo, ale w od-
wróconej kolejnoĈci. NaleĔy wpisaè lub wkleiè zakodowane dane w polu Encoded Text, a nastöp-
nie kliknñè opcjö HTML Entity znajdujñcñ siö z lewej strony, w obszarze Select Decoding Type.
Dyskusja
Kodowanie za pomocñ encji HTML to obszar, w którym moĔna popeäniè wiele potencjalnych
pomyäek. W naszej pracy spotykaliĈmy siö z wieloma przypadkami, w których w pewnych
miejscach aplikacji stosowano kodowanie encji HTML (na przykäad znak ampersand byä ko-
dowany jako
&amp;
), a w innych nie. WaĔne jest nie tylko to, aby kodowanie byäo wy-
konywane prawidäowo. Okazuje siö, Ĕe ze wzglödu na wystöpowanie wielu odmian kodo-
wania encji HTML napisanie aplikacji internetowej, która wäaĈciwie obsäuguje kodowanie,
jest bardzo trudne.
Ró
żne odmiany encji HTML
Istnieje co najmniej piöè lub szeĈè prawidäowych i stosunkowo dobrze znanych sposobów
kodowania tego samego znaku za pomocñ encji HTML. Kilka moĔliwoĈci kodowania tego
samego znaku — symbolu „mniejszy niĔ” (
<
) — zaprezentowano w tabeli 4.1.
Tabela 4.1. Ró
Ĕne odmiany kodowania encji
Odmiana kodowania
Zakodowany znak
Encje identyfikowane przez nazw
ý
<
Warto
ļci dziesiýtne (ASCII lub ISO-8859-1)
<
Warto
ļci szesnastkowe (ASCII lub ISO-8859-1)
<
Warto
ļci szesnastkowe (dĥuga liczba caĥkowita)
<
Warto
ļci szesnastkowe (liczby caĥkowite szeļëdziesiýcioczterobitowe)
<
4.7. Wyliczanie skrótów
_
89
Istnieje nawet kilka dodatkowych metod kodowania specyficznych dla przeglñdarki Internet
Explorer. Z punktu widzenia moĔliwoĈci testowania, jeĈli mamy do przetestowania wartoĈci
graniczne lub specjalne, mamy do sprawdzenia co najmniej szeĈè do oĈmiu permutacji: dwie
lub trzy wersje kodowania w adresie URL oraz cztery lub piöè wersji kodowania za pomocñ
encji HTML.
Diabe
ĥ tkwi w szczegóĥach
Obsäuga kodowania jest bardzo trudna dla programisty aplikacji z wielu powodów. Na przykäad
wystöpuje wiele róĔnych miejsc, w których trzeba wykonywaè kodowanie i dekodowanie,
oraz istnieje wiele niezwiñzanych ze sobñ komponentów, które wykonujñ funkcje kodowania
i dekodowania. WeĒmy pod uwagö przypadek najbardziej popularny — proste Ĕñdanie
GET
.
W pierwszej kolejnoĈci kodowaniem danych zajmuje siö przeglñdarka WWW. Przeglñdarki
róĔniñ siö jednak pomiödzy sobñ kilkoma szczegóäami. Nastöpnie serwer WWW (na przy-
käad IIS lub Apache) wykonuje kodowanie na danych wchodzñcych w stosunku do tych
znaków, które nie zostaäy zakodowane przez przeglñdarkö WWW. W dalszej kolejnoĈci na
kaĔdej platformie, na której uruchamiany jest kod, podejmowane sñ próby interpretacji, ko-
dowania lub dekodowania niektórych strumieni danych. Na przykäad w Ĉrodowiskach we-
bowych .Net i Java kodowanie URL i encje HTML sñ w wiökszoĈci obsäugiwane niejawnie.
Na koniec sama aplikacja moĔe kodowaè bñdĒ dekodowaè dane zapisane w bazie danych,
pliku lub pamiöci trwaäej innego rodzaju. Próba zapewnienia tego, aby dane pozostawaäy
zakodowane w prawidäowej formie w caäej sekwencji wywoäaþ (od przeglñdarki do aplikacji),
jest, mówiñc najbardziej ogólnie, bardzo trudna. Równie trudna jest analiza przyczyn wy-
stñpienia problemów.
4.7. Wyliczanie skrótów
Problem
Kiedy aplikacja korzysta ze skrótów (ang. hash), sum kontrolnych lub innych sposobów kontroli
integralnoĈci danych, trzeba umieè je rozpoznawaè i ewentualnie je wyliczaè w odniesieniu do
danych testowych. Osobom, dla których pojöcie skrótów nie jest znane, polecam zapoznanie
siö z ramkñ „Czym sñ skróty?” w dalszej czöĈci tego rozdziaäu.
Rozwi
ézanie
Tak jak w przypadku innych zadaþ zwiñzanych z kodowaniem, do wyboru mamy co najmniej
trzy dobre moĔliwoĈci: OpenSSL, CAL9000 i Perl.
MD5
% echo -n "my data" | openssl md5
c:\> type myfile.txt | openssl md5
90
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
SHA-1
#/usr/bin/perl
use Digest::SHA1 qw(sha1);
$data = "my data";
$digest = sha1($data);
print "$digest\n";
Czym s
é skróty
Skrót to jednokierunkowe przeksztaäcenie matematyczne. NiezaleĔnie od iloĈci danych wej-
Ĉciowych wynik ma zawsze taki sam rozmiar. Skróty silne pod wzglödem kryptograficznym
— takich uĔywa siö w wiökszoĈci istotnych funkcji zabezpieczeþ — charakteryzujñ siö kilkoma
waĔnymi wäaĈciwoĈciami:
x
odpornoĈciñ na odgadniöcie przeciwobrazu (ang. preimage resistance): dla kogoĈ, kto
wejdzie w posiadanie skrótu, znalezienie dokumentu bñdĒ danych wejĈciowych, które
generujñ ten skrót, powinno byè trudne;
x
odpornoĈciñ na kolizje: dysponujñc okreĈlonym dokumentem lub danymi wejĈciowymi
powinno byè trudne znalezienie innego dokumentu lub danych wejĈciowych, które
generujñ taki sam skrót.
W obydwu tych wäaĈciwoĈciach mówimy, Ĕe wykonanie okreĈlonej operacji powinno byè
„trudne”. Oznacza to, Ĕe pomimo iĔ jest to teoretycznie moĔliwe, powinno byè to na tyle
czasochäonne i na tyle maäo prawdopodobne, aby napastnik zrezygnowaä z danej wäaĈciwo-
Ĉci skrótu do przeprowadzenia praktycznego ataku.
Dyskusja
Skróty MD5 zaprezentowano z wykorzystaniem pakietu OpenSSL w systemie Unix lub Win-
dows. W OpenSSL jest równieĔ funkcja
sha1
obsäugujñca skróty SHA-1. Zwróèmy uwagö na
koniecznoĈè uĔycia opcji
-n
w uniksowej instrukcji
echo
, aby zabezpieczyè siö przed doda-
waniem znaku przejĈcia do nowego wiersza na koþcu danych. ChociaĔ w systemie Windows
równieĔ wystöpuje polecenie
echo
, nie moĔna wykorzystywaè go tak samo jak w Ĉrodowisku
Unix, poniewaĔ nie pozwala ono na pomijanie zestawu znaków CR/LF na koþcu komunikatu
przekazywanego do niego w formie argumentu.
Przypadek zastosowania skrótów SHA-1 zaprezentowano na przykäadzie skryptu Perla ko-
rzystajñcego z moduäu
Digest::SHA1
. W Perlu jest równieĔ moduä
Digest::MD5
, który dziaäa
tak samo dla skrótów MD5.
Zwróè uwagö na to, Ĕe nie ma moĔliwoĈci dekodowania skrótów. Skróty sñ przeksztaäcenia-
mi matematycznymi, które dziaäajñ tylko w jednñ stronö. NiezaleĔnie od iloĈci danych wej-
Ĉciowych wynik ma zawsze taki sam rozmiar.
Skróty MD5
Skróty MD5 generujñ dokäadnie 128 bitów (16 bajtów) danych. Skróty MD5 moĔna zapre-
zentowaè na kilka róĔnych sposobów:
4.8. Rozpoznawanie formatów czasowych
_
91
32 cyfry szesnastkowe
df02589a2e826924a5c0b94ae4335329
24 znaki Base64
PlnPFeQx5Jj+uwRfh//RSw==
. W takiej postaci skróty MD5 wystöpujñ w przypadku, gdy
skrót MD5 w postaci binarnej (128 bitów binarnych) zostanie zakodowanych w standar-
dzie Base64.
Skróty SHA-1
Skróty SHA-1 zawsze generujñ dokäadnie 160 bitów (20 bajtów) danych. Podobnie jak w przy-
padku skrótów MD5, moĔna je zaprezentowaè na kilka róĔnych sposobów:
40 cyfr szesnastkowych
bc93f9c45642995b5566e64742de38563b365a1e
28 znaków Base64
9EkBWUsXoiwtICqaZp2+VbZaZdI=
Skróty a bezpiecze
ħstwo
Czöstym bäödem w zabezpieczeniach aplikacji jest zaäoĔenie, Ĕe zapisywanie lub przesyäanie
haseä w postaci skrótów jest bezpieczne. Skróty sñ równieĔ czösto wykorzystywane w odnie-
sieniu do kart kredytowych, numerów NIP oraz innych prywatnych danych. Problem z ta-
kim podejĈciem z punktu widzenia bezpieczeþstwa polega na tym, Ĕe skrótów moĔna uĔyè
w taki sam sposób jak haseä, które one reprezentujñ. JeĈli do uwierzytelniania aplikacji wy-
korzystuje siö identyfikator uĔytkownika oraz skrót SHA-1 hasäa, aplikacja w dalszym ciñgu
moĔe byè naraĔona na niebezpieczeþstwo. Do uwierzytelnienia napastnikowi moĔe wystar-
czyè przechwycenie i uĔycie skrótu hasäa (choè same hasäo pozostanie dla niego tajemnicñ).
NaleĔy podchodziè sceptycznie do skrótów haseä bñdĒ innych wraĔliwych informacji. Czösto
napastnik nie musi znaè informacji w postaci zwykäego tekstu — wystarczy, Ĕe przechwyci
skrót hasäa i odpowiednio go uĔyje.
4.8. Rozpoznawanie formatów czasowych
Problem
Czas moĔe byè reprezentowany na wiele róĔnych sposobów. UmiejötnoĈè rozpoznawania re-
prezentacji czasu pozwala na budowanie lepszych przypadków testowych. W pisaniu ukierun-
kowanych przypadków testowych pomaga nie tylko umiejötnoĈè rozpoznania, Ĕe okreĈlone
dane oznaczajñ czas, ale takĔe znajomoĈè podstawowych zaäoĔeþ, jakie przyjñä programista
podczas pisania kodu.
Rozwi
ézanie
W najbardziej oczywistych formatach czasowych jest kodowany rok, miesiñc i dzieþ. Dane te
wystöpujñ w popularnych ukäadach, przy czym rok jest reprezentowany za pomocñ dwóch lub
czterech cyfr. W niektórych formatach czasu wystöpujñ godziny, minuty i sekundy, a czasami
92
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
dziesiñte czöĈci sekund i milisekundy. Kilka reprezentacji daty 1 czerwca 2008, 17:32:11 i 844
milisekundy pokazano w tabeli 4.2. W niektórych formatach okreĈlone czöĈci daty bñdĒ godziny
nie sñ reprezentowane. Te fragmenty sñ pomijane.
Tabela 4.2. Ró
Ĕne reprezentacje czasu
Kodowanie
Przyk
ĥadowy wynik
YYYYMMDDhhmmss.sss
20080601173211.844
YYMMDDhhmm
0806011732
Czas Unix (liczba sekund od 1 stycznia 1970)
1212355931
POSIX wg standardu „C”
Nie 1 Cze 17:32:11 2008
Dyskusja
Na pozór moĔna by sñdziè, Ĕe rozpoznawanie czasu jest doĈè oczywistñ umiejötnoĈciñ i nie
jest waĔne dla kogoĈ, kto testuje aplikacje internetowe. JesteĈmy zdania, Ĕe jest to bardzo
waĔne. SpotykaliĈmy siö z wieloma aplikacjami, gdzie projektanci uwaĔali czas za informa-
cjö, której nie da siö odgadnñè. UĔywano go w identyfikatorach sesji, tymczasowych nazwach
plików, tymczasowych hasäach i numerach kont. Osoba przeprowadzajñca symulowane ataki
powinna wiedzieè, Ĕe czasu nie wolno uznaè za nieprzewidywalny. Planujñc „interesujñce”
przypadki testowe dla okreĈlonego pola wejĈciowego, moĔna znacznie zawöziè zbiór do-
puszczalnych wartoĈci testowych, jeĈli siö wie, Ĕe informacje te dotyczñ czasu z niedawnej
przeszäoĈci lub z najbliĔszej przyszäoĈci.
Milisekundy a losowo
ļë
Nie dajmy siö nikomu przekonaè, Ĕe wartoĈci wyraĔone w milisekundach sñ nieprzewidywalne.
Intuicyjnie moĔna oczekiwaè, Ĕe nikt nie bödzie w stanie przewidzieè, kiedy uĔytkownik przeĈle
Ĕñdanie do serwera WWW. W zwiñzku z tym, jeĔeli program czyta zegar i wyodröbnia z tej
wartoĈci tylko milisekundy, kaĔda z tysiñca moĔliwoĈci (0 – 999) powinna byè jednakowo
prawdopodobna. Intuicja podpowiada nam „tak”, ale prawdziwa odpowiedĒ brzmi „nie”.
Okazuje siö, Ĕe niektóre wartoĈci sñ znacznie bardziej prawdopodobne od innych. Z róĔnych
wzglödów (na przykäad dokäadnoĈè odmierzania odcinków czasu przez jñdro systemu ope-
racyjnego — zarówno Unix, jak i Windows — dokäadnoĈè zegara, przerwania i wiele innych)
zegar jest bardzo zäym generatorem liczb losowych. Znacznie dokäadniejszy opis tego zjawi-
ska zamieszczono w rozdziale 10. ksiñĔki autorstwa Johna Viega i Gary’ego McGrawa Building
Secure Software (Addison-Wesley).
Tester nie powinien ufaè Ĕadnemu systemowi oprogramowania, który do generowania lo-
sowych wartoĈci wykorzystuje czas. JeĈli odkryjemy takie elementy w testowanych pro-
gramach, powinniĈmy natychmiast rozwaĔaè takie kwestie jak: „A co siö stanie, jeĈli komuĈ
uda siö odgadnñè tö wartoĈè” lub „Jak zachowa siö aplikacja, jeĈli dwie pozornie losowe
wartoĈci okaĔñ siö takie same?”.
4.9. Programowe kodowanie warto
ļci oznaczajécych czas
_
93
4.9. Programowe kodowanie warto
ļci oznaczajécych czas
Problem
UstaliliĈmy, Ĕe w naszej aplikacji jest wykorzystywany czas w interesujñcy sposób. Chcemy teraz
wygenerowaè specyficzne wartoĈci w specyficznych formatach.
Rozwi
ézanie
Do wykonania tego zadania idealnie nadaje siö Perl. Do wykonywania operacji na warto-
Ĉciach czasu w formacie systemu Unix bödziemy potrzebowali moduäu
Time::Local
. Bödzie
nam równieĔ potrzebny moduä
POSIX
, który udostöpnia funkcjö
strftime
. Oba sñ moduäami
standardowymi. W listingu 4.3 zaprezentowano cztery róĔne formaty czasu i sposoby mani-
pulowania nimi.
Listing 4.3. Kodowanie ró
Ĕnych wartoĈci czasowych w Perlu
#!/usr/bin/perl
use Time::Local;
use POSIX qw(strftime);
# 1 czerwca 2008, 17:32:11 i 844 milisekundy .
$year = 2008;
$month = 5; # Miesi
ące są numerowane, począwszy od 0!
$day = 1;
$hour = 17; # w celu zapewnienia lepszej czytelno
Łci skorzystamy z 24-godzinnego
zegara
$min = 32;
$sec = 11;
$msec = 844;
# Czas w formacie UNIX (liczba sekund od 1 stycznia 1970 roku) 1212355931
$unixtime = timelocal( $sec, $min, $hour, $day, $month, $year );
print "UNIX\t\t\t$unixtime\n";
# Wype
ániamy danymi kilka wartoĞci (wday, yday, isdst), które bĊdą potrzebne do wykonania funkcji strftime.
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($unixtime);
# YYYYMMDDhhmmss.sss 20080601173211.844
# Wykorzystujemy funkcj
Ċ strftime(), poniewaĪ uwzglĊdnia ona numerowanie miesiĊcy od zera, które jest typowe dla Perla.
$timestring = strftime( "%Y%m%d%H%M%S",
$sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst );
$timestring .= ".$msec";
print "YYYYMMDDhhmmss.sss\t$timestring\n";
# YYMMDDhhmm 0806011732
$timestring = strftime( "%y%m%d%H%M",
$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst );
print "YYMMDDhhmm\t\t$timestring\n";
# POSIX wed
áug standardu jĊzyka "C" Nie Cze 1 17:32:11 2008
$gmtime = localtime($unixtime);
print "POSIX\t\t\t$gmtime\n";
94
_
Rozdzia
ĥ 4. Kodowanie danych w internecie
Dyskusja
Aby dowiedzieè siö wiöcej na temat moĔliwych sposobów formatowania czasu, moĔna sko-
rzystaè z poleceþ
perldoc
Time::Local
lub
man strftime
.
OsobliwoĈci obsäugi czasu w Perlu
ChociaĔ Perl jest bardzo elastyczny i z caäñ pewnoĈciñ jest dobrym narzödziem do
wykonywania tego zadania, charakteryzuje siö pewnymi osobliwoĈciami. Podczas
wykonywania operacji na wartoĈciach czasowych podobnych do tych, które poka-
zaliĈmy w powyĔszym przykäadzie, naleĔy zwróciè szczególnñ uwagö na wartoĈci
miesiöcy. Z pewnych trudnych do wyjaĈnienia powodów liczenie miesiöcy rozpo-
czyna siö od 0. Zgodnie z tym styczniowi odpowiada liczba 0, natomiast lutemu 1.
WäaĈciwoĈè ta nie dotyczy dni. Pierwszy dzieþ miesiñca ma numer 1. Co wiöcej, na-
leĔy zwróciè uwagö na sposób kodowania roku. Numer roku odpowiada liczbie lat,
które upäynöäy od roku 1900. Tak wiöc dla roku 1999 wartoĈè ta wynosi 99, nato-
miast dla roku 2008 jest to liczba 108. Aby uzyskaè prawidäowy numer roku, do tej
wartoĈci naleĔy dodaè 1900. Pomimo caäego szumu wokóä roku 2000 w dalszym ciñgu
moĔna spotkaè serwisy WWW, które pokazujñ daty typu 28-06-108.
4.10. Dekodowanie warto
ļci ViewState jýzyka ASP.NET
Problem
Jözyk ASP.NET dostarcza mechanizmu, dziöki któremu stan moĔe byè zapisywany po stronie
klienta zamiast po stronie serwera. Przeglñdarka WWW moĔe przesyäaè z kaĔdym Ĕñdaniem
jako pola formularzy nawet stosunkowo rozbudowane obiekty opisu stanu (po kilka kilo-
bajtów). Mechanizm ten nosi nazwö ViewState. Obiekt opisu stanu jest przechowywany jako
pole wejĈciowe formularza
__VIEWSTATE
. JeĈli aplikacja korzysta z mechanizmu ViewState, to
naleĔy przeanalizowaè sposób, w jaki informacje przekazane tñ drogñ sñ wykorzystywane
przez logikö reguä biznesu, i opracowaè testy obejmujñce wykorzystanie zmodyfikowanych
danych ViewState. Aby moĔna byäo opracowywaè testy wokóä zmodyfikowanych danych
ViewState, trzeba zrozumieè sposób posäugiwania siö danymi ViewState w aplikacji.
Rozwi
ézanie
NaleĔy pobraè aplikacjö ViewState Decoder z witryny Fritz Onion (http://www.pluralsight.com/
tools.aspx). Najprostszy sposób jej uĔycia polega na skopiowaniu adresu URL aplikacji (lub okre-
Ĉlonej strony) do adresu URL. Na rysunku 4.4 pokazano zrzut z ekranu pochodzñcy z wersji
2.1 aplikacji ViewState Decoder oraz niewielki fragment wyniku jej dziaäania.
Dyskusja
Czasami programowi nie udaje siö pobraè informacji ViewState ze strony WWW. W rzeczywisto-
Ĉci nie jest to duĔy problem. Wystarczy przejrzeè Ēródäo strony WWW (patrz: receptura 3.2)
i poszukaè ciñgu
<input type= "hidden" name="__VIEWSTATE"…>
. NaleĔy skopiowaè wartoĈè
tego pola wejĈciowego i wkleiè do dekodera.
4.10. Dekodowanie warto
ļci ViewState jýzyka ASP.NET
_
95
Rysunek 4.4. Dekodowanie danych przesy
äanych za pomocñ mechanizmu ViewState jözyka ASP.NET
Gdyby w przykäadzie pokazanym na rysunku 4.4 byäa nasza aplikacja, moĔna by na tej podsta-
wie znaleĒè kilka potencjalnych ĈcieĔek testowania. W danych ViewState sñ adresy URL. Czy
mogñ one zawieraè kod JavaScript lub kierowaè uĔytkownika do innego, zäoĈliwego serwisu
WWW? A co z róĔnymi liczbami caäkowitymi?
JeĈli aplikacja wykorzystuje ASP.NET i mechanizm ViewState, naleĔy odpowiedzieè sobie na
kilka istotnych pytaþ:
x
Czy jakiekolwiek dane z pola ViewState sñ wstawiane do adresu URL lub kodu HTML
strony w czasie, gdy serwer jñ przetwarza?
Zwróèmy uwagö na adresy URL widoczne na rysunku 4.4. Co by siö staäo, gdyby äñcza na-
wigacyjne do strony w tej aplikacji pochodziäy z danych ViewState? Czy haker zdoäaäby na-
käoniè kogoĈ do wizyty w zäoĈliwym serwisie WWW poprzez wysäanie mu „skaĔonych”
informacji ViewState?
x
Czy pole ViewState jest zabezpieczone przed moĔliwoĈciñ modyfikowania?
ASP.NET dostarcza kilku sposobów zabezpieczania pola ViewState. Jeden z nich to zastoso-
wanie prostego skrótu. Dziöki niemu serwer moĔe wykryè sytuacjö wyjñtkowñ w przy-
padku nieoczekiwanej modyfikacji pola ViewState. Drugi to zastosowanie mechanizmu