SQL тарилга

**SQL тарилга** нь өгөгдөлд тулгуурласан хэрэглээний програмуудад халдахад хэрэглэгддэг  кодыг тарих техник юм. SQL тарилга нь хэрэглээний програмын програм хангамжийн аюулгүй байдлын эмзэг байдлыг ашиглах ёстой. Жишээл нь SQL илэрхийлэлд агуулагдсан тэмдэгт мөрийн esc тэмдэгтүүд нь буруугаар шүүгдсэн эсвэл хэрэглэгч хатуу тогтсон дүрмийн дагуу оролтыг оруулаагүй тохиололд санаанд оромгүй буруу үр дүн гаргадаг. SQL тарилга нь ихэвчилэн вэбсайтын халдлагын вектор гэж нэрлэгддэг боловч ямар ч төрлийн SQL өгөгдлийн санд халдахад ашиглагдах боломжтой.
SQL тарилга халдлага нь гүйлгээг зогсоох эсвэл дансны үлдэгдлийг өөрчилөх, систем дэх бүх өгөгдлийг бүрэн задлах, өгөгдлийг устгах эсвэл боломжгүй болгох мөн өгөгдлийн сангийн серверийн администраторын эрхтэй болох гэх мэтээр хүчингүй болгох асуудлыг үүсгэх мөн одоо байгаа өгөгдлүүдийг хөндлөнгөөс өөрчилөх боломжийг халдагчид олгодог.
2012 оны судалгаагаар компаны вэбсайт сар бүр дунджаар 4 халдлагад өртдөг бол жижиг худалдааны газрууд бусад салбаруудаас хоёр дахин их халдлагыг хүлээн авдаг байна.

## Түүх
SQL тарилгын хамгийн анхны нийтийн хэлэлцүүлэг 1998 оноос эхэлжээ.
## Хэлбэр
SQL тарилга(SQLI) Нээлттэй Вэб Програмын Аюулгүй байдлын Төслийн (Open Web Security Project) 2007 болон 2010 оны топ 10 вэб програмын эмзэг байдлын нэгд тооцогдож байсан. 2013 онд SQLI нь OWASP-ийн топ 10 халдлагын нэгдүгээрт эрэмбэлэгдсэн байсан. SQL тарилгын дөрвөн гол дэд ангилал байдаг:
* Сонгодог SQLI
* Сохор буюу таамаглал SQL тарилга
* Өгөгдлийн сан удирдах систем – тусгай SQLI
* Нийлмэл SQLI
:* SQL injection + хангалтгүй нотолгоо
:* SQL injection + DDoS халдлага
:* SQL injection + DNS hijacking халдлага
:* SQL injection + XSS
Storm Worm бол нийлмэл SQLI-ийн нэг хэлбэр. Энэ ангилал нь SQLI-ийн төлвийн 2010 он хүртэлх хугацааны хөгжлийн хувьд авч үзсэн ангиллын төлөөлөл болно.

## Техникийн хэрэгжүүлэлтүүд
### Буруу шүүгдсэн esc тэмдэгтүүд 
SQL тарилгын энэ хэлбэрийн тохиолдолд хэрэглэгчийн оролт дох esc тэмдэгтүүд шүүгдээгүй үед SQL илэрхийлэлд дамжуулагдана. Үүний үр дүнд SQL илэрхийллүүдийн боломжит арга заль програмын эцсийн хэрэглэгчээр өгөгдлийн сан дээр хийгдэнэ.

Дараах мөр код энэ эмзэг байдлыг харуулж байна:
 илэрхийлэл = "
```sql
SELECT * FROM users WHERE name = '
```
" + userName + "
```sql
';
```
"

Энэ SQL код нь хэрэглэгч хүснэгтээс заасан хэрэглэгчийн бичлэгийг татахад зориулагдсан. Гэсэн хэдий ч “username” хувьсагч нь хорт хэрэглэгчийн тодорхой аргаар бүтээгдсэн бол код зохиогчийн зорилгоос илүүг хийх боломжтой. Жишээлбэл дараах зурагт харуулсан нэвтрэх хуудсан дээр жишээ авч үзье. Хэрэглэгч өөрийн нэр нууц үгийг зурагт харуулснаар оруулахад буруу өгөгдөл оруулсан үед доорх зурагт харагдаж буй мэдээлэл гарна.

