SQL ներմուծում

SQL ներմուծում, կոդի ներմուծման տեխնիկա, որն օգտագործվում է տվյալների վրա հիմնված հավելվածների վրա հարձակվելու համար, որտեղ վտանգավոր SQL հայտարարությունները տեղադրվում են մուտքի դաշտում՝ կատարման համար (օրինակ՝ տվյալների բազայի բովանդակությունը հարձակվողին նետելու համար)։ SQL ներմուծումը պետք է օգտագործի հավելվածի ծրագրային ապահովման անվտանգության խոցելիությունը, օրինակ, երբ օգտվողի մուտքագրումը կամ սխալ է զտված SQL հայտարարություններում ներկառուցված տողերի բառացի փախուստի նիշերի համար, կամ օգտագործողի մուտքագրումը խիստ մուտքագրված չէ և անսպասելիորեն կատարվում է։ SQL հիմնականում հայտնի է որպես հարձակման վեկտոր կայքերի համար, բայց կարող է օգտագործվել ցանկացած տեսակի SQL տվյալների բազայի վրա հարձակվելու համար։ 
SQL ներմուծման հարձակումները թույլ են տալիս հարձակվողներին կեղծել ինքնությունը, կեղծել առկա տվյալները, առաջացնել հերքման հետ կապված խնդիրներ, ինչպիսիք են գործարքների չեղարկումը կամ մնացորդների փոփոխությունը, թույլ տալ ամբողջական բացահայտել համակարգի բոլոր տվյալները, ոչնչացնել տվյալները կամ այլ կերպ անհասանելի դարձնել դրանք և դառնալ ադմինիստրատորներ տվյալների բազայի սերվերում։
2012-ի ուսումնասիրության մեջ նկատվեց, որ միջին վեբ հավելվածը ամսական ստանում էր չորս հարձակման արշավ, իսկ մանրածախ առևտրականները երկու անգամ ավելի շատ հարձակումներ էին ստանում, քան մյուս ոլորտները։


== Պատմությունը ==
SQL ներմուծման առաջին հանրային քննարկումները սկսեցին հայտնվել մոտ 1998 թ;օրինակ՝ Phrack Magazine-ում 1998թ հոդվածը։


== Կազմությունը ==
SQL ներմուծումը (SQLI) Open Web Application Security Project-ի կողմից համարվում էր 2007 և 2010 թվականների վեբ հավելվածների լավագույն 10 խոցելիություններից մեկը։ 2013 թվականին SQLI-ն գնահատվել է որպես թիվ մեկ հարձակում OWASP-ի լավագույն տասնյակում։ SQL ներմուծման չորս հիմնական ենթադաս կա․

Դասական SQLI
Կույր SQL ներմուծում կամ եզրակացություն
Տվյալների բազայի կառավարման համակարգի հատուկ SQLI
Բաղադրյալ SQLISQL ներմուծում+ անբավարար նույնականացում
SQL ներմուծում + DDoS հարձակումներ 
SQL ներմուծում + DNS Ընդհատում
SQL ներմուծում + XSSThe Storm Worm-ը Compounded SQLI-ի ներկայացումներից մեկն է։
Այս դասակարգումը ներկայացնում է SQLI-ի վիճակը՝ հաշվի առնելով դրա էվոլյուցիան մինչև 2010 թվականը. հետագա կատարելագործումը շարունակվում է։


== Տեխնիկական իրականացումներ ==


=== Սխալ կառուցված SQL հայտարարություններ ===
Ներմուծման այս ձևը հիմնված է այն փաստի վրա, որ SQL հայտարարությունները բաղկացած են ինչպես տվյալներից, որոնք օգտագործվում են SQL հայտարարության կողմից, այնպես էլ հրամաններից, որոնք վերահսկում են, թե ինչպես է SQL հայտարարությունը կատարվում։
SQL ներմուծումը տեղի է ունենում, երբ հատուկ մշակված օգտվողի մուտքագրումը մշակվում է ստացող ծրագրի կողմից այնպես, որ մուտքագրումը թույլ է տալիս դուրս գալ տվյալների համատեքստից և մուտքագրել հրամանի համատեքստ։ Սա թույլ է տալիս հարձակվողին փոխել SQL հայտարարության կառուցվածքը, որը կատարվում է։


