Image
16.6.2016 0 Comments

WWW hacking a obrana / 4. časť

Da­ta­bá­zy sú dnes neod­de­li­teľ­nou sú­čas­ťou mno­hých ap­li­ká­cií, kto­ré po­tre­bu­jú uk­la­dať a spra­cú­vať väč­šie množ­stva dát. Da­ta­bá­zy mu­sia mať ne­ja­kú štruk­tú­ru a lo­gi­ku a prá­ve na to slú­ži ja­zyk SQL (Struc­tu­red Query Lan­gua­ge), kto­rý dnes po­uží­va­jú da­ta­bá­zo­vé sys­té­my. Sa­moz­rej­me, že aj inter­ne­to­vé ap­li­ká­cie po­uží­va­jú da­ta­bá­zy a pri nich je za­bez­pe­če­nie veľ­mi dô­le­ži­té, pre­to­že množ­stvo úda­jov je vy­sta­ve­ných na server­och, kto­ré den­ne po­sky­tu­jú služ­by ce­lé­mu sve­tu. Prá­ve o za­bez­pe­če­ní inter­ne­to­vých ap­li­ká­cií, kto­ré pra­cu­jú s da­ta­bá­za­mi, bu­de tá­to časť náš­ho se­riá­lu.

SQL In­jec­tion
SQL In­jec­tion je dnes veľ­mi zná­my a med­zi útoč­ník­mi aj veľ­mi po­pu­lár­ny typ úto­kov. Ob­ľú­be­nosť si za­bez­pe­čil tým, že po­sky­tu­je mož­nosť po­mer­ne ne­ná­roč­ne preb­rať kon­tro­lu nad da­ta­bá­zo­vým server­om. A ne­poc­hyb­ne k to­mu pris­pe­lo aj to, že len ma­lá časť prog­ra­má­to­rov sa za­obe­rá dos­ta­toč­ným za­bez­pe­če­ním svo­jich webo­vých ap­li­ká­cií. Buď pre­to, že o da­nom prob­lé­me a bez­peč­nos­tných ri­zi­kách ve­dia len veľ­mi má­lo, ale­bo jed­no­duc­ho vstup za­bud­nú ošet­riť. Žiaľ, na chy­bu sa prí­de oby­čaj­ne až nes­kôr, keď ju niek­to vy­uži­je. V tej­to čas­ti se­riá­lu sa vám po­kú­si­me vy­svet­liť, na akom prin­cí­pe úto­ky SQL In­jec­tion pra­cu­jú a ako sa im dá vy­hnúť.

SQL In­jec­tion nie je zá­le­ži­tosť len chyb­nej im­ple­men­tá­cie da­ta­bá­zy MySQL do kó­du prog­ra­má­to­rov v PHP. Tý­ka sa to všet­kých ja­zy­kov. Ide tu o ja­zyk SQL, te­da ošet­re­nie vstu­pu a vý­stu­pu je po­treb­né v kaž­dom ja­zy­ku ASP, PHP, CGI a aj JSP. Ta­kis­to os­tat­né da­ta­bá­zo­vé server­y, ako nap­rík­lad MS SQL ale­bo Po­stgreSQL, sa da­jú v prí­pa­de zlé­ho ošet­re­nia vstu­pu a vý­stu­pu na­pad­núť. Po­zri­me sa na prík­lad.

Ob­sah sú­bo­ru in­dex.html:

<html>
<head>
<tit­le>Prih­lá­se­nie</tit­le>
<me­ta http-equiv="Con­tent-Ty­pe" con­tent="text/html; char­set=win­dows-1250">
</head>
<bo­dy>
<tab­le bor­der="0" bor­der­co­lor="green" rows="1" cols="4">
<tr>
<form ac­tion="db_con­nec­tion.php" met­hod="get">
<td><b>Prih­lá­se­nie uží­va­te­ľa:</b></td>
<td><in­put na­me="me­no_uzi­va­te­la" ty­pe="text" va­lue="me­no_uzi­va­te­la"></td>
<td><in­put na­me="hes­lo_uzi­va­te­la" ty­pe="text" va­lue="hes­lo_uzi­va­te­la"></td>
<td><in­put na­me="ak­cia" ty­pe="sub­mit" va­lue="Prih­lá­siť"></td>
</form>
</tr>
</tab­le>
</bo­dy>
</html>

