Image
16.6.2016 0 Comments

WWW hacking a obrana / 5. časť

Ten­to­raz sa po­zrie­me na to, ako sa brá­niť pro­ti úto­kom ty­pu SQL In­jec­tion. Tým však eš­te nes­kon­čí­me té­mu o úto­koch SQL In­jec­tion, ale spô­so­by, ako za­bez­pe­čiť svo­je ap­li­ká­cie pro­ti to­mu­to ty­pu úto­kov, sú väč­ši­nou tie is­té. Pre­to­že ce­lý prob­lém, ako sa ďa­lej do­čí­ta­te, spo­čí­va v neo­šet­re­ní me­taz­na­ku '.

Ako sa brá­niť pro­ti SQL In­jec­tion?
Jed­na z veľ­mi dô­le­ži­tých ve­cí, na kto­ré tre­ba pa­mä­tať, je to, že k da­ta­bá­zo­vé­mu server­u sa net­re­ba prih­la­so­vať s prá­va­mi roo­ta. Ak je to mož­né, po­uží­vaj­te vždy čo naj­niž­šie prá­va. My v ukáž­ko­vých prík­la­doch po­uží­va­me po­uží­va­te­ľa root, ale v sku­toč­nos­ti tre­ba po­užiť iba účet s čo naj­viac ob­med­ze­ný­mi prá­va­mi. Ak tak uro­bí­me, útoč­ník ne­bu­de môcť ma­zať ta­buľ­ky ale­bo ce­lé da­ta­bá­zy, ako vám uká­že­me v nas­le­du­jú­cej čas­ti se­riá­lu.

Vždy pre­ve­ruj­te kaž­dý vstup, kto­rý vkla­dá­te do da­ta­bá­zy. Ne­zá­le­ží na tom, či po­chád­za z pr­vku tzv. Se­lect Box, kde sú už vop­red de­fi­no­va­né hod­no­ty, pre­to­že zme­niť ich nie je prob­lém, či už po­mo­cou lo­kál­ne­ho proxy server­a, ale­bo ulo­že­ním strán­ky na disk, pre­pí­sa­ním hod­no­ty v Se­lect Boxe a po­uži­tím už up­ra­ve­nej strán­ky ako sku­toč­nej. To si uká­že­me v ďal­ších čas­tiach se­riá­lu.

Pri vý­stu­pe z da­ta­bá­zy pre es­te­tic­ký vzhľad od­stra­ňuj­te všet­ky spät­né lom­ky, nap­rík­lad fun­kciou strip­slas­hes(re­ťa­zec). A nao­pak, pri vstu­pe opäť „es­ca­pu­je­me“ nap­rík­lad fun­kciou mysql_real_es­ca­pe_string(re­ta­zec).
Na ove­re­nie vstu­pu mô­že­me po­užiť nap­rík­lad fun­kcie is_nu­me­ric ale­bo cty­pe_di­git(), kto­ré ove­ria, či je pa­ra­me­ter ty­pu čís­lo.

1. spô­sob – spo­čí­va v po­uži­tí fun­kcie mysql_real_es­ca­pe_string()
Jed­no­duc­hý a účin­ný spô­sob je vy­tvo­riť nas­le­du­jú­ci kód a up­ra­viť ho po­dľa po­tre­by. Po­uži­je­me fun­kciu ja­zy­ka PHP, kto­rá je v ňom od ver­zie 4.3.0, s náz­vom mysql_real_es­ca­pe_string(neo­set­re­ny_re­ta­zec [, re­sour­ce iden­ti­fi­ka­tor] ).
V kó­de je ta­kis­to po­uži­tá fun­kcia get_ma­gic_quotes_gpc(), kto­rá nám po­dľa náv­ra­to­vej hod­no­ty uká­že, či sú tzv. ma­gic­ké úvod­zov­ky za­pnu­té. Ak sú, fun­kcia vrá­ti 1, ak sú vy­pnu­té, tak 0.
$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'";

Nas­le­du­jú­ci kód ošet­rí me­taz­na­ky, kto­ré by moh­li zna­me­nať bez­peč­nos­tné ri­zi­ko pre da­ta­bá­zu SQL. Naj­prv sa tes­tu­je, či v kon­fi­gu­rač­nom sú­bo­re PHP.ini už nie je za­pnu­tá sprá­va ma­gic­kých úvod­zo­viek. Ak je, naj­prv dôj­de k ich od­strá­ne­niu fun­kciou strip­slas­hes(), pre­to­že v opač­nom prí­pa­de by sa es­ca­po­va­lo dvak­rát. A nás­led­ne sa po­uži­je fun­kcia mysql_real_es­ca­pe_string(), kto­rá je ur­če­ná prá­ve na ošet­re­nie vstu­pu do da­ta­bá­zy SQL.

if (get_ma­gic_quotes_gpc()) {

$me­no_uzi­va­te­la = strip­slas­hes($me­no_uzi­va­te­la);
$hes­lo_uzi­va­te­la = strip­slas­hes($hes­lo_uzi­va­te­la);
               }

