Image
16.6.2016 0 Comments

WWW hacking a obrana / 7. časť

Da­ta­bá­zo­vý server MS SQL (Mic­ro­soft SQL) je roz­ší­re­ný vďa­ka je­ho roz­sia­hlym mož­nos­tiam a kva­li­te. No ako to už bý­va, všet­ko má svoj rub aj lí­ce. Na dis­kus­ných fó­rach sa mož­no stret­núť aj s ta­kým­to ná­zo­rom: Ne­pou­ží­va­me MS SQL server, pre­to­že je­ho mož­nos­ti mô­žu byť zneu­ži­té útoč­ní­kom. Roz­ší­re­né ulo­že­né pro­ce­dú­ry (Exten­ded Sto­red Pro­ce­du­res), kto­ré server po­nú­ka, mô­že útoč­ník veľ­mi jed­no­du­cho zneu­žiť s cie­ľom zís­kať pl­nú kon­tro­lu nad cie­ľo­vým server­om.

MS SQL server a SQL In­jec­tion
Da­ta­bá­zy, kto­ré bež­ia na MS SQL server­i, nie sú z poh­ľa­du útoč­ní­ka veľ­mi od­liš­né od da­ta­báz ty­pu MySQL. No sú pre útoč­ní­ka az­da vďač­nej­ším cie­ľom, pre­to­že chy­bo­vé vý­pi­sy, kto­ré server pri chy­be po­žia­dav­ky (query) pos­ky­tu­je, sú čas­to prí­nos­nej­šie ako na da­ta­bá­zo­vom sys­té­me MySQL.
Ďal­ším plu­som pre útoč­ní­ka je mož­nosť vkla­dať viac po­žia­da­viek od­de­le­ných ; a tým aj ove­ľa väč­šie mož­nos­ti pri na­bú­ra­va­ní ap­li­ká­cie.
Na úvod mu­sí­me po­dot­knúť, že spô­so­by SQL In­jec­tion, kto­ré sme pred­sta­vi­li v pred­chá­dza­jú­cich čas­tiach náš­ho se­riá­lu, fun­gu­jú aj na da­ta­bá­zach na MS SQL server­i, pre­to­že da­ta­bá­zo­vý server neh­rá veľ­kú úlo­hu pri úto­koch SQL In­jec­tion, pri kto­rých sú pou­ži­té zá­klad­né prí­ka­zy ja­zy­ka SQL. Ak server prí­kaz roz­poz­ná, vy­ko­ná ho. Pre­to sa v tej­to čas­ti po­zrie­me na niek­to­ré spô­so­by, kto­ré sú špe­ci­fic­ké pre MS SQL server.

Poz­nám­ka: Nas­le­du­jú­ce me­tó­dy úto­kov ne­mu­sia fun­go­vať na kaž­dom da­ta­bá­zo­vom server­i MS SQL. Ve­ľa zá­vi­sí od kon­fi­gu­rá­cie a od to­ho, ako je nap­rog­ra­mo­va­ný kód ap­li­ká­cie.

Pri ďal­ších prík­la­doch uve­die­me, ako bu­de vy­ze­rať po­žia­dav­ka, do kto­rej bu­de­me po­sie­lať vstup.

V ASP bu­de prí­kaz SQL vy­ze­rať tak­to:
"SE­LECT * FROM uzi­va­te­lia WHE­RE me­no = '" + lo­gin + "' AND hes­lo = '" +
hes­lo + "'";

Úto­ky:
Vstup bu­de pri kaž­dom prík­la­de útoč­ník vkla­dať do pre­men­nej lo­gin.

Zma­za­nie ta­buľ­ky:
Jed­no­du­chým spô­so­bom do­ká­že útoč­ník in­jek­to­vať kód SQL, kto­rý zma­že v da­ta­bá­ze ta­buľ­ku. Ke­by sa útoč­ník roz­ho­dol zma­zať ta­buľ­ku, ne­pot­re­bo­val by viac ako vlo­žiť do pre­men­nej lo­gin re­ťa­zec:
'; DROP TAB­LE uzi­va­te­lia--

Zma­za­nie da­ta­bá­zy:
Zma­za­nie da­ta­bá­zy pre­beh­ne po za­da­ní nas­le­du­jú­ce­ho prí­ka­zu:
'; DROP DA­TA­BA­SE na­zov_da­ta­ba­zy--

Vlo­že­nie zá­zna­mu do ta­buľ­ky:
Nie­ke­dy si mô­že útoč­ník zmy­slieť vlo­žiť ne­ja­ké úda­je do da­ta­bá­zy.
'; IN­SERT IN­TO uzi­va­te­lia VA­LUES (hod­no­ta1, hod­no­ta2, hod­no­ta3 ...hod­no­taN);