Pre ná­zor­nosť a lep­šie po­cho­pe­nie da­nej té­my bu­de­me po­stu­po­vať úpl­ne od za­čiat­ku prá­ce s da­ta­bá­zou.
Na to, aby sme moh­li vy­uží­vať vo svo­jich WWW ap­li­ká­ciách da­ta­bá­zy SQL, kon­krét­ne MySQL, mu­sí­me mať nain­šta­lo­va­ný da­ta­bá­zo­vý server MySQL. Po je­ho in­šta­lá­cii si vy­tvo­rí­me da­ta­bá­zu, v kto­rej bu­dú ulo­že­né všet­ky zá­zna­my.
Pre ná­zor­nú ukáž­ku si vy­tvo­rí­me da­ta­bá­zu s náz­vom za­kaz­ni­ci. To do­cie­li­me prí­ka­zom ja­zy­ka SQL da­ta­bá­zo­vé­ho sys­té­mu MySQL:
CREA­TE DA­TA­BA­SE za­kaz­ni­ci; Tým sme vy­tvo­ri­li v pre­ne­se­nom vý­zna­me akú­si schrán­ku, kto­rú server po­sky­tu­je na vkla­da­nie úda­jov. V da­ta­bá­ze však mu­sia byť úda­je us­po­ria­da­né do lo­gic­kých štruk­túr. Na to nám slú­žia ta­buľ­ky, do kto­rých sa bu­dú kon­krét­ne úda­je uk­la­dať.

Do kon­zo­ly na­pí­še­me prí­kaz
USE za­kaz­ni­ci; Je to pre­to, aby server ve­del, s akou da­ta­bá­zou chce­me pra­co­vať, keď­že server mô­že ob­slu­ho­vať ve­ľa da­ta­báz.
CREA­TE TAB­LE re­gis­tro­va­ni_uzi­va­te­lia (me­no VAR­CHAR(15), hes­lo VAR­CHAR(32));
Ak si chce­te ove­riť vy­tvo­re­nie ta­buľ­ky re­gis­tro­va­ni_uzi­va­te­lia, sta­čí, ak na­pí­še­te prí­kaz SHOW TAB­LES ;
Do vy­tvo­re­nej ta­buľ­ky vlo­ží­me tie­to úda­je:
IN­SERT IN­TO re­gis­tro­va­ni_uzi­va­te­lia VA­LUES ("lu­kas", MD5("lu­kas123")); IN­SERT IN­TO re­gis­tro­va­ni_uzi­va­te­lia VA­LUES ("Kat­ka", "ka­ta­ri­na123");

Ak chce­te vi­dieť jed­not­li­vé po­lia, sta­čí na­pí­sať prí­kaz:
DES­CRI­BE re­gis­tro­va­ni_uzi­va­te­lia;

Na úče­ly ukáž­ky vlo­ží­me do da­ta­bá­zy dvoch po­uží­va­te­ľov: jed­né­ho s nic­kom 'lu­kas' a dru­hé­ho s nic­kom 'Kat­ka'.
Ak po­rov­ná­me úto­ky XSS, PHP In­jec­tion a SQL In­jec­tion, jed­noz­nač­ne vy­hrá­va prá­ve po­sled­ný typ úto­kov. Nie­len pre jed­no­duc­hosť, s kto­rou sa dá ten­to útok po­dnik­núť, ale hlav­ne pre je­ho efek­ti­vi­tu. Veď s pár znak­mi sa dá prih­lá­siť do sys­té­mu ako niek­to iný a mať pl­né prá­va kon­krét­ne­ho po­uží­va­te­ľa.

Ob­sah sú­bo­ru db_con­nec­tion.php, kto­rý bu­de ko­mu­ni­ko­vať s da­ta­bá­zou:

<?php

$pri­poj = mysql_con­nect('127.0.0.1:3306', 'root', '');
mysql_se­lect_db("za­kaz­ni­ci", $pri­poj);

if($ak­cia=="Prih­lá­siť") {
$sql_p =  "SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = '$me­no_uzi­va­te­la' AND hes­lo =

'$hes­lo_uzi­va­te­la'";
$re­sult = mysql_query($sql_p);
mysql_clo­se($pri­poj);

whi­le ($row = mysql_fetch_array($re­sult, MYSQL_NUM)) {
ec­ho "<br>>Vi­taj­te uží­va­teľ <font co­lor=blue>".$row[0]." </font>, Va­še hes­lo je <font co­lor=red>".$row[1]." </font>";
}
} el­se {
ec­ho "Chy­ba pa­ra­met­ra 'ak­cia'";
}
? >

Ten­to kód vy­ko­ná pri­po­je­nie na da­ta­bá­zu MySQL ako po­uží­va­teľ root, kto­rá po­čú­va (lis­ten) na po­rte 3306 lo­kál­ne­ho sys­té­mu – ad­re­sa 127.0.0.1 čo je ek­vi­va­len­tom pre lo­cal­host. Hes­lo je nas­ta­ve­né na práz­dne.