$me­no_uzi­va­te­la =  mysql_real_es­ca­pe_string($me­no_uzi­va­te­la);
$hes­lo_uzi­va­te­la = mysql_real_es­ca­pe_string($hes­lo_uzi­va­te­la);

Prí­kaz SQL bu­de vy­ze­rať tak­to:
Bez po­uži­tia fun­kcie strip­slas­hes() a sú­čas­nom za­pnu­tí di­rek­tí­vy ma­gic_quotes_gpc (v sú­bo­re PHP.ini):
SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'Kat­ka\\\'/*' AND hes­lo=''

Bez po­uži­tia fun­kcie mysql_real_es­ca­pe_string():
SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'Kat­ka'/*' AND hes­lo=''

S po­uži­tím fun­kcie mysql_real_es­ca­pe_string():
SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'Kat­ka\'/*' AND hes­lo=''

Ten­to spô­sob sa naj­viac od­po­rú­ča, je jed­no­duc­hý a spo­ľah­li­vý.

2. spô­sob – ide o zdvo­je­nie jed­no­du­chých úvod­zo­viek
Ne­za­bud­ni­te však ošet­riť kaž­dú pre­men­nú, kto­rá ide do prí­ka­zu SQL, pre­to­že exis­tu­je viac spô­so­bov, kto­rý­mi sa útoč­ník mô­že po­kú­siť nain­jek­to­vať vhod­ný prí­kaz SQL.
$me­no_uzi­va­te­la = str_rep­la­ce("'", "''", $me­no_uzi­va­te­la); $hes­lo_uzi­va­te­la = str_rep­la­ce("'", "''", $hes­lo_uzi­va­te­la);

Pre­to­že ke­by prog­ra­má­tor ošet­ril nap­rík­lad len pre­men­nú $me­no_uzi­va­te­la, mo­hol by útoč­ník vlo­žiť do po­ľa na hes­lo nap­rík­lad
abc-ho­ci­ja­ke_hes­lo' OR TRUE/*, nás­led­kom čo­ho by vý­sled­ný prí­kaz vy­ze­ral tak­to:
SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'Kat­ka' AND hes­lo='abc-hes­lo' OR TRUE/*'
a útoč­ník by sa opäť prih­lá­sil bez prob­lé­mov:

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

Po­užiť mô­že­te aj fun­kciu addslas­hes(), kto­rá pri­dá pred me­taz­na­ky ' a " spät­nú lom­ku \.
$me­no_uzi­va­te­la = addslas­hes($me­no_uzi­va­te­la);
$hes­lo_uzi­va­te­la = addslas­hes($hes­lo_uzi­va­te­la);

Ak do po­líč­ka na me­no vlo­ží­me Kat­ka'/* a po­le na hes­lo nec­há­me práz­dne, vý­sle­dok prí­ka­zu SQL bu­de vy­ze­rať tak­to:
SE­LECT * FROM re­gis­tro­va­ni_uzi­va­te­lia WHE­RE me­no = 'Kat­ka\'/*' AND hes­lo=''
a pre­to sa SQL In­jec­tion ne­po­da­rí.
 
Ďal­šie spô­so­by sú od­stra­ňo­va­nie zna­kov, kto­ré by moh­li da­ta­bá­ze spô­so­biť prob­lé­my, ale­bo, nao­pak, po­vo­le­nie len ur­či­tých zna­kov a..z, A..Z, 0..9. V po­dsta­te len vy­tvo­rí­te fun­kcie, kto­ré bu­dú pri­jí­mať pre­men­né, kto­ré bu­dú tvo­riť sú­časť prí­ka­zu SQL, nap­rík­lad $me­no_uzi­va­te­la a $hes­lo_uzi­va­te­la, a vlo­žiť do da­ta­bá­zy ošet­re­né re­ťaz­ce so sek­ven­cia­mi es­ca­pe. Prí­pad­ne je tu eš­te mož­nosť upo­zor­niť po­uží­va­te­ľa na to, kto­ré zna­ky sú po­vo­le­né, čo je už spo­mí­na­né od­stra­ňo­va­nie ne­bez­peč­ných zna­kov, ale v tom­to prí­pa­de to bu­de na po­uží­va­teľ­skej úrov­ni.

Zá­ver
Zo všet­kých spô­so­bov je naj­spo­ľah­li­vej­šie asi es­ca­po­va­nie me­taz­na­kov, kto­ré by v prí­pa­de, ak nie sú ošet­re­né, moh­li spô­so­biť in­jek­to­va­nie kó­du do da­ta­bá­zy SQL. Fun­kcia mysql_real_es­ca­pe_string() je štan­dard, kto­rý sa na ten­to účel po­uží­va, a jej im­ple­men­tá­cia je jed­no­duc­há. Na­bu­dú­ce sa po­zrie­me na iné ty­py da­ta­báz, ako sú MS SQL a Po­stgreSQL.

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

Kyocer TASK

Najnovšie videá