SQL-ինյեկցիա, ի՞նչ է սա

ՄԱՍ 1.

SQL Injection-ը բավականին լավ գործիք է հակերի ձեռքին, որպեսզի ստանա ուրիշի սերվեր մուտք գործելու հնարավորություն: Եվ չնչին ցանկության դեպքում /իսկ հակերների մոտ այդ չնչին ցանկությունը այլ մարդկանց համար ահռելի մեծ է/ նա կստանա այդ հնարավորությունը :)

Coder inside

Մեր ժամանակներում, տվյալների բազայի հետ աշխատում են համարյա բոլոր ծրագրավորման լեզուներով, օրինակ` BASIC, C++, Java, PERL, PHP, Assembler և նույնիսկ JavaScript! Շատ հաճախ տվյալների բազան օգտագործում են ֆինանսական որոշակի խնդիրների լուծումների, հաշվապահության, կադրերի կառավարման և շատ այլ ոլորտների մեջ, բայց իրենց մեծ տարածումը տվյալների բազաները գտան հենց ինտերնետում:

Տվյալների բազաները հաճախ օգտագործվում են ՎԵԲ ԾՐԱԳՐԱՎՈՐՄԱՆ մեջ: Նրանք օգնության են հասնում օրինակ գրանցված անդամների տվյալների պահպանման, կայքում որոնում իրականացնելու և շատ այլ դեպքերում: Տվյալների բազաներին դիմելու համար օգտագործվում են այսպես ասած սերվերային տեխնոլոգիաները, ինչպիսիք են` PHP, PERL, ASP և այլն: Ու հենց այստեղից էլ սկսվում է ամենահետաքրքիրը:  Որովհետև երբ սերվերի վրա տեղադրված են բոլոր թարմացումները, իսկ ֆայրվոլն արգելափակում է մուտքը բոլոր պորտերով, բացի 80-ից, կամ երբ անհրաժեշտ է մուտք գործել համակարգ` որոշակի տվյալների համար, հակերին միայն մնում է օգտվել ինչի՞ց… Դե իհարկե  SQL Injection-ից/այսուհետ SQL-ինյեկցիա/: Այս “գործողության” իմաստը կայանում է ՎԵԲ ՏԵԽՆՈԼՈԳԻԱՆԵՐԻ սխալների օգտագործումը SQL-ի օգնությամբ: Բանը նրանում է, որ շատ վեբ կայքեր, իրենց գրանցված անդամների տվյալների մշակման համար կազմում են որոշակի SQL-հրամաններ, որոնք կատարում են փոփոխություններ տվյալների բազայի մեջ:  Այս հրամանների օգտագործումը կարող է հանգեցնել հետաքրքիր արդյունքների…

SQL Injection

Հարձակման այս մեթոդը հասկանալու համար պատկերացրեք, թե մտել եք մի կայք, որպեսզի ներբեռնեք շատ կարևոր ինֆորմացիա, բայց պարզում եք, որ այդ ինֆորմացիան կարող է ներբեռնել միայն գրանցված անդամը, իսկ գրանցումը վճարովի է :) Իսկական ժամանակն է հիշել, թե ինչպիսի խնամքով պետք է վերաբերվել  SQL տվյալների բազային: Օրինակ լոգինի և գաղտնաբառի ստուգումը կատարող կոդը կարող է ունենալ հետևյալ տեսքը`

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user='$login' AND
pass='$password'");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// AUTHENTICATION OK
}
else
{
// AUTHENTICATION ERROR
}

Ես ավելացրել եմ երկու մեջբերում, առաջինը` “AUTHENTICATION OK “, որի փոխարեն պետք գրված լինի ճիշտ մուտքագրված տվյալների դեպքում կատարվող կոդը, իսկ երկրորդը` “AUTHENTICATION ERROR “, որին էլ պետք է փոխարինի սխալ մուտքագրված տվյալների դեպքում կատարվող կոդը: Ֆորման լրացնելուց հետո, բրաուզերում կարող ենք տեսնել մոտավորապես էսպիսի մի տող` http://www.server.com?login=user&password=31337, որտեղ  www.server.com-ը այն սերվերի անունն է, որի մեջ փորձում ենք մխրճվել: Հիմա փորձենք պատկերացնել թե ինչ SQL հարցում կարող է զբաղվել մեր մուտքագրած տվյալների մշակմամբ: Այն մոտավորապես կունենա հետևյալ տեսքը`

SELECT * FROM users WHERE login='user' AND password='31337'