Te­raz sa po­kú­si­me prih­lá­siť. Do po­líč­ka na me­no na­pí­še­me „lu­kas“ a na hes­lo ne­ja­ké nes­práv­ne hes­lo, nap­rík­lad ab­cdef123. Prih­lá­siť sa, sa­moz­rej­me, ne­po­da­rí. Čo však v prí­pa­de, ak útoč­ník do po­ľa na me­no na­pí­še lu­kas'# ?
Prih­lá­se­nie pre­beh­ne bez prob­lé­mov. A te­raz vy­svet­le­nie, pre­čo k to­mu doš­lo. Prob­lém je v tom, že po­uží­va­teľ mô­že vlo­žiť do pre­men­nej me­no po­uží­va­te­ľa aké­koľ­vek zna­ky, te­da aj špe­ciál­ne zna­ky po­uží­va­né da­ta­bá­zo­vým server­om (v tom­to prí­pa­de MySQL), a tie bu­dú bez ošet­re­nia pri­da­né do prí­ka­zu SQL.

$sql_p = "SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = '$me­no_uzi­va­te­la' AND hes­lo = '$hes­lo_uzi­va­te­la'"; Kód PHP po vlo­že­ní re­ťaz­ca do pre­men­nej me­no lu­kas'/*:
$sql_p = "SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'lu­kas'/*' AND hes­lo = '$hes­lo_uzi­va­te­la'";


Znak sharp # má v MySQL fun­kciu ko­men­tá­ra do kon­ca riad­ka. Rov­na­ko aj dvo­ji­té zna­mien­ko -, za kto­rým mu­sí nas­le­do­vať as­poň jed­na med­ze­ra, te­da '-- '. Tre­tím ty­pom ko­men­tá­ra je /* To­to je ko­men­tár aj na viac riad­kov. */. Ten­to typ ko­men­tá­ra mô­že útoč­ník po­užiť, ak je v zdro­jo­vom kó­de ap­li­ká­cie prí­kaz SQL na viac riad­koch – ak je za­lo­me­ný ria­dok.
Na tom­to prík­la­de vi­dí­me, že zdan­li­vo bez­chyb­ná ap­li­ká­cia mô­že byť veľ­mi ľah­ko pre­lo­mi­teľ­ná, ak sa za prih­la­so­va­cie me­no pri­dá '#.
Mož­nos­tí, ako in­jek­to­vať vlast­ný kód do prí­ka­zu SQL, je, sa­moz­rej­me, viac. Útoč­ník mô­že vy­užiť aj iný prí­kaz, nap­rík­lad ' or 1=1# . Ak nas­le­du­jú­ci kód vlo­ží do po­líč­ka na hes­lo, ne­bu­de vô­bec zá­le­žať na za­da­nom po­uží­va­teľ­skom me­ne a ap­li­ká­cia vy­ko­ná prih­lá­se­nie za kaž­dé­ho po­uží­va­te­ľa v da­ta­bá­ze. Pre­čo k to­mu dôj­de?
Pri­po­meň­me si eš­te raz, ako vy­ze­rá prí­kaz, kto­rý za­bez­pe­ču­je prih­lá­se­nie sa za­re­gis­tro­va­né­ho po­uží­va­te­ľa.
$sql_p = "SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = '$me­no_uzi­va­te­la' AND hes­lo = '$hes­lo_uzi­va­te­la'";

Ak útoč­ník vlo­ží kód ' or 1=1# do po­líč­ka na hes­lo, prí­kaz bu­de vy­ze­rať tak­to:
$sql_p = "SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'ho­ci­ja­ke_me­no' AND hes­lo = '' or 1=1#'";
a prih­lá­se­nie sa po­da­rí:
Vi­taj­te uží­va­teľ lu­kas, Va­še hes­lo je c938489ddb8330955c187d62e032bb43 Vi­taj­te uží­va­teľ Kat­ka, Va­še hes­lo je ka­ta­ri­na123

Inter­ne­to­vých strá­nok, na kto­rých bež­ia ap­li­ká­cie ko­mu­ni­ku­jú­ce s da­ta­bá­za­mi SQL (MySQL, Po­stgreSQL), je ve­ľa, či už ide o an­ke­ty, fó­ra, náv­štev­né kni­hy, ale­bo ho­ci­ja­ké iné ap­li­ká­cie. Je to jed­na z naj­jed­no­duc­hšie vy­uži­teľ­ných bez­peč­nos­tných chýb.

Zá­ver
Na­bu­dú­ce bu­de­me v opi­so­va­ní SQL In­jec­tion a ob­ra­ny pro­ti to­mu­to úto­ku po­kra­čo­vať.

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

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

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

Najnovšie videá