=== Կույր SQL ներմուծում ===
Կույր SQL ներմուծուման օգտագործվում է, երբ վեբ հավելվածը խոցելի է SQL ներմուծման համար, սակայն ներմուծման արդյունքները տեսանելի չեն հարձակվողին։ Խոցելիություն ունեցող էջը կարող է չլինել այնպիսին, որը ցուցադրում է տվյալներ, այլ կցուցադրվի տարբեր կերպ՝ կախված այդ էջի համար կանչված օրինական SQL հայտարարության մեջ ներարկված տրամաբանական հայտարարության արդյունքներից։ Հարձակման այս տեսակը ավանդաբար համարվում է ժամանակատար, քանի որ յուրաքանչյուր վերականգնված բիթերի համար անհրաժեշտ էր ստեղծել նոր հայտարարություն, և կախված դրա կառուցվածքից՝ հարձակումը կարող է բաղկացած լինել բազմաթիվ անհաջող հարցումներից:Վերջին առաջխաղացումները թույլ են տվել յուրաքանչյուր հարցում վերականգնել մի քանի բիթ, առանց անհաջող հարցումների, ինչը թույլ է տալիս ավելի հետևողական և արդյունավետ արդյունահանում։ Կան մի քանի գործիքներ, որոնք կարող են ավտոմատացնել այս հարձակումները, երբ հաստատվի խոցելիության գտնվելու վայրը և թիրախային տեղեկատվությունը։


=== Երկրորդ կարգի SQL ներմուծում ===
Երկրորդ կարգի SQL ներմուծումը տեղի է ունենում, երբ ներկայացված արժեքները պարունակում են վտանգավոր հրամաններ, որոնք պահվում են, այլ ոչ թե անմիջապես կատարվում։ Որոշ դեպքերում հավելվածը կարող է ճիշտ կոդավորել SQL հայտարարությունը և պահել այն որպես վավեր SQL: Այնուհետև, այդ հավելվածի մեկ այլ մաս, առանց SQL ներմուծումից պաշտպանվելու հսկիչների, կարող է կատարել այդ պահված SQL հայտարարությունը։ Այս հարձակումը պահանջում է ավելի շատ գիտելիքներ այն մասին, թե ինչպես են հետագայում օգտագործվում ներկայացված արժեքները։ Վեբ հավելվածների անվտանգության ավտոմատ սկաներները հեշտությամբ չեն հայտնաբերի SQL ներմուծումների այս տեսակը նաև կարող է անհրաժեշտ լինել ձեռքով հրահանգել, թե որտեղ է պետք ստուգել ապացույցների համար, որ ներմուծման փորձ է կատարվում։


== Մեղմացում ==
SQL ներմուծումը հայտնի հարձակում է և հեշտությամբ կանխվում է պարզ միջոցներով։ 2015 թվականին TalkTalk-ի վրա SQL ներմուծման ակնհայտ հարձակումից հետո BBC-ն հաղորդում է, որ անվտանգության փորձագետները ապշած էին, որ նման խոշոր ընկերությունը խոցելի կլինի դրա համար։


=== Պարամետրացված հայտարարություններ ===
Զարգացման պլատֆորմների մեծ մասում կարող են օգտագործվել պարամետրերով աշխատող պարամետրացված հայտարարություններ (երբեմն կոչվում են տեղապահներ(անգլ՝ placeholders ) կամ կապող փոփոխականներ)՝ օգտատիրոջ մուտքագրումը հայտարարությունում ներառելու փոխարեն։ Տեղապահը կարող է պահել միայն տվյալ տեսակի արժեք, այլ ոչ թե կամայական SQL հատված։ Հետևաբար, SQL ներմուծումը պարզապես կդիտարկվի որպես տարօրինակ (և հավանաբար անվավեր) պարամետրի արժեք։ Շատ դեպքերում SQL հայտարարությունը ամրագրված է, և յուրաքանչյուր պարամետր սկալյար է, այլ ոչ թե աղյուսակ։
Հեշտ ասած, պարամետրացված հարցումների օգտագործումը կարող է միանշանակ կանխել SQL ներմուծումը։ Սա հիմնականում նշանակում է, որ ձեր փոփոխականները հարցումների տողեր չեն, որոնք կընդունեն կամայական SQL մուտքեր, այնուամենայնիվ, տվյալ տեսակների որոշ պարամետրեր անպայման անհրաժեշտ են։ Պարամետրացված հարցումները պահանջում են, որ մշակողը սահմանի ամբողջ կոդը։ Հետևաբար, առանց պարամետրացված հարցումների, յուրաքանչյուրը կարող էր դաշտում տեղադրել ցանկացած տեսակի SQL կոդ և ջնջել տվյալների բազան։


