Veb-ilovalarga hujumlar
Bugungi kunda veb-ilovalar hamma joyda mavjud va ular siz tasavvur qila oladigan deyarli hamma narsani boshqarish uchun ishlatiladi. Ushbu bo‘limda veb-ilovalarga qilinadigan hujumlar va veb-ilovalar xavfsizligini ko‘rib chiqamiz.
IDOR ("Insecure Direct Object Reference" — obyektga xavfsiz bo‘lmagan to‘g‘ridan-to‘g‘ri havola)
IDOR zaifliklari dasturchilar resurslarga kirish uchun avtorizatsiya talablarini amalga oshirmagan hollarda yuzaga keladi.
Eve shunchaki identifikatorni, masalan, document REST parametrini o‘zgartirish orqali Alice’ning hujjatlariga kira oladi.
Bu veb-ilova obyektlar o‘rtasida avtorizatsiyani talab qilmaganda sodir bo‘ladi va hujumchilarga qiymatlarni sanab chiqish (enumerate) va boshqa ma’lumotlar nuqtalariga kirishni sinab ko‘rish imkonini beradi.
Masalan, avtorizatsiyaning hech qanday belgisi ko‘rinmaydigan quyidagi psevdokod bo‘lishi mumkin:
$id = getInputFromUser();
$doc = getDocument($id);
return $doc;Yuqoridagi kod foydalanuvchidan kirish ma’lumotini so‘raydi, hech qanday tekshiruv (validation) yoki tozalashni amalga oshirmaydi, so‘ngra to‘g‘ridan-to‘g‘ri getDocument funksiyasi bilan qidiruvni bajaradi va tegishli hujjatni qaytaradi.
Yaxshiroq yechim imtiyozlarni tekshirish bo‘lardi:
$id = getInputFromUser();
$user = findUsername();
$doc = "";
if (hasAccessToDocument($user, $id)) {
$doc = getDocument($id);
} else {
$doc = "Not authorized for this document";
}
return $doc;
Bunday zaifliklarni topish oson, chunki oddiy raqamni o‘zgartirib, boshqa birovning ma’lumotlariga kira olish-olmasligingizni tekshirishingiz kifoya. Avval foydalanuvchi avtorizatsiyadan o‘tganini tekshirish bu zaiflikning oldini oladi.
"Sehrli raqamlar"dan (Magic Numbers) qochish
Ilova ma’lumotlarga murojaat qilishda raqamlar ketma-ketligidan foydalanishdan qochishi kerak. IDOR misolida hujjatlar 1000 dan 1002 gacha bo‘lgan identifikatorlarga ega edi. Ba’zan bu raqamlar "sehrli raqamlar" (Magic Numbers) deb ataladi, chunki ular to‘g‘ridan-to‘g‘ri serverdagi resursga, masalan, ma’lumotlar bazasi orqali ishora qiladi va barcha qiymatlarni osongina sanab chiqish mumkin. Masalan, hujumchi 0 dan 10000 gacha bo‘lgan barcha hujjat identifikatorlarini tekshirib, ma’lumotlarga kirish imkonini beradigan har qanday natijani qayd etishi mumkin.
Avtorizatsiya to‘g‘ri amalga oshirilishi kerak bo‘lsa-da, ma’lumotlarga murojaat qilishda GUID ("Globally Unique Identifier" — global noyob identifikator) yoki UUID’dan ("Universally Unique Identifier" — universal noyob identifikator) foydalanish ham foydali. Bu identifikatorlar global miqyosda noyob bo‘lishi uchun mo‘ljallangan va raqamlarni generatsiya qilishdagi o‘rnatilgan entropiya tufayli ularni sanab chiqishning iloji yo‘q.
GUID quyidagicha ko‘rinishi mumkin:
- 3377d5a6-236e-4d68-be9c-e91b22afd216
SQL in’eksiyasi (SQL Injection)
Ko‘plab veb-ilovalar ma’lumotlar bazasiga ulangan. Ma’lumotlar bazasi veb-ilova saqlashni va foydalanishni istagan barcha ma’lumotlarni o‘zida saqlaydi.
SQL in’eksiyasi — hujumchilarga veb-ilova dasturchisi foydalanayotgan SQL’ni ("Structured Query Language") manipulyatsiya qilish imkonini beruvchi usul. Bu odatda ma’lumotlarni tozalash (sanitization) yo‘qligi sababli sodir bo‘ladi. SQL dasturchilar tomonidan ma’lumotlar bazasi resurslariga murojaat qilish uchun muntazam ishlatiladi.
Yuqoridagi grafikda Eve yuborgan so‘rovda u quyidagi qiymatni kiritayotganini ko‘ramiz: 1000' OR '1'='1
Bu natijaviy SQL so‘rovining jadvaldagi barcha qatorlarni qaytarishiga sabab bo‘ladi, chunki ma’lumotlar bazasi bu ifodani har doim rost deb baholaydi. O‘ylab ko‘ring: ma’lumotlar bazasi qiymat 1000 bo‘lishi YOKI (OR) 1 soni 1 ga teng bo‘lishi mumkin bo‘lgan so‘rovni qabul qiladi; u har safar qiymat qaytaradi! Sintaksisni manipulyatsiya qilish uchun foydalanishimiz mumkin bo‘lgan ko‘plab turli SQL funksiyalari va amallari mavjud va bu misol ularning juda ko‘pidan faqat bittasi.
Quyida SQL in’eksiyasi zaifligini o‘z ichiga olgan psevdokod misoli keltirilgan.
$username = getUserName();
$pw = getPassword();
$user = mysql_query("SELECT * FROM userTable WHERE username = $username AND password = $pw");
if ($user) {
$loggedIn = True;
} else {
$loggedIn = False;
}Hujumchi bundan foydalanishi uchun nishondagi domenga qarshi hujumni o‘z ichiga olgan URL’ni quyidagicha tuzishi kifoya:
/login?username=admin&password=password' OR '1'='1password o‘zgaruvchisi SQL belgilarini o‘z ichiga oladigan qilib o‘rnatiladi, bu esa parol bizga noma’lum bo‘lsa ham, natijaviy SQL stringining qator qaytarishiga sabab bo‘ladi. Natijaviy SQL so‘rovi quyidagicha bo‘ladi:
SELECT * FROM userTable WHERE username = 'admin' AND password = 'password' OR '1'='1'Parametrlangan so‘rovlar (parameterized queries) SQL in’eksiyalariga qarshi tavsiya etiladigan yechimdir. Parametrlangan so‘rovda dasturchilar so‘rovga beriladigan har bir kirish qiymati muayyan qiymat va tip sifatida aniqlanishini puxta ta’minlaydi. Quyida yuqoridagi koddan xavfsiz yechim deb hisoblanadigan misol keltirilgan:
$username = getUserName();
$pw = getPassword();
$parameterizedQuery = prepare_query("SELECT * FROM userTable where username = ? and password = ?");
$parameterizedQuery.setString(1, $username)
$parameterizedQuery.setString(2, $password)
$user = parameterizedQuery.execute();
if ($user) {
$loggedIn = True;
} else {
$loggedIn = False;
}Yuqoridagi misolda dasturchi 1-parametr string bo‘lishi va username’ni, ikkinchi parametr esa parolni o‘z ichiga olishi kerakligini aniq belgilab qo‘ygan.
XSS ("Cross-Site Scripting" — saytlararo skripting)
XSS server tashrif buyuruvchilariga hujum qilish uchun serverdan foydalanadi. Hujum serverning o‘zini emas, balki uning foydalanuvchilarini nishonga oladi.
Server shunchaki hujumchining qiymatlarini, odatda JavaScript’ni, tashrif buyuruvchilarga aks ettirish uchun ishlatiladi, ular esa hujumchining ma’lumotlarini o‘z brauzerida ishga tushiradi. Hujumchi server tozalamaydigan kirish ma’lumotini tuzishi kerak; shunda tashrif buyuruvchi hujumchining qiymatlarini o‘z ichiga olgan havolani bosganda yoki hujumchi o‘z hujumida foydalangan veb-sahifadagi resursga kirganda, foydalanuvchi hujumchi taqdim etgan kodni ishga tushiradi.
Quyida Eve Alice’ga XSS hujumini o‘z ichiga olgan havola yuborayotganining grafik misoli keltirilgan:
Bu hujum Reflected XSS (aks ettirilgan XSS) deb ataladi va Eve zaiflikni topib, so‘ngra hech narsadan shubhalanmayotgan foydalanuvchiga hujumni o‘z ichiga olgan havolani yuborishi va uni havolani bosishga undashini o‘z ichiga oladi. Havola hujumni o‘z ichiga oladi va veb-serverni hujumni havolani bosgan qurbonga qaytarishga majbur qiladi.
Buning ortidagi kod quyidagi psevdokod misoli kabi oddiy bo‘lishi mumkin:
$nickname = etNickName();
echo "Greeting $nickname, nice to meet you!";XSS’ning yana bir turi Stored XSS (saqlanadigan XSS) hujumi deb ataladi. Stored XSS hujumlarida hujumchi veb-sahifada kontentni saqlay oladi va bu kontent har safar kimdir veb-saytga kirganda aks ettiriladi. Bunda kimningdir havolani bosishi shart emas.
Bu grafikda Eve resursga kirgan har qanday kishining brauzerida bajariladigan zararli JavaScript’ni qanday saqlay olishi tasvirlangan:
XSS hujumlari ko‘p narsaga erishishi mumkin, masalan:
- Autentifikatsiya uchun ishlatilishi mumkin bo‘lgan cookie’larni o‘g‘irlash
- Veb-saytning tashqi ko‘rinishini buzish (defacing) — veb-server ko‘rsatishni mo‘ljallamagan kontentni ko‘rsatish
- Foydalanuvchilarni fishing orqali soxta login formalariga hisob ma’lumotlarini kiritishga undash
XSS’dan himoyalanish uchun bir nechta eng yaxshi amaliyotlarga rioya qilish kerak:
- Veb-server JavaScript qayerdan va qanday bajarilishini qat’iy belgilaydigan CSP ("Content Security Policy" — kontent xavfsizligi siyosati) sarlavhalarini qaytarsin
- Veb-server foydalanuvchilarga qaytaradigan chiqish ma’lumotlarini xavfsiz kodlang, bu HTML belgilarini samarali ravishda kodlangan xavfsiz belgilarga aylantiradi
HTML kodlash
HTML kodlash veb-ilovaga odatda xavfli bo‘lgan belgilarni xavfsiz tarzda qaytarish imkonini beradi. Masalan, quyidagi maxsus belgilarni ularning tegishli muqobillariga kodlash mumkin:
| Maxsus belgi | HTML entity (belgi obyekti) |
|---|---|
| < | < |
| > | > |
| " | " |
| & | & |
| ' | ' |
Bu xavfsiz ko‘rsatilishi mumkin bo‘lgan chiqish ma’lumotlarini hosil qiladi. So‘ngra mijoz tomonida HTML entity’larni xavfsiz tarzda qiymatlarga aylantirish uchun JavaScript’dan foydalanishimiz mumkin.
CSP ("Content Security Policy" — kontent xavfsizligi siyosati)
Veb-server veb-saytda qanday turdagi JavaScript’ni ishga tushirishga ruxsat berilishini boshqarishi mumkin. Bu zaifliklarni bartaraf etmaydi, biroq noma’lum zaiflik mavjud bo‘lgan holatlar uchun chuqurlashtirilgan himoyani (defense in depth) qo‘shadi.
Keng tarqalgan va qat’iy CSP — veb-ilova foydalanuvchilariga barcha ruxsat etilgan JavaScript manba fayllari ro‘yxatini taqdim etish.
Bundan tashqari, CSP odatda sahifaga joylashtirilgan (in-line) JavaScript’ning bajarilishiga yo‘l qo‘ymaydi.
Joriy etishni osonlashtirish va davom etayotgan hujumlarni aniqlash uchun CSP mijozlarga CSP buzilishlari haqida server taqdim etgan URL’ga xabar berish imkonini beradi
Veb-ilovalarni skanerlash
Ko‘plab veb-ilova skanerlari mavjud. Ular ilovalarni SQL in’eksiyasi va XSS kabi zaifliklarga skanerlash imkonini beradi. Tarmoq zaifliklari skaneridan farqli o‘laroq, veb-ilova skaneri odatda signaturalar va ma’lum zaifliklar ro‘yxatlariga emas, balki evristikaga asoslanadi.
Veb-ilova skanerlari foydali, ayniqsa ular CI ("Continuous Integration" — uzluksiz integratsiya) va CD ("Continuous Delivery" — uzluksiz yetkazib berish) kabi ishlab chiqish jarayonlariga o‘rnatilganda
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
