Cross-site scripting (XSS) халдлага

## Cross-Site Scripting (XSS) халдлага  
**Cross-Site Scripting (XSS)** халдлага нь injection /кодон дунд код хавсаргах/-ы нэг төрөл бөгөөд хортой скрипт кодыг хоргүй, халдаж буй вэб сайт руу хавсаргадаг. XSS халдлага нь халдагчид вэб програмыг ашиглан хортой кодыг хэрэглэчидрүү илгээдэг бөгөөд ихэвчлэн сайтын форм хэсгүүдэд байршиж хэрэглэгчдэд хүрдэг. Вэб сайтад байх сул талууд нь эдгээр халдлагуудыг амжилтай болоход нөлөөлөх бөгөөд хэрэглэгчид хүсээгүй мэдээллийг үзүүлэхээс гадна хэрэглэгчийн форм дээр бичсэн мэдээллүүдийг шалгахгүйгээр эсвэл encode/хувиргах/ хийхгүйгээр хулгайлах хүртэл үр дагавар үзүүлж болно.
Халдагчид нь XSS-ыг ашиглан хортой кодыг  хэрэглэгчидэд илгээдэг. Хэрэглэгчийн вэб браузер нь кодыг хортой байна гэж мэдэх боломжгүй бөгөөд шалгахгүйгээр шууд ажиллуулдаг. Учир нь код нь баталгаатай эх сурвалж, вэб сайтаас илгээгдэж байгаа бөгөөд энэхүү хортой код нь таны **cookie, session, token** болон бусад нууцлагдмал мэдээллүүдрүү таны браузераар дамжин хандах, хулгайлах үйлдлүүдийг хийдэг. Энэ төрлийн скриптүүд нь HTML хуудасны агуулгыг өөрчөлдөг.

XXS дайралт  бол веб сайтын ямар нэг input-ээр дамжуулж өөрийн кодоо хэрэглэлдэг . Хакерын бэлдсэн линк дээр дарснаар *JavaScript* код ажиллаж хэрэглэгчийн *cookie* гэх мэт мэдээлэлүүдийг хакер луу илгээнэ. Янз бүрийн скрипт байж болох боловч голдуу л *JavaScript* дээр хийдэг. Cookie хулгайлахыг **hijack** гэж нэрлэдэг. Хэрэглэгч өөрийн мэдээллээ өөрчлөх үед нь ажиллаж мэдээллийг нь хакер луу илгээх үйлдпийг хийдэг.

## Тодорхойлолт 
Cross-Site Scripting (XSS) халдлага нь дараах тохиолдлуудаас шалтгаалж ажиллана :
# Вэб сайтын хүсэлтээр untrusted source/баталгаагүй эх сурвалж/-оос вэб програмруу өгөгдөл орж байх үед
# Динамик агуулгатай өгөгдөл вэб сайтаас илгээгдэхдээ урьдчилан шалгагдахгүй эсвэл хувиргагдахгүй байх үед 

## Хортой скриптийн үр дагварууд 
### Cookie-ийн хулгай 
Халдагч этгэд вэв сайтанд ***document.cookie*** ашиглан хэрэглэгчийн cookie -г өөрийн сервер рүү илгээсэнээр,session ID- гэх мэт эмзэг мэдээллийг гаргаж тэднийг ашиглах болно (***cookie авах жишээ код: javascript***).
 ``

### Keylogging 
Халдагч ***addEventListener*** ашиглан keyboard -ын  чагнаж үйл явдалуудыг бүртгүүлж байх болно . Дараа нь чухал мэдээлэл байж  болзошгүй бичлэг, нууц үг, кредит картын дугаар гэх мэт хэрэглэгчийн эмзэг мэдээлэлүүдийг өөрийн сервер рүү илгээнэ.

### Phishing (Фишинг) 
Халдагч DOM удирдлагыг ашиглан хуудас руу хуурамч нэвтрэх маягт(Log in form) оруулдаг ба
өөрийн серверт зорилтот маягтын үйл ажиллагааны үр дүнг буцаадаг болгон тохируусанаар хэрэглэгчийн эмзэг мэдээлэлд халдах боломжтой болно.

