informatyka testowanie bezpieczenstwa aplikacji internetowych receptury paco hope ebook

background image

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!

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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!

background image

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.

background image

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þ.

background image

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

background image

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

background image

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.

background image

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.

background image

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;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.

ż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

ý

&lt;

Warto

ļci dziesiýtne (ASCII lub ISO-8859-1)

&#60;

Warto

ļci szesnastkowe (ASCII lub ISO-8859-1)

&#x3c;

Warto

ļci szesnastkowe (dĥuga liczba caĥkowita)

&#x003c;

Warto

ļci szesnastkowe (liczby caĥkowite szeļëdziesiýcioczterobitowe)

&#x0000003c;

background image

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

background image

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:

background image

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

background image

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?”.

background image

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";

background image

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.

background image

Czytaj dalej...

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


Wyszukiwarka

Podobne podstrony:
Testowanie bezpieczenstwa aplikacji internetowych Receptury
Paco Hope, Ben Walther Testowanie bezpieczeästwa aplikacji internetowych
informatyka ajax bezpieczne aplikacje internetowe christopher wells ebook
pai5, Studia PŚK informatyka, Semestr 5, Projektowanie aplikacji internetowych 1, laborki
Bezpieczne aplikacje internetowe
Ajax Bezpieczne aplikacje internetowe ajabez
Ajax Bezpieczne aplikacje internetowe
informatyka php5 bezpieczne programowanie leksykon kieszonkowy jacek ross ebook

więcej podobnych podstron