Rov­na­ko mô­že úda­je aj vy­ma­zať ale­bo pou­žiť prí­kaz UP­DA­TE, ak chce zme­niť ne­ja­ký údaj. Útoč­ník mô­že jed­no­du­cho vkla­dať zá­zna­my do akej­koľ­vek ta­buľ­ky (do kto­rej má prís­tup a op­ráv­ne­nie).

Server sa dá zho­diť jed­no­du­chým za­da­ním
'; shut­down; --

Exten­ded Sto­red Pro­ce­du­res (roz­ší­re­né ulo­že­né pro­ce­dú­ry)
To­to roz­ší­re­nie MS SQL server­a je uži­toč­né, no zá­ro­veň ne­bez­peč­né, pre­to­že ak sa útoč­ní­ko­vi po­da­rí in­jek­to­vať vhod­ný kód SQL, mô­že sa zmoc­niť ce­lé­ho server­a, a to nie­len da­ta­bá­zo­vé­ho server­a, ale ce­lé­ho stro­ja.

Ak útoč­ník chce, mô­že vy­užiť ulo­že­nú pro­ce­dú­ru xp_reg­read, aby pre­čí­tal z re­gis­trov aké­koľ­vek úda­je. Na zá­pis mô­že pou­žiť pro­ce­dú­ru xp_regwri­te.
K dis­po­zí­cii má ta­kis­to pro­ce­dú­ry xp_reg­de­le­te­key a xp_reg­de­le­te­va­lues.

Nas­le­du­jú­ci prí­kaz spus­tí uti­li­tu net.exe, kto­rá vy­pí­še všet­kých pou­ží­va­te­ľov v sys­té­me.
'; exec xp_cmdshell 'net user'

Útoč­ník má nao­zaj veľ­ké mož­nos­ti a mô­že do­kon­ca aj vy­tvo­riť účet v sys­té­me.
net user /add na­zov_no­ve­ho_uc­tu

Tým má pos­ta­ra­né o všet­ko. Ak pot­re­bu­je, bez prob­lé­mov mô­že spus­tiť exploi­ty na cie­ľo­vom sys­té­me a zís­kať tak úpl­nú kon­tro­lu nad sys­té­mom.
Je pre­to nao­zaj dô­le­ži­té za­brá­niť SQL In­jec­tion, le­bo to nie je len otáz­ka bez­peč­nos­ti dát v da­ta­bá­ze, ale za is­tých okol­nos­tí všet­kých dát v sys­té­me.
Ad­mi­nis­trá­tor mô­že vy­ma­zať pro­ce­dú­ry aj z hľa­dis­ka bez­peč­nos­ti, pre­to sa útoč­ní­ko­vi ne­mu­sí po­da­riť spus­tiť žiad­nu ulo­že­nú pro­ce­dú­ru.

Ako sa brá­niť?
Jed­noz­nač­ne tre­ba za­brá­niť SQL In­jec­tion, te­da in­jek­to­va­niu kó­du SQL do prí­ka­zu. Rie­še­nia sme vám pri­nies­li už v pred­chá­dza­jú­cich čas­tiach náš­ho se­riá­lu.

Skon­ver­to­va­nie pou­ží­va­teľ­ské­ho vstu­pu na čí­sel­nú hod­no­tu v ASP:

Fun­ction kon­ver­tuj_na_in­te­ger(By­Val vstup)
        If Is­Nu­me­ric(vstup) Then
kon­ver­tuj_na_in­te­ger = Fix(vstup);
        El­se

kon­ver­tuj_na_in­te­ger = 0
        End If
End Fun­ction

 

Zdvo­je­nie jed­no­du­chých úvo­dzoviek v ASP vy­ko­ná nas­le­du­jú­ca fun­kcia:

fun­ction es­ca­puj_vstup(By­Val vstup )
vstup = rep­la­ce(in­put, "'", "''")
es­ca­puj_vstup = vstup
end fun­ction

Skon­ver­to­va­nie pou­ží­va­teľ­ské­ho vstu­pu na čí­sel­nú hod­no­tu v PHP:

fun­ction kon­ver­tuj_na_in­te­rer($vstup) {
re­turn (int)  (trim($vstup) +0);
}

