Web Application Attacks

...

SU

Kiber xavfsizlikda Veb Ilovalariga Hujumlar

Bugungi kunda veb ilovalar har joyda mavjud bo'lib, ular tasavvur qilishingiz mumkin bo'lgan deyarli hamma narsani boshqaradi. Ushbu bo'limda biz veb ilovalariga hujumlar va xavfsizlikni ko'rib chiqamiz.

IDOR ("Insecure Direct Object Reference") IDOR zaifliklari dasturchilar resurslarga kirish uchun avtorizatsiya talablarini amalga oshirmaganida yuzaga keladi.

IDOR

Eve, faqatgina identifikatorni o'zgartirib, masalan, hujjat Rest parametrini o'zgartirib, Alice'ning hujjatlariga kirishi mumkin.

Bu, veb ilova ob'ektlar o'rtasida avtorizatsiyani ta'minlamaganida yuzaga keladi, bu hujumchilarga qiymatlarni sanab chiqish va boshqa ma'lumot nuqtalariga kirishni sinab ko'rishga imkon beradi.

Misol uchun, quyidagi pseudo-kod avtorizatsiya izlari bo'lmaganligini ko'rsatishi mumkin:

$id = getInputFromUser();
$doc = getDocument($id);
return $doc;

Yuqoridagi kod foydalanuvchidan ma'lumot so'raydi, tekshiruv yoki sanitizatsiya o'tkazmaydi, so'ngra getDocument funksiyasi yordamida izlashni amalga oshiradi va hujjatni qaytaradi.

Yaxshi amalga oshirilgan kod avtorizatsiya huquqlarini tekshirishi kerak:

$id = getInputFromUser();
$user = findUsername();
$doc = "";
if (hasAccessToDocument($user, $id)) {
  $doc = getDocument($id);
} else {
  $doc = "Bu hujjat uchun avtorizatsiya qilinmagan";
}
return $doc;

Bunday zaifliklarni topish oson, chunki siz oddiy raqamni o'zgartirib, boshqalarning ma'lumotlariga kirishni ko'rishingiz mumkin. Avval foydalanuvchining avtorizatsiya qilinganligini tekshirish bu zaiflikni oldini oladi.

Eslatma

Pseudo-kod haqiqiy kodga o'xshash bo'lib, lekin amalda ishlamasligi mumkin. Bu haqiqiy kodning misolini ko'rsatish uchun ishlatiladi.

"Magic Numbers"dan qochish Ilova ma'lumotlarga murojaat qilishda raqamlar ketma-ketliklarini ishlatishdan qochishi kerak. IDOR misolida hujjatlar 1000 dan 1002 gacha bo'lgan identifikatorlarga ega edi. Ba'zan bu raqamlar "Magic Numbers" deb ataladi, chunki ular to'g'ridan-to'g'ri serverdagi resursni ko'rsatadi, masalan, ma'lumotlar bazasi orqali, va barcha qiymatlar osonlik bilan sanab chiqilishi mumkin. Misol uchun, hujumchi barcha hujjat identifikatorlarini 0 dan 10000 gacha tekshirishi va ma'lumotlarga kirishni ta'minlaydigan natijalarni yozib olish mumkin.

Avtorizatsiya to'g'ri amalga oshirilishi kerak bo'lsa-da, ma'lumotlarga murojaat qilishda GUID ("Globally Unique Identifier") yoki UUID ("Universally Unique Identifier") ishlatish ham foydali bo'ladi. Ushbu identifikatorlar global miqyosda noyob bo'lishi va raqamlarni yaratishdagi o'rnatilgan entropiya tufayli sanab chiqish qiyin bo'lishi kerak.

GUID quyidagicha ko'rinishi mumkin:

3377d5a6-236e-4d68-be9c-e91b22afd216

Eslatma

Yuqoridagi raqamni taxmin qilish matematikasiga qarasak, uni sanab chiqish oson emasligini tezda ko'rishimiz mumkin. Sanab chiqish - bu qiymatning barcha mumkin bo'lgan variantlarini ko'rib chiqish texnikasi, GUID yoki UUID buni oldini oladi.