Хэрэглэгч стандарт өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ. Энэ үед query нь нөхцлийг шалгаад өгөгдсөн нөхцөл бүхий бичлэг байгаа эсэхийг ямар ч алдаагүйгээр шалгаад үр дүнг буцаана.

```sql
SELECT * FROM users WHERE username = 'alex' AND userpass = 'john';
```

Хэрэглэгчийн нэр нууц үгийн оронд “’ OR ‘1’=’1” гэсэн оролтыг өгөхөд л өгөгдлийн сангаас мэдээлэл шүүж гаргах SQL query-ны бүтэц өөрчлөгдөж амжилттай нэвтэрж чадсаныг харж байна.

Хэрэглэгч стандарт бус өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ:

```sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND userpass = '' OR '1'='1';
```

Эсвэл query-ний үлдсэн хэсгийг хаахын тулд тайлбарыг ашиглах(SQL 3 төрлийн тайлбарыг ашигладаг ). Бүх гурван мөрийн төгсгөлд зай авдаг:

```
' OR '1'='1' --
' OR '1'='1' ({
' OR '1'='1' /*
```

Дараах SQL илэрхийллийн аль нэгийг эцэг хэл дээр гүйцэтгэдэг:

```sql
SELECT * FROM users WHERE name = '' OR '1'='1';
```

```sql
SELECT * FROM users WHERE name = '' OR '1'='1' -- ';
```

Хэрвээ энэ кодыг баталгаажуулах процедурт ашиглах бол энэ жишээ нь өгөгдлийн талбар бүрийн (*) сонголтыг бүх хэрэглэгчидээс гэхээсээ илүүтэйгээр кодерийн хувьд нэг тодорхой хэрэглэгчийн нэр  ашиглагдаж болно, учир нь '1'='1' нь үргэлж үнэн байдаг.
Доорх зурганд харагдаж буйгаар хэрэглэгчийн нэр эсвэл нууц үгийн аль нэг талбарт энэхүү ололтыг оруулан нэвтэх товчийг дархад bat гэсэн хэрэглэгч байсан ч байгаагүй ч Suppliers хүснэгт устах болно.

Хэрэглэгч дээрх шиг стандарт бус өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ.

```sql
SELECT * FROM users WHERE username = 'bat';DROP TABLE Suppliers;
```

Доорх илэрхийлэлд “userName”-ийн дараах утга нь хэрэглэгчийн хүснэгтийн устгал мөн түүнчлэн “userInfo” хүснэгтийн(бүх хэрэглэгчийн мэдээллийн хувьд) бүх өгөгдөлийг сонгоход хүргэдэг, API ашиглан олон тооны илэрхийллийг зөвшөөрдөг.
a';
```sql
DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
```

Энэ оролт нь эцсийн SQL илэрхийллийг дараах байдлаар тодорхойлно:

```sql
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
```

Ихэнхи SQL серверийн шийдлүүд нь иймэрхүү байдлаар нэг илэрхийлэл бүхий олон илэрхийллийг гүйцэтгэхийг зөвшөөрдөг боловч PHP-ийн mysql_query() функц гэх мэт зарим SQL API-ууд нь аюулгүй байдлын үүднээс үүнийг зөвшөөрдөггүй. Энэ нь халдагчид бүхэлд нь тусдаа query-нуудад тарилга хийхээс урьдчилан сэргийлж байгаа боловч, query-д өөрчилөлт оруулахыг зогсоодоггүй.

