Diplomski rad br. 1783
Penetracijsko ispitivanje sigurnosti Web primjenskih programa
Ivan Tomić 0036399500 | FER | ZEMRIS | HOME |

5. Automatizirano ispitivanje ranjivosti Web aplikacija na SQL ubacivanje

Glavni korak penetracijskog ispitivanja sigurnosti Web aplikacije je otkrivanje ranjivosti. Prije otkrivanja nepoznatih ranjivosti, potrebno je provjeriti sadrži li Web aplikacija neku od već pronađenih i objavljenih ranjivosti. Prilikom penetracijskog ispitivanja određenog tipa Web aplikacija posebno treba obratiti pažnju na to postoji li već lista pronađenih ranjivosti. Web aplikacije za koje obično postoji lista pronađenih ranjivosti su komercijalne Web aplikacije i Web aplikacije otvorenoga koda.

Pronađene ranjivosti obično se objavljuju na Internetu u obliku CVE (Common Vulnerabilities and Exposures) baza ranjivosti. Neke od organizacija i Web stranica koje objavljuju pronađene ranjivosti, između ostaloga i pronađene ranjivosti Web aplikacija su:

  • SecurityFocus (http://www.securityfocus.com),
  • milw0rm (http://www.milw0rm.com),
  • Packet Storm (http://packetstormsecurity.org),
  • MITRE Corporation CVE (http://cve.mitre.org),
  • NIST National Vulnerability Database (http://nvd.nist.gov),
  • ISS X-Force (http://xforce.iss.net) i
  • CERT vulnerability notes (http://www.kb.cert.org/vuls).

Sigurnosni stručnjaci ispitivanjem ponašanja Web aplikacija i/ili analizom programskog koda Web aplikacija pronalaze ranjivosti, koje potom objavljuju na spomenutim Web stranicama. Opis ranjivosti obično sadrži vrstu Web aplikacije koja je ranjiva, te detaljan opis pronađene ranjivosti. Detaljno se opisuje pronađena ranjivost, daje se opis ranjivog dijela Web aplikacije, opisuje se postupak iskorištavanja pronađene ranjivosti, te obično se opisuje kakav utjecaj ranjivost ima na sigurnost Web aplikacije. Iskorištavanje ranjivosti obično se svodi na prosljeđivanje posebno generiranog niza znakova ranjivom parametru Web aplikacije, donosno na slanje posebno generiranog HTTP zahtjeva. Pri tome se obično koristi GET ili POST metoda za slanje podataka, ovisno o vrsti ranjivog parametra. U objavljenom postupku iskorištavanja pronađene ranjivosti obično se opisuju točni koraci koje je potrebno provesti kako bi se iskoristila pronađena ranjivost, odnosno daje se exploit za iskorištavanje pronađene ranjivosti Web aplikacije.

Za većinu Web aplikacija otvorenoga koda postoji lista pronađenih ranjivosti, pa tako i za CMS sustave spomenute u prethodnom poglavlju. Jedna od najčešćih ranjivosti CMS sustava je ranjivost na SQL ubacivanje. Ranjiva je obično neka instalirana komponenta unutar CMS sustava. Ranjivost se javlja zbog nedovoljne kontrole korisničkog unosa, odnosno dopušta se da korisnik kao vrijednost parametra proslijediti proizvoljan znakovni niz. Kako su te komponente dio CMS sustava, iskorištavanjem ranjivosti tih komponenti kompromitira se i cijeli CMS sustav. Iskorištavanje takvih ranjivosti obično se svodi na slanje posebno modificiranog HTTP GET ili POST zahtjeva, ovisno o vrsti ranjivog parametra. Jedan od uobičajenih načina iskorištavanja ranjivosti komponenata na SQL ubacivanje je korištenje UNION operatora. Korištenjem UNION operatora omogućava se da se proizvoljan SQL upit nadoveže na već postojeći SQL upit, te da se na taj način dođe do željenih podataka iz baze podataka. Klasičan primjer iskorištavanja ranjivosti komponente na SQL ubacivanje prikazan je na slici 5.1. Napadački niz prikazan u primjeru može se podijeliti na nekoliko dijelova, a to su:

  • relativan URL do ranjive skripte (komponente) sa svim potrebnim parametrima (/index.php?option=com_tech_article&Itemid=17&task=item),
  • parametar koji je ranjiv na SQL ubacivanje (item) i
  • vrijednost koja se predaje ranjivom parametru koja sadrži i SQL upit koji se koristi za iskorištavanje ranjivosti parametra item na SQL ubacivanje. (9999999+union+select+0,concat(username,0x3a,password),0,0,0,0,0,0,0+from+jos_users--).
slika51
Slika 5.1: Primjer iskorištavanja ranjivosti CMS sustava na SQL ubacivanje

Klasičan način iskorištavanja ranjivosti CMS sustava na SQL ubacivanje je da se ubačenim SQL upitom dođe do korisničkih imena i sažetaka korisničkih lozinki. Napadački niz znakova sadrži SQL upit koji iz baze podataka dohvaća korisnička imena i sažetke korisničkih lozinki. Dobiveni podaci vežu se na originalni SQL upit i prikazuju se u tijelu dobivenog odgovora, odnosno u dobivenoj HTML stranici. Naravno, ubačeni SQL upit se može promijeniti tako da dohvaća proizvoljne podatke iz baze podataka, ali korisnička imena i sažeci lozinki su najzanimljiviji za napadača. Većina CMS sustava za izračunavanje sažetaka lozinki koristi slabe kriptografske algoritme za izračunavanje sažetaka, obično MD5. Korištenjem raznih programskih alata ili servisa na Internetu iz takvih sažetaka se može doći do originalne korisničke lozinke. Napadač to može iskoristiti za kompromitiranje korisničkih računa ili za kompromitiranje CMS sustava koristeći dobivene povjerljive administratorske podatke. Potrebno je napomenuti da primjeri koji se daju u opisima pronađenih ranjivosti iskorištavaju ranjivosti samo na standardnim instalacijama CMS sustava. SQL upit koji se ubacuje sadrži i ime tablice (u primjeru jos_users) iz koje se dohvaćaju podaci. Ime tablice sadrži prefiks baze podataka (u primjeru jos_) koji se zadaje tijekom instaliranja CMS sustava. Većina administratora CMS sustava ne mijenja standardne postavke, pa se ovo može i zanemariti, ali u slučajevima kada je promijenjen prefiks imena baze podataka ranjivost se neće moći iskoristiti na način prikazan u opisima pronađenih ranjivosti.

Pronađene ranjivosti CMS sustava na SQL ubacivanje jednostavno se iskorištavaju generiranjem HTTP zahtjeva koji sadrži objavljeni napadački znakovni niz, te slanjem takvog zahtjeva ranjivom CMS sustavu. Ovisno o tipu ranjivog parametra za prijenos napadačkog znakovnog niza koristi se GET ili POST metoda. U nekim slučajevima za iskorištavanje ranjivosti CMS sustava na SQL ubacivanje može se koristiti i Web preglednik. Na slici 5.2 prikazan je način iskorištavanja ranjivosti koristeći samo Web preglednik.

slika52
Slika 5.2: Uspješno iskorištavanje ranjivosti CMS sustava na SQL ubacivanje koristeći samo Web preglednik

U primjeru na slici 5.2 u dobivenom odgovoru nalazi se korisničko ime i sažetak lozinke, odnosno u dobivenom odgovoru nalazi se administratorsko korisničko ime (admin) i sažetak administratorske lozinke (d5095ccc0fdf2c9125d786db536805d4). Prema tome, može se zaključiti da je CMS sustav ranjiv na SQL ubacivanje.

Kako bi se provjerilo sadrži li određeni CMS sustav neku od objavljenih pronađenih ranjivosti, potrebno je za svaku pronađenu ranjivost ispitati je li CMS sustav ranjiv ili nije. Ispitivanje se provodi tako da se na osnovu objavljenih podataka o pronađenoj ranjivosti generira HTTP zahtjev. Generirani HTTP zahtjev se šalje CMS sustavu, te se analizira dobiveni odgovor kako bi se vidjelo je li aplikacija ranjiva ili nije. Provodeći ovaj postupak ručno može biti zamoran i dugotrajan posao, jer je potrebno ispitati CMS sustav za svaku pronađenu ranjivost. Kako se cijeli postupak otkrivanja ranjivosti može formalno opisati, postupak je pogodan za automatiziranje. Automatiziranjem postupka otkrivanja ranjivosti cijeli postupak se znatno ubrzava, te je manja mogućnost greške prilikom otkrivanja ranjivosti. Postupak otkrivanja ranjivosti sastoji se od sljedećih koraka:

  • Korak 1: Generiranje HTTP zahtjeva na osnovu podataka o pronađenoj ranjivosti.
  • Korak 2: Slanje generiranog HTTP zahtjeva CMS sustavu.
  • Korak 3: Analiza dobivenog odgovora, kako bi se utvrdilo je li ispitivani CMS sustav ranjiv na određenu pronađenu ranjivost.

U nastavku je opisan ostvareni programski alat za penetracijsko ispitivanje ranjivosti na SQL ubacivanje već prepoznate vrste Web aplikacije. Programski alat provodi automatizirano otkrivanje ranjivosti na SQL ubacivanje za određene vrste CMS sustava, koristeći bazu javno dostupnih poznatih ranjivosti. Kao baza ranjivosti uzete su ranjivosti koje se objavljuju na milw0rm-u. Programski alat je ostvaren korištenjem programskog jezika Java, te je ostvareno potpuno funkcionalno grafičko sučelje.

Programski alat podržava nekoliko CMS sustava, podržani CMS sustavi su:

  • Joomla!,
  • Mambo i
  • PHP-Nuke.

Arhitektura ostvarenog programskog alata može se podijeli na nekoliko dijelova, dijelovi su:

  • baza exploita,
  • dio za upravljanje bazom exploita,
  • dio za izvršavanje exploita i
  • dio za analizu uspješnosti. (Slika 5.3)
slika53
Slika 5.3: Arhitektura alata za automatizirano ispitivanje ranjivosti na SQL ubacivanje

U nastavku su opisani svi dijelovi programskog alata. Opisana je svrha i namjena svakog dijela, te je prikazan način korištenja alata. Nakon opisa svih dijelova i funkcionalnosti programskog alata opisan je i primjer pronalaženja ranjivosti CMS sustava na SQL ubacivanje korištenjem ostvarenog programskog alata.

5.1 Baza exploita

Baza exploita je kao što joj i samo ime kaže baza exploita. U bazi se nalaze svi do sada objavljeni exploiti na milw0rm-ovoj Web stranici za podržane CMS sustave. Exploit u ovom slučaju predstavlja sve podatke o pronađenoj ranjivosti na SQL ubacivanje potrebne za uspješno iskorištavanje ranjivosti. Objavljivanje informacija o pronađenoj ranjivosti na milw0rm-ovoj stranici nije standardizirano, pa se informacije o pronađenim ranjivostima prikazuju i objavljuju na različite načine. Jedan primjer objavljivanja informacija o pronađenoj ranjivosti prikazan je na slici 5.4.

slika54
Slika 5.4: Primjer opisa pronađene ranjivosti na milw0rm-ovoj Web stranici

Za potrebe aplikacije odlučeno je da se svi potrebni podaci o objavljenim ranjivostima spremaju u XML datoteke, kako bi se moglo jednostavno i lako manipulirati s tim podacima. Za svaki CMS sustav postoji jedna XML datoteka sa svim objavljenim exploitima. Svaki exploit sastoji se od nekoliko informacija koje ga opisuju i koje su dovoljne za njegovo uspješno izvođenje. Struktura prazne XML datoteke koja služi za opisivanje exploita prikazana je na slici 5.5.

slika55
Slika 5.5: Struktura XML datoteke koja predstavlja strukturu exploita

Svaki exploit sastoji se od 6 elemenata, a to su:

  • ime (name),
  • poveznica na milw0rm-ovu Web stranicu gdje je objavljen exploit (url),
  • kratak opis exploita (description),
  • napadački znakovni niz potreban za izvođenje exploita (exploit-code),
  • HTTP metoda prijenosa napadačkog znakovnog niza (method) i
  • URL na koji se predaju podaci kod korištenja POST metode (link).

U element ime zapisuje se ime pronađene ranjivosti na SQL ubacivanje koje je objavljeno na milw0rm-ovoj Web stranici. U element url zapisuje se URL na kojem je objavljena ranjivost. U element description zapisuje se kratak opis exploita, odnosno opis pronađene ranjivosti. U element exploit-code upisuje se napadački znakovni niz potreban za iskorištavanje pronađene ranjivosti. Vrijednost ovoga elementa koristi se kod generiranja HTTP zahtjeva za iskorištavanje pronađene ranjivosti. U element method zapisuje se HTTP metoda s kojom se prenose podaci potrebni za iskorištavanje pronađene ranjivosti. Podržane metode su GET i POST. U element link zapisuje se relativan URL skripte kojoj se predaje napadački znakovni niz kod korištenja POST metode za prijenos podataka. Ako se koristi GET metoda za prijenos podataka, element link ostaje prazan, jer se ne koristi. Na slici 5.6 prikazan je primjer zapisa jednog exploita sa svim potrebnim podacima za iskorištavanje pronađene ranjivosti.

slika56
Slika 5.6: Primjer exploita sa svim potrebnim podacima za iskorištavanje pronađene ranjivosti

5.2 Upravljanje s bazom exploita

Dijelom za upravljanje s bazom exploita ostvareno je upravljanje s bazom exploita. Kako ne postoji način automatskog osvježavanja baze exploita, omogućeno je ručno dodavanje novih exploita u bazu. Dio za upravljanje s bazom exploita omogućava dodavanje novih exploita, brisanje željenih exploita iz baze, te pregledavanje svih exploita koji se nalaze u bazi.

Za upravljanje bazom exploita koristi se ostvareno grafičko sučelje. Odabirom opcije Exploits iz izbornika Tools u glavnom prozoru alata otvara se novi prozor prikazan na slici 5.7.

slika57
Slika 5.7: Pregledavanje informacija o exploitima

Novootvoreni prozor sadrži dvije kartice. U prvoj kartici (View) omogućeno je pregledavanje svih exploita koji se nalaze u bazi exploita. Odabirom željenog CMS sustava iz padajućeg izbornika (Application) prikazuje se lista svih exploita koji se nalaze u bazi za odabrani CMS sustav. Odabirom željenog exploita iz liste prikazuju se sve informacije o njemu. Brisanje željenog exploita iz baze omogućeno je gumbom Remove. Ako se neki exploit želi izbrisati iz baze, potrebno ga je selektirati te kliknuti na gumb Remove.

Dodavanje novih exploita u bazu omogućeno je s drugom karticom (Add), klikom na karticu Add otvara se novi prozor prikazan na slici 5.8.

slika58
Slika 5.8: Dodavanje novog exploita u bazu exploita

Nakon što se unesu svi potrebni podaci za exploit i iz padajućeg izbornika (Application) se odabere CMS sustav za koji se unosi novi exploit, exploit se dodaje klikom na gumb Add.

Kako bi otkrivanje ranjivosti bilo što efikasnije potrebno je da se u bazu periodički dodaju novo objavljeni exploiti, kako baza exploita ne bi zastarjela.

5.3 Izvršavanje exploita

Izvršavanje exploita se svodi na generiranje posebnog HTTP zahtjeva, te na slanje tog zahtjeva odabranom CMS sustavu. HTTP zahtjev se generira prema podacima zapisanima u bazi exploita, za svaki exploit koji se nalazi u bazi podataka generira se po jedan HTTP zahtjev. Postoje samo dva tipa HTTP zahtjeva koja se generiraju, a to su HTTP GET zahtjev i HTTP POST zahtjev. Prema metodi zapisanoj u bazi exploita za pojedini exploit određuje se koja se vrsta HTTP zahtjeva generira za koju ranjivost. Jedina razlika između ta dva zahtjeva je to na koji način se prenose podaci, odnosno napadački znakovni niz. U HTTP GET zahtjevu napadački niz se prenosi unutar zaglavlja HTTP zahtjeva, odnosno resurs koji se zahtjeva od Web aplikacije kojoj se šalje zahtjev odgovara napadačkom znakovnom nizu. Kod HTTP POST zahtjeva napadački znakovni niz šalje se u tijelu HTTP zahtjeva, te se taj znakovni niz prosljeđuje na određeni URL zapisan u bazi exploita za određeni exploit.

Primjer generiranog HTTP GET zahtjeva prikazan je na slici 5.9.

slika59
Slika 5.9: Generirani HTTP GET zahtjev

Primjer generiranog HTTP POST zahtjeva prikazan je na slici 5.10.

slika510
Slika 5.10: Generirani HTTP POST zahtjev

Dobiveni odgovori na poslane HTTP zahtjeve šalju se dijelu za analizu uspješnosti, kako bi se odlučilo je li exploit uspješno izvršen, odnosno postoji li ili ne postoji ranjivost.

5.4 Analiza uspješnosti

Svi dobiveni odgovori na poslane HTTP zahtjeve analiziraju se kako bi se utvrdilo je li slanjem pripadnog HTTP zahtjeva uspješno izvršeno SQL ubacivanje. Analiza uspješnosti se svodi na analizu dobivenog tijela odgovora, odnosno na analizu dobivene HTML stranice. Kako se uspješnim izvršavanjem exploita u tijelu dobivenog odgovora nalazi minimalno jedan sažetak korisničke lozinke, pojavljivanje sažetka lozinke unutar tijela odgovora uzeto je kao indikator uspješnosti. Pojavljivanje sažetka korisničke lozinke siguran je indikator da je SQL ubacivanje uspješno provedeno, a isto tako nepostojanje sažetka lozinke u odgovoru je indikator da SQL ubacivanje nije uspješno provedeno. Zbog toga se analiza uspješnosti svodi na pronalazak sažetka lozinke unutar tijela dobivenog odgovora. Sažetak lozinke je, u ovom slučaju, uzorak od trideset i dvije heksadecimalne znamenke. Analizom se utvrđuje nalazi li se takav uzorak unutar tijela dobivenog odgovora. Ako se analizom utvrdi da je uzorak pronađen, odlučuje se da je exploit uspješno izveden, a u suprotnom se odlučuje da exploit nije uspješno izveden. Na slici 5.11 prikazan je primjer na koji način se sažetak lozinke može nalaziti u tijelu dobivenog odgovora, odnosno u kodu dobivene HTML stranice.

slika511
Slika 5.11: Dio HTML koda u kojem se nalazi dobiveni sažetak administratorske lozinke

5.5 Primjer korištenja alata

Korištenje ostvarenog alata za ispitivanje ranjivosti nekog CMS sustava na SQL ubacivanje je jako jednostavno. Sve što je potrebno je poreknuti alat, te unijeti URL ili IP adresu ispitivanog CMS sustava i odabrati vrstu CMS sustava. URL se unosi u polje URL, a vrsta CMS sustava se odabire iz padajućeg izbornika Application. Nakon što se unesu potrebni podaci ispitivanje se pokreće klikom na gumb Start. Ako se iz nekoga razloga želi prekinuti ispitivanje koje je u tijeku, to je moguće klikom na gumb Stop. U primjeru na slici 5.12 za URL je unesena IP adresa 192.168.1.111, te je odabran Joomla! CMS sustav. Za potrebe ovog ispitivanja na ispitivani Joomla! CMS sustav namjerno je instalirano nekoliko komponenti koje su ranjive na SQL ubacivanje, te se exploiti za njihovo iskorištavanje nalaze u bazi exploita.

slika512
Slika 5.12: Primjer korištenja alata

Nakon što se izvrše svi exploiti iz baze exploita za odabrani CMS sustav, u glavnom prozoru su prikazane sve informacije o izvedenim exploitima. Postoje dva načina prikaza rezultata, a to su:

  • prikaz svih izvršenih exploita (odabirom opcije All Exploits) i
  • prikaz samo uspješno izvršenih exploita (odabirom opcije Successful Exploits). (Slika 5.13)
slika513
Slika 5.13: Odabir prikaza dobivenih rezultata

Neovisno koji se tip prikaza odabere za sve exploite se prikazuju sve informacije. Podaci koji se prikazuju su:

  • lista i opis exploita (područje Exploits),
  • poslani HTTP zahtjev za odabrani exploit iz liste exploita (područje Request) i
  • dobiveni odgovor, dobiveno HTTP zaglavlje i tijelo odgovora za odabrani exploit iz liste exploita. (područje Response)

Lista uspješnih exploita u biti predstavlja listu pronađenih ranjivosti na ispitivanom CMS sustavu. Na slici 5.12 vidi se da je pronađeno nekoliko ranjivosti. Za sve pronađene ranjivosti moguće je pregledati poslane HTTP zahtjeve i dobivene odgovore. Ako bi se željelo ručno utvrditi je li alat uspješno pronašao ranjivost, moguće je pogledati dobiveni odgovor, odnosno tijelo dobivenog odgovora (dobivenu HTML stranicu). Primjer dobivenog odgovora za uspješno izveden exploit nalazi se na slici 5.14.

slika514
Slika 5.14: Dio HTML stranice koja sadrži dobivena korisnička imena i sažetke lozinki

U prikazanome dijelu HTML stranice vidi se da se nalazi nekoliko korisničkih imena i sažetaka lozinki, odnosno dva korisnička imena i dva sažetka lozinki. Prema ovome može se zaključiti da je alat za ovu ranjivost uspješno otkrio da se radi o uspješnom izvođenju exploita, odnosno alat je uspješno otkrio ranjivost na ispitivanom CMS sustavu. I za sve ostale exploite iz liste uspješnih exploita moguće je ručno utvrditi je li alat uspješno otkrio ranjivost na ispitivanom CMS sustavu ili nije.

Analizom dobivenih rezultata utvrđeno je da je alat uspješno pronašao sve namjerno instalirane komponente koje su ranjive na SQL ubacivanje. Prema tome, može se zaključiti da je alat uspješan u automatskom otkrivanju ranjivosti podržanih CMS sustava na SQL ubacivanje.

5.5.1 Postavljanje dodatnih parametara

U programskom alatu ostvareno je i postavljanje dodatnih parametara alata. Odabirom opcije Options iz izbornika Tools u glavnom prozoru otvara se novi prozor u kojem je moguće postaviti neke dodatne parametre alata. (Slika 5.15)

slika515
Slika 5.15: Postavljanje dodatnih parametara

U novootvorenom prozoru moguće je postaviti vrijeme odgovora za ispitivani CMS sustav (Timeout). Ovo vrijeme predstavlja najduže vrijeme čekanja (u mS) na odgovor, ako ispitivani CMS sustav u tom vremenu ne odgovori ispitivanje se zaustavlja. Druga opcija koju je moguće postaviti je korištenje posredničkog poslužitelja tijekom ispitivanja. Ukoliko se odabere da se koristi posrednički poslužitelj (selektirano polje Use Proxy), potrebno je unijeti IP adresu ili mrežno ime posredničkog poslužitelja (Server), te port (Port) na kojem je poslužitelj pokrenut. Posrednički poslužitelj može se koristiti za dodatni nadzor prometa, za ispitivanje alata ili kako bi se sakrio identitet tijekom ispitivanja koristeći anonimne posredničke poslužitelje. Sve unesene promjene spremaju se klikom na gumb Save.

Prethodna
Gore
Sljedeca
© 2009 Ivan Tomić