SQL Injection Ko'plab veb ilovalar ma'lumotlar bazasiga ulangan. Ma'lumotlar bazasi veb ilovaning saqlamoqchi bo'lgan va foydalanmoqchi bo'lgan barcha ma'lumotlarni saqlaydi.

SQL Injection - bu hujumchilarni veb ilovaning ishlab chiquvchisi foydalanayotgan SQL ("Structured Query Language") so'rovlarini manipulyatsiya qilish imkonini beruvchi texnikadir. Bu odatda ma'lumotlarni sanitizatsiya qilmaslik tufayli yuzaga keladi. SQL dasturchilar tomonidan ma'lumotlar bazasi resurslariga kirish uchun muntazam ishlatiladi.

SQL Injection

Eve yuqoridagi grafikada talab qilingan qiymatni quyidagicha kiritsa:

1000' OR '1'='1

Bu SQL so'rovi natijasida barcha qatorlarni qaytaradi, chunki ma'lumotlar bazasi bu ifodani har doim to'g'ri deb baholaydi. Tasavvur qiling: ma'lumotlar bazasi 1000 yoki 1 teng 1 bo'lishi mumkin bo'lgan so'rovni oladi; u har doim qiymatni qaytaradi! SQL sintaksisini manipulyatsiya qilish uchun ko'plab turli funksiyalar va operatsiyalar mavjud, va bu misol faqat ko'pchilikdan biridir.

Quyida SQL Injection zaifligiga ega bo'lgan pseudo-kod 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;
}

Bu kodda foydalanuvchi nomi va parol o'zgaruvchilari uchun sanitizatsiya mavjud emas; ular to'g'ridan-to'g'ri SQL so'roviga qo'shiladi va bu zaiflikni yuzaga keltiradi. Kod $loggedIn o'zgaruvchisini so'rov har qanday qiymatni qaytaradigan bo'lsa, o'rnatish imkonini beradi.

Hujumchi buni exploatatsiya qilish uchun, maqsadli domen bo'yicha SQL Injection bo'lgan URLni yaratishi mumkin:

/login?username=admin&password=password' OR '1'='1

Parol o'zgaruvchisi SQL belgilarini o'z ichiga olgan qiymatni oladi, natijada SQL so'rovi qatorda qaytariladi, hatto parol bizga noma'lum bo'lsa ham. Natijaviy SQL so'rovi quyidagicha bo'ladi:

SELECT * FROM userTable WHERE username = 'admin' AND password = 'password' OR '1'='1'

SQL Injection-ni oldini olish uchun parametrizatsiya qilingan so'rovlar tavsiya etiladi. Parametrizatsiya qilingan so'rovda dasturchilar har bir kirishni maxsus qiymat va tur sifatida aniqlashga ehtiyot bo'lishadi. Quyida yuqoridagi koddan xavfsiz amalga oshirilgan misol:

$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 birinchi parametrni satr bo'lishi va foydalanuvchi nomini o'z ichiga olishi kerakligini va ikkinchi parametrda parol bo'lishi kerakligini aniq belgilagan.

Eslatma: SQL Injection dasturchilar foydalanuvchi kiritmasini ehtiyotkorlik bilan sanitizatsiya qilmaslik tufayli yuzaga keladi, shuning uchun hujumchi ilovani va ma'lumotlar bazasini ruxsat etilmagan SQL kodini bajarishga aldashga imkon beradi.

XSS ("Cross-Site Scripting") XSS serverni serverga tashrif buyuruvchilarga hujum qilish uchun ishlatadi. Hujum serverni o'zini maqsad qilmaydi, balki foydalanuvchilarni maqsad qiladi.

Server hujumchilarning qiymatlarini, odatda JavaScript, tashrif buyuruvchilarga aks ettirish uchun ishlatiladi, bu foydalanuvchilar hujumchining ma'lumotlarini o'z brauzerlarida ishga tushiradilar. Hujumchi server tomonidan tozalanmaydigan va sanitizatsiya qilinmaydigan kirishni tayyorlashi kerak, shunda tashrif buyuruvchi hujumchining qiymatlarini o'z ichiga olgan havolani bosganida yoki hujumchi o'z hujumida ishlatgan veb-sahifadagi resursni ko'rganida, foydalanuvchi hujumchining taqdim etgan kodini ishga tushiradi.

