Ծրագրային անվտանգություն՝ SQL Injection (մաս 1)
Tags: security, sql, injection, owasp
Published: 2021-05-20 15:28:12

SQL injection֊ը հանդիսանում է վեբ֊ծրագրերի ամենատարածված խոցելիություններից (vulnerability) մեկը և գտնվում է OWASP հիմնադրամի 10 ամենատարածված խոցելիությունների ցանկի [OWASP Top 10](https://owasp.org/www-project-top-ten/) առաջին հորիզոնականում։
> Իրականում OWASP Top 10 ցանկի առաջին հորիզոնականում տեղ է գտել ավելի ընդհանրական **Injection** տեսակը, իսկ SQL injection֊ը դրա տեսակներից մեկն է։

Փորձենք հասկանալ ինչու է առաջանում խոցելիության այս տեսակը, ինչ հնարավորություններ է ընձեռում հարձկավողին և պաշտպանության ինչ միջոցներ կան։

Օրինական ճանապարհով ծրագրային անվտանգություն ուսումնասիրելու համար կարելի է օգտվել հատուկ այդ նպատակով պատրաստված խոցելի ծրագրերից, ինչպիսիք են օրինակ [OWASP Juice Shop֊ը](https://owasp.org/www-project-juice-shop/) և [bWAPP֊ը](http://www.itsecgames.com/)։ Նշվածներից բացի գոյություն ունեն բազմաթիվ այլ խոցելի ծրագրեր, որոնց ցանկին կարելի է ծանոթանալ [այստեղ](https://owasp.org/www-project-vulnerable-web-applications-directory/)

## Խոցելիության էությունը
Դիտարկենք SQL տվյալների բազայի պարզագույն օրինակ։ Ենթադրենք, ունենք տվյալների բազա, որում պահվում են տվյալ ընկերության ապրանքանիշները, որոնց մի մասը դեռևս չի թողարկվել։ 
```sql
SELECT * FROM products;
```
|ID|name|released|
|--|----|--------|
|1|Laptop|1|
|2|Smartphone|1|
|3|Time machine|0|
|4|Teleporter|0|
|5|Electric vehicle|1|
|6|3D printer|1|
|7|Secret product|0|

Ընկերության վեբ կայքում թվարկվում են բոլոր **թողարկված** ապրանքանիշները։
```sql
SELECT * FROM products WHERE released=1;
```
Բացի այդ, կայքում կարելի է կատարել որոնում թողարկված ապրանքանիշների մեջ։ Ենթադրենք, օգտատիրոջ մուտքագրած ցանկացած բանալի բառով անմիջապես կազմվում է հարցում և ուղարկվում տվյալների բազային։ Այս դեպքում օգտատերը կարող է որոնել *phone* բանալի բառը՝
```sql
SELECT * FROM products 
WHERE name LIKE '%phone%' AND released=1;
```
|ID|name|released|
|--|----|--------|
|2|Smartphone|1|

> **Իսկ ի՞նչ եթե մուտքագրվի հատուկ պատրաստված այնպիսի "բանալի բառ", որը տվյալների բազայի կողմից դիտարկվի որպես հրաման։**

Հենց սրանում էլ կայանում է SQL Injection խոցելիության էությունը։

Ենթադրենք, որոնման դաշտում մուտագրվել հետևյալ տեսքն ունեցող մի արտահայտություն՝ `' OR 1=1; -- `, ապա տվյալների բազայում կատարվող հարցումը կունենա հետևյալ տեսքը՝
```sql
SELECT * FROM products 
WHERE name LIKE '%' OR 1=1; -- %' AND released=1;
```
Հարցման արդյունքում կվերադարձվեն **բոլոր** ապրանքանիշները, նույնիսկ դեռևս չթողարկվածները։ Նման արդյունքի պատճառը կայանում է նրանում, որ մուտքագրված արտահայտության առաջին չակերտը փակում է `LIKE` պնդման չակերտը և ընդհանուր հարցման հրամանի մեջ ավելացնում նոր պնդում՝ `OR 1=1` (որը միշտ ճիշտ է), իսկ `--` սիմվոլները հարցման `AND released=1;` հատվածը փոխակերպում են մեկնաբանության (*comment*), որն առհամարվում է տվյալների բազայի կողմից։

Այսպիսով, SQL injection խոցելիության պարզագույն կիրառմամբ հնարավոր է դառնում չնախատեսված տվյալների ստացումը։ Դժվար չէ պատկերացնել, որ այլ հրամանների մուտքագրման պարագայում հնարավոր կլինի մուտք գործել որպես այլ օգտատեր կամ նույնիսկ ջնջել/փոփոխել տվյալների բազայում պահվող տեղեկատվությունը։

Հաջորդ մասում կդիտարկենք առավել իրատեսական օրինակներ՝ շնորհիվ վերոնշյալ bWAPP և OWASP Juice Shop ծրագրերի։