### Буруу төрлийн боловсруулалт 
Энэ төрлийн SQL тарилгын хэлбэр нь хэрэглэгч заавал хатуу тогтсон дүрмийн дагуу өгөгдлийг оруулах албагүй байдагтай холбоотойгоор эсвэл төрлийн хязгаарлалтанд шалгалт хийгдээгүй үед гардаг. Энэ нь тоон талбарыг SQL илэрхийлэлд ашиглах үед хэрэгжиж болох юм. Гэхдээ програмист хэрэглэгчийн оруулсан оролт тоо эсэхийг шалгах шалгалтыг хийдэггүй. Жишээ нь: 
илэрхийлэл := "
```sql
SELECT * FROM userinfo WHERE id =
```
" + a_variable + ";"

Энэ илэрхийллээс авч үзэхэд a_variable нь "id" талбарт хамааралтай тоо байхыг хүссэн тодорхой байна. Гэсэн хэдий ч хэрвээ энэ нь үнэн хэрэгтээ тэмдэгт байвал эцсийн хэрэглэгч өөрийн сонголтоороо илэрхийллийг гуйвуулж болзошгүй, ингэснээр esc тэмдэгтүүдийг ашиглах шаардлагагүй болно. Жишээлбэл a_variable - г ийм хэлбэртэйгээр бичиж болно:

```
1;DROP TABLE users
```

"users" хүснэгтийг өгөгдлийн сангаас устгана, мөн SQL ийм хэлбэртэй болно:

```sql
SELECT * FROM userinfo WHERE id=1; DROP TABLE users;
```

### Сохор SQL тарилга 
Сохор SQL тарилга нь вэб програм SQL тарилгад эмзэг байх үед хэрэглэгддэг боловч тарилгын үр дүн халдагчид харагдахгүй. Эмзэг байдал бүхий хуудас нь өгөгдлийг харуулдаггүй боловч хуудсанд дуудагдсан хууль ёсны SQL илэрхийлэлд хийгдсэн логик илэрхийллийн үр дүнгээс хамаарч өөр өөрөөр харагддаг. Энэ төрлийн халдлага нь уламжлалт байдлаар хугацаа их шаарддаг гэж үздэг тул шинэ илэрхийлэл нь сэргээгдсэн хэсэг тус бүрт зориулж бүтээгдсэн байх ёстой бөгөөд түүний бүтцээс хамааран энэ халдлага нь олон удаа амжилтгүй хүсэлтээс бүрдэх магадлалтай. 

### Хоёрдугаар дарааллын SQL тарилга 
Хоёрдугаар дарааллын SQL тарилга нь оруулсан утгууд шууд ажиллахаас илүүтэй хадгалагддаг хортой командыг агуулж буй үед тохиолддог. Зарим тохиолдолд програм нь SQL илэрхийллийг зөвөөр кодчилдлог бөгөөд үүнийг зөв SQL гэж хадгалдаг. Дараа нь SQL тарилгаас хамгаалах ямар нэг хяналтгүйгээр програмын өөр нэг хэсэг хадгалсан SQL илэрхийллийг ажиллуулах боломжтой. Энэ халдлага нь оруулсан утгуудыг дараа нь яаж ашигласан талаар илүү их мэдлэгтэй байхыг шаарддаг. Автоматжуулсан вэб програмын аюулгүй байдлын сканерууд энэ төрлийн SQL тарилгыг амархан илрүүлэх боломжгүй.
## Хор хөнөөллийг бууруулах
SQL тарилга нь алдартай халдлага бөгөөд энгийн аргаар амархан сэргийлэх боломжтой. 