=== Շրջանցում ===
Ներարկումները կանխելու հանրաճանաչ, թեև սխալների հակված և, ի վերջո, դատապարտված միջոցը SQL-ում հատուկ նշանակություն ունեցող բոլոր նիշերից խուսափելն է։ SQL DBMS-ի ձեռնարկը բացատրում է, թե որ նիշերն ունեն հատուկ նշանակություն, ինչը թույլ է տալիս ստեղծել թարգմանության կարիք ունեցող նիշերի համապարփակ սև ցուցակ (անգլ․՝ blacklist)։ 
PHP-ն ունի նմանատիպ գործառույթներ տվյալների բազայի այլ համակարգերի համար։ Ֆունկցիան աշխատում է նիշերից խուսափելու համար և օգտագործվում է հատկապես տվյալների բազաներում հարցումներ կատարելու համար, որոնք չունեն PHP-ում խուսափան գործառույթներ։ Այն վերադարձնում է մի տող՝ հետադարձ տողերով, նախքան նիշերը, որոնք պետք է խուսափեն տվյալների բազայի հարցումներում, և այլն։ Այս նիշերն են մեկ մեջբերում ('), կրկնակի մեջբերում ("), հետին կտրվածք (\) և NUL (NULL բայթ)։
Խուսափած տողերի սովորական փոխանցումը SQL-ին հակված է սխալների, քանի որ հեշտ է մոռանալ տրված տողից խուսափումը։ Մուտքագրումն ապահովելու համար թափանցիկ շերտ ստեղծելը կարող է նվազեցնել այս սխալի հակվածությունը, եթե ոչ ամբողջությամբ վերացնել այն։


=== Նմուշի ստուգում ===
Ամբողջական, լողացող կամ բուլյան, լարային պարամետրերը կարող են ստուգվել, եթե դրանց արժեքը վավեր է տվյալ տեսակի համար։ Տողերը, որոնք պետք է հետևեն որոշակի խիստ օրինաչափության (ամսաթիվ, UUID, միայն այբբենական թվային և այլն), կարող են ստուգվել, եթե դրանք համապատասխանում են այս օրինաչափությանը։


=== Տվյալների բազայի թույլտվությունները ===
Վեբ հավելվածի կողմից օգտագործվող տվյալների բազայի մուտքի թույլտվությունները սահմանափակելը միայն այն է, ինչ անհրաժեշտ է, կարող է օգնել նվազեցնել ցանկացած SQL ներմուծման գրոհների արդյունավետությունը, որոնք օգտագործում են վեբ հավելվածում առկա սխալները։

Օրինակ, Microsoft SQL Server-ի վրա ,տվյալների բազայի մուտքը կարող է սահմանափակվել համակարգի որոշ աղյուսակների վրա ընտրելու հնարավորությունից, ինչը կսահմանափակի շահագործումները, որոնք փորձում են JavaScript-ը տեղադրել տվյալների բազայի բոլոր տեքստային սյունակներում։


== Օրինակներ ==
2002 թվականի փետրվարին Ջերեմիա Ջեքսը հայտնաբերեց, որ Guess.com-ը խոցելի է SQL ններմուծման հարձակման համար, ինչը թույլ է տալիս յուրաքանչյուրին, ով կարող է ճիշտ մշակված URL ստեղծել՝ կայքի հաճախորդների տվյալների բազայում 200,000+ անուններ, կրեդիտ քարտերի համարներ և պիտանելիության ժամկետներ տեղադրելու համար։
2005 թվականի նոյեմբերի 1-ին դեռահաս հաքերն օգտագործել է SQL ներմուծում՝ ներխուժելու Tech Target խմբի թայվանական տեղեկատվական անվտանգության ամսագրի կայք և գողանալ հաճախորդների տեղեկությունները։
2006 թվականի հունվարի 13-ին ռուս համակարգչային հանցագործները ներխուժեցին Ռոդ Այլենդի կառավարական կայք և իբր գողացան կրեդիտ քարտի տվյալները այն անձանցից, ովքեր առցանց բիզնես են վարել պետական ​​գերատեսչությունների հետ։
2006 թվականի մարտի 29-ին հաքերը հայտնաբերեց SQL ներմուծման թերություն Հնդկաստանի կառավարության զբոսաշրջության պաշտոնական կայքում։
2008թ. մայիսին Չինաստանում գտնվող սերվերային ֆերմա օգտագործեց ավտոմատացված հարցումներ Google-ի որոնողական համակարգին՝ բացահայտելու SQL սերվերի կայքերը, որոնք խոցելի էին ավտոմատացված SQL ներարկման գործիքի հարձակման նկատմամբ։
2009 թվականի դեկտեմբերին հարձակվողը խախտել է RockYou պարզ տեքստային տվյալների բազան, որը պարունակում է մոտ 32 միլիոն օգտատերերի չգաղտնագրված օգտանուններ և գաղտնաբառեր՝ օգտագործելով SQL ներմուծան հարձակումը։
Սեպտեմբերի 19-ին 2010-ի Շվեդիայի համընդհանուր ընտրությունների ժամանակ ընտրողը փորձեց կոդի ներմուծում՝ ձեռքով գրելով SQL հրամաններ՝ որպես գրելու քվեարկության մաս։
2010 թվականի նոյեմբերի 8-ին բրիտանական թագավորական նավատորմի կայքը վտանգի ենթարկվեց Tin Kode անունով ռումինացի հաքերների կողմից՝ օգտագործելով SQL ներմուծում։
2011 թվականի փետրվարի 5-ին HBGary, տեխնոլոգիական անվտանգության ընկերություն, ներխուժել է LulzSec-ը՝ օգտագործելով SQL ներմուծում իրենց CMS-ի վրա հիմնված կայքում։
2011 թվականի ապրիլի 11-ին Barracuda Networks-ը վտանգի ենթարկվեց՝ օգտագործելով SQL ներմուծման թերությունը։ Ձեռք բերված տեղեկությունների թվում էին աշխատակիցների էլեկտրոնային փոստի հասցեները և օգտվողների անունները:.
2011թ. ապրիլի 27-ին 4 ժամ տևողությամբ ավտոմատացված SQL ներմուծման հարձակում տեղի ունեցավ Broadband Reports կայքում, որը կարողացավ հանել օգտվողի անուն/գաղտնաբառ զույգերի 8%-ը.
2011 թվականի հունիսի 1-ին LulzSec խմբի «հաքթիվիստները» մեղադրվեցին SQLI-ի միջոցով գողանալու կտրոններ, ներբեռնման բանալիներ և գաղտնաբառեր, որոնք պահվում էին պարզ տեքստով Sony-ի կայքում՝ մուտք գործելով միլիոն օգտատերերի անձնական տվյալները.
2012 թվականի հուլիսին հաքերային խումբը գողացել է Yahoo!-ից 450,000 մուտքի հավատարմագրեր։ Մուտքագրումները պահվում էին պարզ տեքստով և իբր վերցված էին Yahoo ենթադոմեյնից՝ Yahoo! Ձայներ. Խումբը խախտել է Yahoo-ի անվտանգությունը՝ օգտագործելով «միության վրա հիմնված SQL ներմուծման տեխնիկա»։
2013 թվականի հունիսի 27-ին «RedHack» հաքերային խումբը կոտրել է Ստամբուլի վարչական կայքը։ Նրանք պնդում էին, որ կարողացել են ջնջել ջրի, գազի, ինտերնետի, էլեկտրաէներգիայի, հեռախոսային ընկերություններին ունեցած պարտքերը։ Բացի այդ, նրանք հրապարակեցին ադմինիստրատորի օգտանունը և գաղտնաբառը, որպեսզի այլ քաղաքացիներ մուտք գործեն և վաղ առավոտյան մարեն իրենց պարտքերը։ Նրանք այդ լուրը հայտնել են Twitter-ից։
2013 թվականի նոյեմբերի 4-ին «RaptorSwag» հաքերային խումբն իբր կոտրել է Չինաստանի կառավարության 71 տվյալների բազա՝ օգտագործելով SQL ներմուծման հարձակման Չինաստանի միջազգային առևտրի պալատի վրա։ Արտահոսած տվյալները հրապարակվել են Anonymous-ի հետ համագործակցությամբ։
2014 թվականի փետրվարի 2-ին AVS TV-ն ուներ 40,000 հաշիվներ, որոնք արտահոսել էին հաքերային խումբը, որը կոչվում էր @deletesec: 
2015 թվականի հոկտեմբերին SQL ներմուծման հարձակումն օգտագործվել է բրիտանական TalkTalk հեռահաղորդակցական ընկերության սերվերներից 156,959 հաճախորդների անձնական տվյալները գողանալու համար՝ օգտվելով ժառանգական վեբ պորտալի խոցելիությունից։
2020 թվականի օգոստոսին SQL ներմուծման հարձակումը կիրառվեց Ստենֆորդի շատ ուսանողների ռոմանտիկ հետաքրքրությունների մասին տեղեկատվություն ստանալու համար՝ Link-ի կողմից տվյալների ախտահանման անապահով ստանդարտների հետևանքով, որը հիմնադրվել էր համալսարանում բակալավրիատի Իշան Գանդիի կողմից։
2021 թվականի սկզբին 70 գիգաբայթ տվյալներ են արտահանվել ծայրահեղ աջակողմյան Gab կայքից SQL ներմուծման հարձակման միջոցով։ Խոցելիությունը ներմուծվել է Gab կոդերի բազա Ֆոսկո Մարոտտոյի՝ Gab-ի CTO-ի կողմից:Երկրորդ հարձակումը Gab-ի դեմ սկսվեց հաջորդ շաբաթ՝ օգտագործելով առաջին հարձակման ժամանակ գողացված OAuth2 նշանները։


== Ծանոթագրություններ ==


== Արտաքին հղումներ ==
SQL Injection Knowledge Base, by Websec.
WASC Threat Classification - SQL Injection Entry, by the Web Application Security Consortium.
Why SQL Injection Won't Go Away Archived 2012-11-09 at the Wayback Machine., by Stuart Thomas.
SDL Quick security references on SQL injection by Bala Neerumalla.
How security flaws work: SQL injection