## XSS халдлагууд 
XSS халдлага нь үндсэн 2 категорид хамаардаг бөгөөд энэ нь: Stored болон reflected юм. Эдгээрээс өөр бас нэгэн төрөл байдаг хэдий ч төдийлөн дэлгэрээгүй бөгөөд DOM Based XSS гэж нэрлэдэг.
### Stored XSS халдлага 
Stored XSS халдлага нь хортой кодыг вэб сайтын өгөгдлийн сан, мэссэж форм, хэрэглэгчдийн лог, сэтгэгдэл бичих талбар зэрэг газруудад байршуулдаг. Хохирогчийн хадгалсан вэб сайттай холбоотой бүхий л мэдээллийг тэрхүү хорт кодын тусламжтайгаар авах боломжтой юм. Үүнийг заримдаа Persistent эсвэл Type-I XSS гэж нэрлэх нь ч бий. Cookie -ийн хулгай  нь энэ төрлийн  халдлагад орно . 

# Халдагч хортой кодыг веб сайтын өгөгдлийн санд оруулахад вэб худас дахь форум хэсгийг ашиглана.
# Хохирогч вэб сайт дах хортой мөр бүхий хуудасруу хандах хүсэлт гаргана.
# Хариуд нь вэб сайт нь мэдээллийн баазаас хортой мөр кодыг багтаасан хуудас (мэдээлэлийг)-ыг хохирогч руу илгээдэг.
# хохирогчийн браузер хариу доторх хортой скриптийг ажиллуулж халдагч сервер рүү хохирогчийн cookie-г илгээдэг.

### Reflected XSS халдлага 
Reflected xss( Тусгагдсан халдлага ) халдлага гэдэг нь хөнөөлт кодын тусламжтайгаар сервэр дээр ажиллаж байгаа вэб сайттай яг ижилхэн сайтыг сервэр дээр байршуулан хэрэглэгчийг хандахад хуулбар сайтруу redirect хийх хэлбэртэйгээр ажиллана. Ингэснээр хэрэглэгч өөрийн эрхээр нэвтрэх зэрэг ямар ч үйлдэл хийхэд мэдээлэл хулгайлагдах аюултай юм. Үүнийг Non-Persistent эсвэл Type-II-XSS гэж нэрлэх нь ч бий.  

# Халдагчын бүтээл( урлал ) дотор хортой мөрийг агуулсан ба URL( өөр нэг веб хуудсын (сайтын) интернет дэхь хаягийг заасан бичиглэл юм) -su хохирогч руу илгээдэг.
# Хохирогч вэб сайтаас URL руу хандсан хүсэлт гаргсан үед халдагчид мэхлэгдэнэ.
# Хариуд нь вэб сайтанд URL -ын хортой мөр код илгээгдэнэ (хурамч худас г.м).
# Хохирогчийн вэб хөтчийн дотор хортой скриптийг ажиллуулж халдагчын сервер рүү хохирогчийн cookie ийг илгээдэг.
### DOM-based XSS халдлага 
DOM-based XSS халдлага нь  аль алний шинж чанарыг агуулса бадаг. 
 

#Халдагчын бүтээл( урлал ) дотор хортой мөрийг агуулсан ба URL( өөр нэг веб хуудсын (сайтын) интернет дэхь хаягийг заасан бичиглэл юм) -su хохирогч руу илгээдэг.
# Хохирогч вэб сайтаас URL руу хандсан хүсэлт гаргсан үед халдагчид мэхлэгдэнэ.
# Вэб сайт нь хүсэлтийг хүлээн авдаг, гэхдээ хариуд нь хортой мөр илгэхгүй.
# Хохирогчийн браузер дотор хууль ёсны скриптээ ажиллуулдаг, хортой скриптийг үүсгэж хуудас руу оруулж өгч болно.
# Хохирогчийн браузер хуудас руу орж хортой скриптийг ажиллуулахад, халдагчын сервер рүү хохирогчийн күүкиг илгээх.

## Хэрхэн хамгаалах вэ? 
Хэрэглэгчийн оруулсан өгөгдөл дотор Javascript явж байвал xss гэж үзнэ. Хэрэглэгчийн оруулсан өгөгдөл доторх HTML элэмэнтүүдийг энкодлож гаргах юм бол Javascript ажиллахгүйгээр дэлгэц дээр харагдах юм. Гэхдээ зарим тохиолдолд хэрэглэгчдийг html өгөгдөл оруулахыг зөвшөөрөх тохиолдол гарна. 
Үүнийг зогсоохын тулд оролт дотор  -гэсэн маягийн зүйл байгаа эсэхийг шалгаж болно.
# Input-уудын уртыг заавал зааж өгөх, нэг их урт байх хэрэггүй.  
# Хөрвүүлэлт хийдэг байх хэрэгтэй, шууд HTML хэлбэрээр харагддаггүй байх. Харин вэб дээрээ бид тусгай тэмдэгтүүдийг хөрвүүлдгээр хийснээр аюулаас багач атугай холдоно. Жишээ нь  гэж бичсэнийг &lt;script&gt; гэж хөрвүүлж харуулна.
XSS халдлага нь  injection ( код оруулах , тарилтын) нэг төрөл юм гэдэгийг дурдая :
Хэрэглэгчийн input -ээр оруулсан өгөгдлийг( хортой код) андуурч програмын нэг хэсэг  мэт ажилуулдаг .
Код нь тарилгын энэ төрлийн урьдчилан сэргийлэх зорилгоор оролтын өгөгдлийг аюулгүй болгон боловсруулах  хэрэгтэй.Вэб хэрэгжүүлэгчидэд оролтын өгөгдлийг аюулгүй болгох 2 өөр арга байдаг.
* **Encoding (кодчлол)**, халдагчийн оруулсан өгөгдлийг код биш өгөгдөл гэж таниж дэлгэцэндээр харуулдаг арга юм .
* **Validation (Баталгаажуулалт) **,шүлтүүр хийж хэрэглэгчийн оруулсан  өгөгдлийг хортой кодгүйгээр яалган авч дэлгэцэндээр харуулдаг арга юм . 

