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

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á