Vlas­tné ulo­že­né pro­ce­dú­ry
Dosť sa roz­ší­ril ná­zor, že ulo­že­né pro­ce­dú­ry rie­šia všet­ky prob­lé­my spo­je­né s ochra­nou ap­li­ká­cií pro­ti SQL In­jec­tion. Je sí­ce prav­da, že ulo­že­né pro­ce­dú­ry – SP – zna­me­na­jú zlep­še­nie bez­peč­nos­ti, ale iba zlep­še­nie. Ulo­že­né pro­ce­dú­ry nie sú navr­hnu­té na ochra­nu pred SQL In­jec­tion. Sú navr­hnu­té skôr na zrý­chle­nie prá­ce da­ta­bá­zo­vé­ho server­a s da­ta­bá­zou a na po­hodl­nej­šiu prá­cu prog­ra­má­to­ra, pre­to­že sú ek­vi­va­len­tom fun­kcií v prog­ra­mo­va­cích ja­zy­koch. No vi­di­teľ­né vý­sled­ky v rých­los­ti sú pri veľ­kých server­och so stov­ka­mi ti­síc zá­zna­mov v da­ta­bá­zach.
Po­rov­naj­te nas­le­du­jú­ce dve ukáž­ky a po­cho­pí­te, kde je a kde nie je mož­né in­jek­to­vať kód SQL.

SQL In­jec­tion sa ne­po­da­rí:

CREA­TE PRO­CE­DU­RE Zob­raz­Pro­fi­lU­zi­va­te­la
@me­no_uzi­va­te­la var­char(40)
AS
SE­LECT me­no, priez­vis­ko, da­tum_na­ro­de­nia
FROM uzi­va­te­lia
WHE­RE uzi­va­tel = @me­no_uzi­va­te­la
GO

SQL In­jec­tion je mož­ný:

CREA­TE PRO­CE­DU­RE Zob­raz­Pro­fi­lU­zi­va­te­la
@me­no_uzi­va­te­la var­char(40)
AS
BE­GIN
DEC­LA­RE @sql_query var­char(200)
SET @sql_query = "
SE­LECT me­no, priez­vis­ko, da­tum_na­ro­de­nia
FROM uzi­va­te­lia
WHE­RE uzi­va­tel = '" + @me­no_uzi­va­te­la + "'"
EXEC(@sql_query)
END

Dob­ré je ta­kis­to mať správ­ne na­kon­fi­gu­ro­va­ný MS SQL server, pou­ží­va­teľ­ské prá­va nas­ta­ve­né tak, aby ne­bo­lo mož­né v prí­pa­de in­jek­to­va­nia kó­du SQL zma­zať da­ta­bá­zy atď.

SP sú dob­rý spô­sob, ako ochrá­niť ap­li­ká­ciu a SQL server pred útok­mi ty­pu SQL In­jec­tion. Je však dô­le­ži­té, aby ste v prí­pa­de, že sa spo­lie­ha­te na SP ako na ochra­nu pred SQL In­jec­tion, správ­ne SP prog­ra­mo­va­li. Pre­to ne­pou­ží­vaj­te ďal­ší stu­peň par­so­va­nia prí­ka­zu SQL - EXEC()/EXECU­TE(), pre­to­že po­tom sa už SQL In­jec­tion po­da­rí. Je to spô­so­be­né tým, že SQL server už oča­ká­va do pa­ra­met­ra len je­ho ob­sah, a pre­to je prip­ra­ve­ný zob­rať ako pa­ra­me­ter aký­koľ­vek re­ťa­zec aj s me­taz­nak­mi, kto­ré ošet­rí, aby stra­ti­li svo­ju ria­dia­cu fun­kciu.

No v prí­pa­de, že v ulo­že­nej pro­ce­dú­re vo­lá­te eš­te Exec(@po­zia­dav­ka), mu­sí­te v zá­uj­me ochra­ny pred SQL In­jec­tion ošet­riť vstup (pa­ra­met­re, kto­ré vkla­dá pou­ží­va­teľ) sa­mi. Je dob­rým zvy­kom ošet­ro­vať vstup aj pri pou­ži­tí SP bez ďal­šie­ho par­so­va­nia, kde nie je SQL In­jec­tion mož­né. Útoč­ník mô­že to­tiž vlo­žiť do pa­ra­met­ra, kde má byť in­te­ger, ne­ja­ký re­ťa­zec, čo vy­ús­ti do chy­by.

Zá­ver
Té­ma SQL In­jec­tion je ob­siah­la. Špe­ci­fic­ké čr­ty MS SQL server­a sí­ce umož­ňu­jú pre prog­ra­má­to­ra zjed­no­du­še­nú prá­cu, ale zá­ro­veň útoč­ní­kom viac ot­vá­ra­jú dve­re do ne­za­bez­pe­če­nej ap­li­ká­cie. Akú­si os­no­vu sme vám pri­nies­li v tom­to člán­ku, ale bez do­da­toč­ných in­for­má­cií sa ur­či­te ne­zao­bí­de­te. Naj­jed­no­duch­šia ces­ta je pre mno­hých pou­ži­tie SP bez ďal­šie­ho par­so­va­nia fun­kciou EXEC()/EXECU­TE(). Pre­to je ško­da, že len má­lo prog­ra­má­to­rov tú­to mož­nosť vy­uží­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

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á