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

CES 2017: Lenovo predstavilo nové notebooky ThinkPad X1, Miix 720 a prvý smartfón s podporou Tango - Lenovo Phab 2

03.01.2017 00:09

Lenovo odštartovala ďalší ročník veľtrhu s celou škálou nových produktov. Nová generácia produktov radu ThinkPad X1 Carbon 2017 je najľahším 14-palcovým biznis notebookom, ktorý váži len 1,14kg a obsa ...

Ako na to

Tipy a triky: Ako správne poskytovať IT pomoc a ako o ňu správne žiadať?

14.12.2016 09:40

Či už ste pokročilý používateľ počítača, ktorý často poskytuje IT pomoc známym a rodine, alebo ste to vy, kto o takúto pomoc zvyčajne žiada, ľahko sa stanete nechcenou príčinou frustrácie a obrovskej ...

Ako na to

Tipy a triky: Ako diagnostikovať a opravovať neúspešné upgrady Windows 10

14.12.2016 09:37

Microsoft prešiel s Windows 10 do celkom novej éry vývoja. Namiesto samostatných verzií Windows, vydávaných zvyčajne s odstupom dvoch až piatich rokov (XP, Vista, 7 a podobne), začal svoj systém vyvíj ...

Žiadne komentáre

Vyhľadávanie

ITSMF jar

Najnovšie videá