### Тодорхой хэлбэрээр бичигдсэн илэрхийлэл 
Хөгжүүлэлтийн ихэнхи протформууд дээр параметрүүдтэй ажилладаг тодорхой хэлбэрээр бичигдсэн илэрхийллүүд нь хэрэглэгчийн оролтыг илэрхийлэлд оруулаахын оронд ашиглах боломжтой. Тиймээс SQL тарилга нь энгийнээр үл мэдэх(магадгүй хүчингүй) параметрийн утга гэж боловсруулагддаг.
#### Кодчилох түвшинд хэрэгжүүлэх 
Объект харилцааны зураглалын санг ашиглан SQL код бичих шаардлагаас зайлсхийдэг. ORM сан нь объект хандалтат кодоос параметржүүлсэн SQL илэрхийллийг бий болгодог.
### Зайлсхийх нь 
Шууд бус боловч тарилгын эсрэг алдаа гардаг арга нь SQL дэх тусгай утгатай тэмдэгтүүдийг хасах явдал юм. SQL DBMS-ийн гарын авлага нь ямар тэмдэгтүүд нь тусгай утгатай байхыг тайлбарладаг бөгөөд ингэхийн тулд хөрвүүлэгч хэрэгтэй тэмдэгтүүдийн дэлгэрэнгүй жагсаалтыг бий болгох боломжийг олгодог. Жишээлбэл хүчинтэй SQL тэмдэгтийн хэлбэрт параметрд дан ганц хашилт(‘) байх тохиолдолд  (“) давхар хашилтаар солигдох ёстой.  Жишээ нь PHP –д mysqli_real_escape_string(); функцийг ашиглан параметраас зугтахад түгээмэл ашигладаг. SQL query-ыг илгээхээсээ өмнө:

```php
$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name');
$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'",
                  $mysqli->real_escape_string($username),
                  $mysqli->real_escape_string($password));
$mysqli->query($query);
```

Энэ функц нь backslash-уудыг дараах тэмдэгтүүдээр бэлтгэдэг: `\x00`, `\n`, `\r`, `\`, `'`, `"` болон `\x1a`.
Энэ функц нь MySQL руу query илгээхээс өмнө өгөгдлийг аюулгүй болгоход ашигладаг.
PostgreSQL-д зориулсан pg_escape_string() зэрэг PHP –д олон төрлийн өгөгдлийн санд зориулсан функцүүд байдаг.

### Хээ шалгах 
Хэрэв өгөгдсөн төрөлд тэдгээрийн утга хүчинтэй төлөөлөл байгаа бол бүхэл тоо, бутархай, бүүлэн, тэмдэгт параметрууд шалгагдах боломжтой. 
### Өгөгдлийн сангийн зөвшөөрөл 
Вэб програмын ашигладаг нэвтрэх хэсгийн өгөгдлийн сан дээр зөвшөөрлийг зевхен хэрэгцээнд нь хязгаарлах нь веб програм дахь аливаа алдаануудыг ашиглах SQL тарилгын халдлагуудын үр нөлөөг багасгахад тусална.

