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:

szesnastkowe (Base16),

ósemkowe (Base8),

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:

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;

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

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?

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