### Encoding (кодчлол) 
Encoding нь код гэж ойлгогдож болохоор хэрэглэгчийн өгөгдлөөс зугтах явдал юм .
Кодчилол хамгийн танигдахаар төрөл нь HTML escaping буюу HTML өгөгдлөөс -ээс зугтах явдал ба . төрөлийн бичэглэлээс '' хаалтуудыг  '&lt ;'  болон  '&gt ; '  тэмдэгтүүдээр кодлох  явдал юм.

print ""
print "Latest comment: "
print encodeHtml(userInput)
print "  
...  кодыг кодчолохдоо .

Latest comment:
&lt ;script&gt ;...&lt ;/script&gt ;
 

#### Клиент талд Кодчилол хийх 

## SQL Injection 
SQL injection нь хамгаалалтын сул талыг ашиглан програм хангамжийн өгөгдлийн сангийн давхаргад халдах кодчиллын техник юм.
Энэ нь хэрэглэгч заавал хатуу тогтсон дүрмийн дагуу өгөгдлийг оруулах албагүй байдагтай холбоотой бөгөөд жишээлбэл ийм санамсаргүй оролтын өгөгдөлд програмын эх кодын тусгай тэмдэгтүүдийн дараалал ч байж болох юм.
Ингэж оруулсан өгөгдөл нь SQL илэрхийлэлд орж ирэн санаанд оромгүй буруу үр дүнг гаргадаг. Үүнийг SQL Injection гэж нэрлэдэг.
Програмчлалын Си хэлэнд програмын кодын мөрөнд тайлбар хийх мөн кодын зарим хэсгийг идэвхигүй болгохдоо “//”-тэмдэгт(хос ташуу зураас буюу хос slash)-ийг хэрэглэдэг.
Тэгвэл MSSQL Server дээр query бичлэгийн тодорхой хэсгийг идвхигүй болгохдоо ”–” тэмдэгтийг ашигладаг. SQL Injection-ны доОр дурдах жишээ нь хэрэглэгчийн оруулсан өгөгдөл query бичлэгийн тодорхой хэсгийг идэвхигүй болгох, хэллэгийн логикийн чанараар query биелэх нөхцлийг өөрчлөх замаар үр дүнг гарган авах мөн хэрхэн өгөгдлийн санд өөрчлөлт оруулж болохыг харуулна.
Жишээлбэл дараах зурагт харуулсан нэвтрэх(Login) хуудсан дээр жишээ авч үзье! Хэрэглэгч өөрийн нэр нууц үгийг зурагт харуулснаар оруулахад тухайн нэр, нууц үг нь үнэн байх зөвхөн нэг бичлэг олдох ба буруу өгөгдөл оруулах үед бичлэг олдоогүй гэсэн мэдээлэл гарна.

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

`“SELECT count(*) FROM users WHERE username= ‘aaa’ AND userpassw=’bba'” `

Гэтэл хэрэглэгч оролтын өгөгдлийг ингэж үнэн зөвөөр бөглөхгүй байж болох ба дээр дурдсан хэллэгийн логик, SQL илэрхийллийн тусгай тэмдэгтүүдийг ашиглан булхайцаж дараах(Зураг В) үр дүнг гарган авч болно.
Хэрэглэгч стандарт бус(Зураг В-д харуулсан) өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ.

`“SELECT count(*) FROM users WHERE username= ” OR ‘1’=’1′ AND userpassw=” OR ‘1’=’1′” ` 

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

Ангилал:World Wide Web
Ангилал:Аюулгүй байдлын цоорхой
Ангилал:JavaScript