Quyida Eve tomonidan Alice'ga yuborilgan va XSS hujumini o'z ichiga olgan havolani ko'rsatadigan grafik misol mavjud:

SQL Injection

Bu hujum Reflected XSS deb ataladi va Eve zaiflikni topib, so'ngra hujumni o'z ichiga olgan havolani noaniq foydalanuvchiga yuboradi va u havolani bossa, web-server hujumni qurbonning brauzeriga qaytaradi.

Bu orqa kod oddiy bo'lishi mumkin, masalan:

$nickname = etNickName();
echo "Salom $nickname, tanishganimdan xursandman!";

XSS-ning boshqa bir turi Stored XSS hujumi deb ataladi. Stored XSS hujumlarida hujumchi veb-sahifada mazmunni saqlash imkoniyatiga ega bo'ladi, bu sahifa har safar kimdir veb-saytga kirganida aks ettiriladi. Bu havolani bosishni talab qilmaydi.

Quyidagi grafikda Eve qanday qilib zararli JavaScript-ni saqlab qolishi va uni har qanday foydalanuvchining brauzerida bajarilishiga olib kelishi tasvirlangan:

SQL Injection

XSS hujumlari ko'p narsalarni amalga oshirishi mumkin, masalan:

  • Cookie-fayllarni o'g'irlash, bu esa autentifikatsiya uchun ishlatilishi mumkin.
  • Veb-saytni buzish, veb-server tomonidan maqsad qilinmagan mazmunni taqdim etish.
  • Foydalanuvchilarni soxta kirish shakllarida credentiallarni qoldirishga chorlash (phishing).

XSS hujumlariga qarshi himoyalanish uchun bir nechta eng yaxshi amaliyotlarni bajarish kerak:

  • Veb-serverga CSP ("Content Security Policy") sarlavhalarini qaytarishni ruxsat berish, bu JavaScript qanday ishlatilishini qat'iy belgilaydi.
  • Foydalanuvchilarga qaytarilayotgan chiqishni xavfsiz tarzda kodlash, HTML belgilarini kodlangan xavfsiz belgilarga aylantirish.

HTML Kodlash

HTML kodlash veb-ilovaga odatda xavfli belgilarni xavfsiz tarzda qaytarishga imkon beradi. Masalan, quyidagi maxsus belgilar o'z mos keladigan HTML entitilariga kodlanishi mumkin:

Maxsus BelgilarHTML Entitisi
<&lt;
>&gt;
"&quot;
&&amp;
'&apos;

Bu xavfsiz tarzda ko'rsatilishi mumkin bo'lgan chiqishni ishlab chiqaradi. Keyin, JavaScript-ni mijoz tomonida HTML entitilarini qiymatlarga xavfsiz tarzda aylantirish uchun ishlatish mumkin.

CSP ("Content Security Policy")

Veb-server veb-saytda qanday JavaScript kodlari bajarilishiga nazorat qilish imkoniyatini beradi. Bu zaifliklarni olib tashlamaydi, lekin noma'lum zaifliklar uchun chuqurroq himoya qo'shadi.

Oddiy va qat'iy CSP foydalanuvchilarga veb-ilovaga qabul qilingan barcha JavaScript manba fayllarining ro'yxatini taqdim etishni o'z ichiga oladi.

Bundan tashqari, CSP odatda inline JavaScript kodlarining bajarilishini oldini oladi.

Yengil amalga oshirish va davom etayotgan hujumlarni aniqlash uchun CSP mijozlarga CSP buzilishlarini server tomonidan taqdim etilgan URL-ga xabar qilish imkonini beradi.

Veb-ilova Skanning

Ko'plab veb-ilova skanerlari mavjud. Ular SQL Injection va XSS kabi zaifliklarni tekshirishi mumkin. Tarmoq zaifliklarini skanerlashdan farqli o'laroq, veb-ilova skanerlari odatda heuristikaga asoslangan bo'lib, tanish zaifliklar ro'yxati yoki imzolar o'rniga ishlaydi.

Veb-ilova skanerlari foydali, ayniqsa CI ("Continuous Integration") va CD ("Continuous Delivery") kabi rivojlantirish jarayonlariga qo'shilgan bo'lsa.

Ushbu sahifada

GitHubda tahrirlash