## Жишээ 
* 2002 оны 2-р сард Jeremiah Jacks Guess.com -г SQL тарилга халдлагад өртөж болзошгүй байсныг илрүүлсэн. 
* 2005 оны 11-р сарын 1-ний өдөр өсвөр насны хакер Tech Target групээс гаргадаг Тайваны мэдээллийн аюулгүй байдлын сэтгүүлийн сайтын сайт руу SQL тарилгыг ашиглан нэвтэрч, хэрэглэгчдийн мэдээллийг хулгайлсан. 
* 2006 оны 1-р сарын 13-нд Оросын компьютерийн гэмт хэрэгтнүүд Род Айландын засгийн газрын вэбсайтрууу орж, төрийн агентлагуудтай онлайнаар бизнес эрхэлж буй хувь хүмүүсээс зээлийн картын мэдээллийг хулгайлсан.
* 2006 оны 3-р сарын 29-нд хакер албан ёсны Энэтхэгийн засгийн газрын аялал жуулчлалын сайтын SQL тарилгын сул талыг илрүүлсэн..
* 2007 оны 6-р сарын 29-нд компьютерийн гэмт хэрэгт SQL injection ашиглан Microsoft UK вэбсайтыг устгасан. 
* 2008 оны 7-р сард Касперскийгийн Малайзын сайтыг SQL тарилга ашиглан "m0sted" хакерын бүлэг хакерджээ.
* 2008 оны 5-р сард Хятад дахь серверийн ферм нь автомат квериг автоматжуулсан SQL тарилгын халдлагад өртөмтгий SQL сервер вэбсайтуудыг илрүүлэхийн тулд Google-ийн хайлсын системийг ашигласан. 
* 2009 оны 8-р сарын 17-нд АНУ-ын Хууль зүйн яам АНУ-ын иргэн Альберт Гонзалес болон хоёр орос нэр нь үл мэдэгдэх иргэнийг 130 сая кредит картын дугаарыг SQL тарилга халдлагыг ашиглан хулгайлсан хэргээр ялласан.
* 2009 оны арванхоёрдугаар сард халдагч 32 сая хэрэглэгчдийн нэр, нууц үг агуулсан RockYou plaintext мэдээллийн санг SQL injection халдлага ашиглан халдсан байна.
*2010 оны 7-р сарын 24-нээс 26-ны хооронд Японд болон Хятад улсын довтолгоонууд нь онлайн сүлжээнд холбогдсон томоохон дэлгүүрүүдээр ажилладаг Осака хотод байрладаг Neo Beat компаний зээлийн картын мэдээллийг интернетээр цацахын тулд SQL injection ашигласан. Довтолгооны сүлжээнд нь Izumiya Co, Maruetsu Inc, Ryukyu Jusco Co. зэрэг 7 бизнесийн түншүүд өртсөн. Мэдээллийн хулгай нь 12,191 хэрэглэгчидэд нөлөөлсөн байна. 2010 оны 8-р сарын 14-ний байдлаар гуравдагч этгээд Хятадын бараа, үйлчилгээ худалдан авахад 300 гаруй төрлийн зээлийн карт ашиглагдаж байна гэж мэдээлсэн.
* 2010 оны 11-р сарын 8-нд Британий Хааны Тэнгисийн цэргийн вэбсайт нь SQL injection ашигласан TinKode нэртэй Румын хакераар эвдэгдсэн.
* 2011 оны 3-р сарын 27-ны өдөр mysql.com, MySQL-ийн албан ёсны вэб хуудсийг хакер SQL сохор тарилга ашиглан  хэлэлцээр хийсэн.
* 2012 оны долдугаар сард хакерын бүлэг Yahoo-аас 450,000 нэвтрэх эрх хулгайлсан гэж мэдэгдсэн байна. Бүлэг нь нэгдэлд суурилсан SQL тарилгын аргыг ашиглан Yahoo-ийн аюулгүй байдлыг зөрчсөн байна.
* 2013 оны 6-р сарын 27-нд хакерын бүлэг "RedHack" нь Словакийн захиргааны сайтыг эвдсэн.  Тэд ус, хий, Интернет, цахилгаан, телефон утасны компаниудад өр төлбөрийг арилгах боломжтой гэж зарласан. Үүнээс гадна, тэд өглөө эрт бусад өртэй хүмүүсийг нэвтэрж, өрийн мэдээллийг арилгахын тулд админ хэрэглэгчийн нэр, нууц үгийг нийтэлжээ. Тэд Твиттерээс энэ мэдээллээ зарласан.
* 2014 оны 3-р сарын 7-нд Жонс Хопкинсын их сургуулийн албан тушаалтнууд "Биотехнологийн Интернетийн Серверүүд" нь "Хьюки" нэртэй Anonymous хакерын "SQL тарилга" халдлагад өртөж, "хакерчивист" группын "РaptorSwag" Хакерууд 878 сурагч, ажилтнуудын хувийн мэдээллийг задалсан.
* 2015 оны аравдугаар сард SQL тарилга халдлага нь Британий харилцаа холбооны компани TalkTalk-ийн серверүүдээс 156,959 хэрэглэгчдийн хувийн нарийн мэдээллийг хулгайлахад ашиглагдсан.
## Уншвал зохих 
* Code injection
* Cross-site scripting (XSS) халдлага
## Холбоос
## Гадаад холбоосууд 
* Manual Sql Injection Tutorial By The Ajay Devgan
* SQL Injection, by OWASP.
* SQL Injection Wiki
* WASC Threat Classification - SQL Injection Entry, by the Web Application Security Consortium.
* Why SQL Injection Won't Go Away, by Stuart Thomas.
* SQL Injection Prevention Cheat Sheet, by OWASP.
* SDL Quick security references on SQL injection by Bala Neerumalla.
* How security flaws work: SQL injection
* SQL Injection Cheat Sheet by Netsparker