Սա մոտավոր նշանակում է հետևյալը` վերադարձրու ինձ users աղյուսակի բոլոր այն տվյալները, որոնց լոգինը user է, իսկ գաղտնաբառը` 31337: Եթե գոյություն ունի այդպիսի տվյալ, ուրեմն տվյալ մարդը գրանցված է… Բայց որոշ հատուկ դեպքերում, ամեն ինչ կարելի է ձևափոխել: Հաշվի է առնվում այն հանգամանքը, որ SQL-ում կան AND և OR հրամաններ, որոնք համապատասխանաբար նշանակում են ԵՎ, ԿԱՄ :  Օրինակ ինչն է մեզ խանգարում հարցումը կատարել այսպես`

SELECT * FROM users WHERE login='user' AND password='31337' AND email='user@server.com'

Այս դեպքում կստուգվի նաև email փոփոխականը: Բայց եկեք կանգ չառնենք ԵՎ-ի վրա, որովհետև մեզ ավելի շատ հետաքրքիր է նրա ընկերը` ԿԱՄ-ը: Օրինակ ինչ կլինի եթե գրենք հարցումն այսպես`

SELECT * FROM users WHERE login='user' OR 1=1--' AND password='31337'

Նախ ասեմ, որ երկու գծերը` “–”, նշանակում են որ հարցումն այդքանով ավարտվում է, և դրանից հետո եկող տվյալները չեն ընթերցվում համակարգի կողմից! Ստացվում է, որ մենք կատարել ենք հետևյալ հարցումը`

SELECT * FROM users WHERE login='user' OR 1=1

Ինչպես տեսնում եք, մենք ավելացրեցինք ևս մեկ պայման`”1=1″, այսինքն համակարգը կտա մեզ ճիշտ արդյունք, եթե լոգինը լինի  user կամ 1=1: Բայց մաթեմատիկան մեզ հուշում է, որ 1-ը հենց հավասար է 1-ին (չնայած ինչեր ասես հիմա չեն հորինի :-D ): Դե իսկ հիմա, մեր SQL հարցումը տեղափոխենք բրաուզեր` http://www.server.com?login=user or 1=1–&password=31337 :  Սա հանգեցնում է նրան, որ կապ չունի թե մենք ինչ լոգին ենք լրացրել, իսկ համակարգը մեզ ճիշտ արդյունքն է վերադարձնում:

Բայց այս ամբողջն ընդհամենը թեորիա է: Պրակտիկայում մեզ անհայտ է, թե ինչպես է կատարվում հարցումը, ինչ պարամետրեր են փոխանցվում և ինչ հաջորդականությամբ: Դրա համար նույն գործողությունը`”user’ OR 1=1–”, պետք է կատարել բոլոր փոփոխականների համար: Ինչպես նաև պետք է ստուգել ուղարկող ֆորմայի մեջ արդյոք կան թաքնված փոփոխականներ, որոնք սովորաբար լինում են այս տեսակի` “<INPUT TYPE=HIDDEN VALUE=’value’ >”: Եվ որ ամենակարևորն է, պետք է իմանալ, թե իրականում ինչ անունով սկրիպտ է ստանալու Ձեր ուղարկած տվյալները:

Իսկ ինչ վերաբերում է իմ բերած օրինակին, այն կարող էր լինել օրինակ այսպիսին`

SELECT * FROM users WHERE (login='user' AND password='31337')
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * FROM users WHERE login=user AND password=31337

և այլն…

Այս դեպքում պետք է փորձել բոլոր հնարավոր տարբերակները`

‘ OR 1=1–
” OR 1=1–
OR 1=1–
‘ OR ‘a’='a
” OR “a”=”a
‘) OR (‘a’='a
OR ’1′=’1′

Ամեն ինչ կախված է սկրիպտը գրող վեբ ծրագրավորողից և նրանից, թե ինչի համար է գրված սկրիպտը: Դե քանի որ ամեն մարդ սովոր է աշխատանքը կատարել իր ոճով, շատ հավանական է, որ ծրագրավորողը ընտրած լինի ամենադժվար տարբերակը: Դրա համար էլ պետք չէ հանձնվել, եթե համակարգը հանկարծ չընդունի Ձեր կողմից տրված տվյալները: Պետք է սոտւգել հնարավորինս շատ տարբերակներ:

— Շարունակելի —

3 Responses to “SQL-ինյեկցիա, ի՞նչ է սա”

  1. iReporter says:

    իմ լավ ընգերը որոշել ա վիրտուալ հակերության դասընթացներ կազմակերպի :) ))

  2. Vardan Grigoryan says:

    Չէ, Վարդ ջան, ուղղակի զգուշացնում եմ, որ մարդիկ ապահովագրեն իրենց սկրիպտերը ինյեկցիաներից:

  3. Elya says:

    SQL ինյեկցիայի մասին ես տեղյակ եմ, ու ասեմ, որ բավականին վտանգավոր բան է, քանի որ ամենաթանկ բանը ինֆորմացիան է, որը պահվում է բազայում, և նրա կորուստը կամ սխալ փոփոխումը կարող է հանգեցնել շատ մեծ խնդիրների: SQL ինյեկցիայի խնդիրը կա ոչ միայն WEB համակարգերի մոտ, այլ այն բոլոր կիրառություններում, որոնք պահանջում են համակարգին մուտք անելու համար մուտքագրել log in և գաղտնաբառ, որից հետո այդ համակարգը տվյալները բեռնում է տվյալների բազայից: Դրա համար ներկայիս տեխնոլոգիաները, օրինակ .Net միջավայրը. հնարավորություն է տալիս խուսափել sql ինյեկցիաներից, օգտագործելով հատուկ կլասսեր,որոնք ձևավորում են քո sql հարցումը`բացառելով ինյեկցիաները:
    Թէ ինչպես է դա արվում, երևի ավելի մանրամասն կասեմ հետո, մի քիչ երկարա: :) :)

Leave a Reply






Վճարված գովազդ ::