Clickjacking hujumi
Clickjacking (so'zma-so'z: bosishni o'g'irlash) โ bu foydalanuvchini bilmagan holda zararli tugmani bosishga majburlovchi hujum. Hujumchi qurbon saytni ko'rinmas iframega joylashtiradi va foydalanuvchi o'zi ko'rgan sahifada bosaman deb, aslida yashiringan saytdagi tugmani bosadi. Ushbu darsda hujum qanday ishlashini va undan qanday himoyalanishni chuqur o'rganamiz.
Hujumning g'oyasi
Clickjacking g'oyasi oddiy va ayni paytda ayyorona. Tasavvur qiling, hujumchi (evil.com sayti) foydalanuvchini biror ijtimoiy tarmoqdagi "Yoqdi" (Like) tugmasini yoki "Ha, ruxsat beraman" tugmasini bosishga majburlamoqchi.
Hujum bosqichlari:
- Hujumchi o'z saytida (
evil.com) foydalanuvchini qiziqtiradigan biror narsa (masalan, "Bu yerni bosing va sovg'a yutib oling" tugmasi) ko'rsatadi; - Aynan shu tugma ustiga, ko'rinmas qilib, qurbon saytni (masalan,
facebook.comning "Like" tugmasi bilan)iframeda joylashtiradi; - Foydalanuvchi "sovg'a" tugmasini bosaman deb o'ylab, aslida ko'rinmas iframe ichidagi "Like" tugmasini bosadi;
- Agar foydalanuvchi o'sha ijtimoiy tarmoqqa allaqachon kirgan bo'lsa (cookie mavjud), bosish haqiqiy hisoblanadi va harakat bajariladi.
Muhim jihat: hujum foydalanuvchi qurbon saytga tizimga kirgan (login qilingan) holatidan foydalanadi. Bosish qurbon saytda amalga oshadi, cookie'lar odatdagidek yuboriladi, shuning uchun sayt bosishni qonuniy deb qabul qiladi.
Hujumning texnik ko'rinishi
Hujumchi sahifasi taxminan quyidagicha tuziladi. Qurbon sahifasi iframeda yuklanadi, lekin u shaffof (opacity) qilinadi va aldov tugma tagida joylashtiriladi:
<style>
iframe { /* qurbon sayt iframe'i */
width: 400px;
height: 100px;
position: absolute;
top: 0; left: -20px;
opacity: 0.0001; /* deyarli ko'rinmas! */
z-index: 1; /* tugmadan ustun */
}
.decoy { /* aldov tugma */
position: absolute;
top: 0; left: 0;
z-index: 0; /* iframe ostida */
}
</style>
<div class="decoy">
<button>Bu yerni bosing va sovg'a oling!</button>
</div>
<iframe src="https://victim.com"></iframe>
Bu yerda hiyla:
opacity: 0.0001โ iframe deyarli to'liq ko'rinmas, lekin texnik jihatdan hali ham mavjud va bosishlarni qabul qiladi;z-index: 1โ iframe aldov tugmadan (z-index: 0) ustunroq qatlamda, shuning uchun bosish iframe'ga tushadi;- iframe qurbon saytning kerakli tugmasi ustma-ust keladigan qilib joylashtiriladi.
Nega an'anaviy himoya yetarli emas?
Ba'zi eski himoya usullari (masalan, JavaScript orqali "agar men iframe ichida bo'lsam, chiqib ketaman" degan busting kod) ishonchsiz. Masalan:
// eski, ishonchsiz himoya (frame busting):
if (top !== self) {
top.location = self.location;
}
Bu usul zaif, chunki:
- Hujumchi
iframegasandboxatributini qo'yib, undagi navigatsiyani bloklashi mumkin โ shundatop.locationni o'zgartirish ishlamaydi; - Ba'zi hollarda brauzer
beforeunloadhodisasi orqali foydalanuvchini qo'shimcha dialog bilan chalg'itish mumkin; - JavaScript o'chirilgan bo'lsa, bu himoya umuman ishlamaydi.
Shuning uchun ishonchli himoya server tomonidagi HTTP sarlavhalari bilan ta'minlanadi โ brauzer saytni umuman iframe'ga qo'yishga ruxsat bermaydi.
Himoya 1: X-Frame-Options
X-Frame-Options โ bu sayt tomonidan yuboriladigan HTTP javob sarlavhasi. U brauzerga sahifani iframe'ga qo'yishga ruxsat berish yoki bermaslikni aytadi. Uch qiymati bor:
X-Frame-Options: DENYโ sahifani hech qanday iframe'ga qo'yishga ruxsat berilmaydi (hatto o'z sayti ichida ham);X-Frame-Options: SAMEORIGINโ sahifani faqat bir xil manbadagi iframe'ga qo'yish mumkin;X-Frame-Options: ALLOW-FROM https://example.comโ faqat ko'rsatilgan manbaga ruxsat (eskirgan, ko'p brauzerlar qo'llab-quvvatlamaydi).
// Server javob sarlavhalari (misol):
X-Frame-Options: SAMEORIGIN
// yoki umuman ruxsat bermaslik:
X-Frame-Options: DENY
Agar brauzer bu sarlavhani ko'rsa va u DENY yoki mos kelmagan manba bo'lsa, u sahifani iframe'da umuman ko'rsatmaydi โ hujumchi qurbon saytni yashira olmaydi.
X-Frame-Options โ HTTP javob sarlavhasi. Uni HTML <meta> tegi orqali qo'yib bo'lmaydi โ u albatta server tomonidan yuborilishi kerak. Serveringiz konfiguratsiyasida (Nginx, Apache, Express va h.k.) sozlanadi.Himoya 2: CSP frame-ancestors
Zamonaviyroq va moslashuvchan usul โ Content-Security-Policy (CSP) sarlavhasidagi frame-ancestors direktivasi. U X-Frame-Options o'rnini bosadi va ko'proq imkoniyat beradi:
// hech kim iframe'ga qo'ya olmasin:
Content-Security-Policy: frame-ancestors 'none'
// faqat o'z manbamiz:
Content-Security-Policy: frame-ancestors 'self'
// aniq ro'yxat:
Content-Security-Policy: frame-ancestors 'self' https://trusted.com https://partner.com
'none'โX-Frame-Options: DENYbilan bir xil: hech qanday iframe'ga ruxsat yo'q;'self'โSAMEORIGINbilan bir xil: faqat o'z manbamiz;- manzillar ro'yxati โ bir nechta ishonchli manbaga ruxsat berish mumkin (bu
X-Frame-Optionsda yo'q imkoniyat).
frame-ancestorsni afzal ko'ring, chunki u moslashuvchan va zamonaviy standart. Eski brauzerlar uchun qo'shimcha xavfsizlik sifatida X-Frame-Optionsni ham qo'shib qo'yish mumkin โ ikkalasini birga ishlatish keng tarqalgan amaliyot.Himoya 3: SameSite cookie
Clickjacking hujumi foydalanuvchining cookie'lari avtomatik yuborilishiga tayanadi (chunki qurbon saytga tizimga kirgan). Agar autentifikatsiya cookie'lari boshqa saytdagi iframe'dan yuborilmasa, hujum foydasiz bo'ladi โ sayt bosishni anonim deb qabul qiladi.
Cookie'ning SameSite atributi aynan shu vaziyatni boshqaradi:
SameSite=Strictโ cookie faqat sahifaning o'z manbasidan so'rovlarga yuboriladi; boshqa saytdagi iframe yoki havoladan kelgan so'rovlarga yuborilmaydi;SameSite=Laxโ cookie odatdagi navigatsiyalarda yuboriladi, lekin ko'plab cross-site kontekstlarda (jumladan iframe'lardagi so'rovlar) yuborilmaydi. Bu zamonaviy brauzerlarda standart qiymat;SameSite=Noneโ cookie barcha kontekstlarda yuboriladi (bundaSecureham majburiy). Bu clickjacking'ga qarshi himoyani o'chiradi.
// Server tomonidan cookie o'rnatish (misol):
Set-Cookie: session=abc123; SameSite=Strict; Secure; HttpOnly
SameSite=Lax (yoki Strict) tufayli, hujumchi iframe'idagi qurbon saytga so'rovda autentifikatsiya cookie'lari qo'shilmaydi. Shunda bosish tizimga kirmagan (anonim) foydalanuvchi harakati sifatida ko'rinadi va zararli amal bajarilmaydi.SameSite kuchli himoya, lekin u yagona yechim emas. Ba'zi holatlar (masalan, GET orqali amalga oshiriladigan xavfsiz bo'lmagan operatsiyalar yoki SameSite=None ishlatilgan cookie'lar) hali ham zaif bo'lishi mumkin. Uni frame-ancestors/X-Frame-Options bilan birga ishlating.Ko'p qatlamli himoya
Ishonchli xavfsizlik uchun himoya usullarini birgalikda qo'llash tavsiya etiladi. To'liq strategiya:
- frame-ancestors (CSP) โ sahifani begona iframe'ga qo'yishni to'sish (asosiy himoya);
- X-Frame-Options โ eski brauzerlar uchun zaxira himoya;
- SameSite cookie โ cross-site kontekstda autentifikatsiya cookie'larini yubormaslik;
- Muhim amallar uchun qo'shimcha tasdiqlash (masalan, tugma bosilgach parolni yoki CAPTCHA'ni so'rash) โ hujumchi buni takrorlay olmaydi.
frame-ancestors + SameSite + muhim amallar uchun tasdiqlash birgalikda kuchli himoya beradi.Xulosa
- Clickjacking โ foydalanuvchini ko'rinmas iframe ustidagi tugmani bilmasdan bosishga majburlovchi hujum;
- Hujum qurbon saytga tizimga kirgan (login) holatdan va avtomatik yuboriladigan cookie'lardan foydalanadi;
- JavaScript orqali "frame busting" himoyasi ishonchsiz โ server tomonidagi himoya kerak;
X-Frame-Options(DENY/SAMEORIGIN) sahifani iframe'ga qo'yishni bloklaydi;Content-Security-Policy: frame-ancestorsโ zamonaviy va moslashuvchan muqobil;SameSitecookie atributi cross-site kontekstda autentifikatsiya cookie'larini yubormaydi va hujumni foydasiz qiladi;- Eng yaxshi natija uchun bu himoyalarni birgalikda ishlating.