âClickjackingâ hujumi yomon sahifaga tashrif buyuruvchi nomidan "jabrlanuvchi sayt"da bosish imkonini beradi.
Koâplab saytlar shu tariqa buzilgan, jumladan Twitter, Facebook, Paypal va boshqa saytlar. Albatta, ularning hammasi tuzatilgan.
Gâoya
Gâoya juda oddiy.
Mana Facebook bilan clickjacking qanday amalga oshirilgan:
- Tashrif buyuruvchi yomon sahifaga aldatiladi. Bu qanday boâlishi muhim emas.
- Sahifada zararsiz koârinadigan havola bor (âhozir boyib ketâ yoki âbu yerda bos, juda kulgiliâ kabi).
- Oâsha havolaning ustiga yomon sahifa facebook.com dan
srcbilan shaffof<iframe>ni joylashtiradi, shunday qilib âLikeâ tugmasi oâsha havolaning toâgâri ustida boâladi. Odatda buz-indexbilan amalga oshiriladi. - Havolani bosishga harakat qilganda, tashrif buyuruvchi aslida tugmani bosadi.
Demo
Mana yomon sahifa qanday koârinadi. Narsalarni aniqlashtirish uchun <iframe> yarim shaffof (haqiqiy yomon sahifalarda u toâliq shaffof):
<style>
iframe { /* jabrlanuvchi saytdan iframe */
width: 400px;
height: 100px;
position: absolute;
top:0; left:-20px;
opacity: 0.5; /* haqiqatda opacity:0 */
z-index: 1;
}
</style>
<div>Hozir boyib ketish uchun bos:</div>
<!-- Jabrlanuvchi saytdan url -->
<iframe src="/clickjacking/facebook.html"></iframe>
<button>Bu yerda bos!</button>
<div>...Va siz zo'rsiz (Men aslida zo'r hacker man)!</div>
Hujumning toâliq demosi:
<!DOCTYPE html>
<html>
<body style="margin: 10px; padding: 10px">
<input
type="button"
onclick="alert('facebook.html da like bosildi!')"
value="Men bunu yaxshi ko'raman!"
/>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 5px;
left: -14px;
opacity: 0.5;
z-index: 1;
}
</style>
<div>Ijtimoiy tarmoqlarda tavakkal qo'shilish uchun:</div>
<!-- Jabrlanuvchi saytining url-i -->
<iframe src="facebook.html"></iframe>
<button>Buni bosing!</button>
<div>...Va siz zo'rsiz (aslida men ajoyib xakerman)!</div>
</body>
</html>Bu yerda bizda yarim shaffof <iframe src="facebook.html"> bor va misolda uni tugma ustida suzayotganini koârishimiz mumkin. Tugmani bosish aslida iframe ni bosadi, lekin bu foydalanuvchi uchun koârinmaydi, chunki iframe shaffof.
Natijada, agar tashrif buyuruvchi Facebook da avtorizatsiyalangan boâlsa (âmeni eslab qolâ odatda yoqilgan), u holda âLikeâ qoâshadi. Twitter da bu âFollowâ tugmasi boâlardi.
Mana bir xil misol, lekin haqiqatga yaqinroq, <iframe> uchun opacity:0 bilan:
<!DOCTYPE html>
<html>
<body style="margin: 10px; padding: 10px">
<input
type="button"
onclick="alert('facebook.html da like bosildi!')"
value="Men bunu yaxshi ko'raman!"
/>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 5px;
left: -14px;
opacity: 0;
z-index: 1;
}
</style>
<div>Ijtimoiy tarmoqlarda tavakkal qo'shilish uchun:</div>
<!-- Jabrlanuvchi saytidan url -->
<iframe src="facebook.html"></iframe>
<button>Bu yerni bosing!</button>
<div>...Va siz zo'rsiz (aslida men ajoyib xakerman)!</div>
</body>
</html>Hujum qilish uchun bizga kerak boâlgan narsa â yomon sahifada <iframe> ni shunday joylashtirishki, tugma havolaning toâgâri ustida boâlsin. Shunda foydalanuvchi havolani bosganda, ular aslida tugmani bosadi. Bu odatda CSS bilan amalga oshirilishi mumkin.
Hujum faqat sichqoncha harakatlariga taâsir qiladi (yoki mobilda tegish kabi shunga oâxshashlar).
Klaviatura kiritishini yoânaltirish ancha qiyin. Texnik jihatdan, agar buzish uchun matn maydonimiz boâlsa, iframe ni shunday joylashtirishimiz mumkinki, matn maydonlari bir-birining ustiga tushsin. Shunda tashrif buyuruvchi sahifada koârgan kiritishga fokuslanishga harakat qilganda, ular aslida iframe ichidagi kiritishga fokuslanadi.
Lekin keyin muammo bor. Tashrif buyuruvchi yozgan hamma narsa yashirin boâladi, chunki iframe koârinmaydi.
Odamlar odatda ekranda yangi belgilarining chop etilayotganini koâra olmasalar, yozishni toâxtatadilar.
Eski maktab mudofaasi (zaif)
Eng qadimiy mudofaa sahifani ramkada ochishni taqiqlovchi bir oz JavaScript (soâzma-soâz âframebustingâ deb ataladi).
Bu shunday koârinadi:
if (top != window) {
top.location = window.location;
}
Yaâni: agar oyna oâzining yuqorida emasligini bilsa, u avtomatik ravishda oâzini yuqoriga qoâyadi.
Bu ishonchli mudofaa emas, chunki uni buzishning koâplab usullari mavjud. Bir nechtasini koârib chiqaylik.
Top-navigation ni bloklash
Biz beforeunload hodisa ishlov beruvchisida top.location ni oâzgartirish sabab boâlgan oâtishni bloklay olamiz.
Yuqori sahifa (oârab turuvchi, hackerga tegishli) unga oldini oluvchi ishlov beruvchi oârnatadi:
window.onbeforeunload = function() {
return false;
};
iframe top.location ni oâzgartirishga harakat qilganda, tashrif buyuruvchi chiqishni xohlash-xohlamasligini soâraydigan xabar oladi.
Koâp hollarda tashrif buyuruvchi salbiy javob beradi, chunki ular iframe haqida bilmaydi â ular faqat yuqori sahifani koârishadi, chiqish uchun hech qanday sabab yoâq. Shunday qilib top.location oâzgarmaydi!
Amalda:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<div>top.location ni javascript.info ga o'zgartiradi</div>
<script>
top.location = "https://javascript.info";
</script>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 0;
left: -20px;
opacity: 0;
z-index: 1;
}
</style>
<script>
function attack() {
window.onbeforeunload = function () {
window.onbeforeunload = null;
return "Barcha sirlarni o'rganmasdan ketishni xohlaysizmi (he-he)?";
};
document.body.insertAdjacentHTML(
"beforeend",
'<iframe src="iframe.html">'
);
}
</script>
</head>
<body>
<p>
Tugmani bosgandan so'ng, tashrif buyuruvchiga "g'alati" savol tug'iladi
ular ketishni xohlaydilarmi.
</p>
<p>Ehtimol, ular "Yo'q" deb javob berishadi va iframe himoyasi buzilgan.</p>
<button onclick="attack()">"Himoyalangan" iframe qo'shing</button>
</body>
</html>Sandbox xossasi
sandbox xossasi tomonidan cheklanadigan narsalardan biri navigatsiyadir. Sandbox qilingan iframe top.location ni oâzgartira olmaydi.
Shunday qilib, biz iframe ni sandbox="allow-scripts allow-forms" bilan qoâshishimiz mumkin. Bu cheklovlarni yumshatadi, skriptlar va formalarga ruxsat beradi. Lekin biz allow-top-navigation ni qoldiramiz, shunda top.location ni oâzgartirish taqiqlanadi.
Mana kod:
<iframe sandbox="allow-scripts allow-forms" src="facebook.html"></iframe>
Bu oddiy himoyani chetlab oâtishning boshqa usullari ham bor.
X-Frame-Options
Server tomonidagi X-Frame-Options sarlavhasi sahifani ramka ichida koârsatishga ruxsat berishi yoki taqiqlashi mumkin.
U aniq HTTP-sarlavha sifatida yuborilishi kerak: brauzer uni HTML <meta> tegida topsa eâtiborsiz qoldiradi. Shuning uchun <meta http-equiv="X-Frame-Options"...> hech narsa qilmaydi.
Sarlavha 3 ta qiymatga ega boâlishi mumkin:
DENY- Sahifani hech qachon ramka ichida koârsatmang.
SAMEORIGIN- Agar ota hujjat bir xil kelib chiqishdan kelsa, ramka ichida ruxsat bering.
ALLOW-FROM domain- Agar ota hujjat berilgan domendan boâlsa, ramka ichida ruxsat bering.
Masalan, Twitter X-Frame-Options: SAMEORIGIN dan foydalanadi.
Mana natija:
<iframe src="https://twitter.com"></iframe>
Brauzeringizga qarab, yuqoridagi iframe yo boâsh yoki brauzer oâsha sahifani bu tarzda navigatsiya qilishga ruxsat bermasligini bildiradigan ogohlantirish.
Oâchirilgan funksionallik bilan koârsatish
X-Frame-Options sarlavhasining yon taâsiri bor. Boshqa saytlar bizning sahifamizni ramkada koârsata olmaydi, hatto ularda buning uchun yaxshi sabablari boâlsa ham.
Shuning uchun boshqa yechimlar mavjud⦠Masalan, biz sahifani height: 100%; width: 100%; stillari bilan <div> bilan âqoplashimizâ mumkin, shunda u barcha bosishlarni toâsadi. Agar window == top boâlsa yoki himoya kerak emasligini aniqlasak, oâsha <div> olib tashlanishi kerak.
Mana shunday:
<style>
#protector {
height: 100%;
width: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 99999999;
}
</style>
<div id="protector">
<a href="/" target="_blank">Saytga o'ting</a>
</div>
<script>
// yuqori oyna boshqa kelib chiqishdan bo'lsa xato bo'ladi
// lekin bu yerda bu yaxshi
if (top.document.domain == document.domain) {
protector.remove();
}
</script>
Demo:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<style>
#protector {
height: 100%;
width: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 99999999;
}
</style>
</head>
<body>
<div id="protector">
<a href="/" target="_blank">Saytga o'tish</a>
</div>
<script>
if (top.document.domain == document.domain) {
protector.remove();
}
</script>
Ushbu matn har doim ko'rinadi. Ammo agar sahifa hujjat ichida ochiq bo'lsa
boshqa domen, uning ustidagi div har qanday harakatni oldini oladi.
<button onclick="alert(1)">Bunday holda bosish ishlamaydi</button>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<iframe src="iframe.html"></iframe>
</body>
</html>Samesite cookie xossasi
samesite cookie xossasi ham clickjacking hujumlarini oldini olishi mumkin.
Bunday xossaga ega cookie faqat veb-saytga toâgâridan-toâgâri ochilganda yuboriladi, ramka orqali yoki boshqacha yoâl bilan emas. Cookies, document.cookie bobida koâproq maâlumot.
Agar Facebook kabi sayt oâzining autentifikatsiya cookie sida samesite xossasiga ega boâlsa, masalan:
Set-Cookie: authorization=secret; samesite
â¦U holda bunday cookie Facebook boshqa saytdan iframe da ochilganda yuborilmaydi. Shunday qilib hujum muvaffaqiyatsiz boâladi.
samesite cookie xossasi cookie lar ishlatilmaganda taâsir qilmaydi. Bu boshqa veb-saytlarga bizning ochiq, autentifikatsiyalanmagan sahifalarimizni iframe larda osongina koârsatish imkonini berishi mumkin.
Biroq, bu clickjacking hujumlarining bir necha cheklangan hollarda ishlashiga ham imkon berishi mumkin. Masalan, IP manzillarni tekshirish orqali takroriy ovoz berishning oldini oladigan anonim soârov veb-sayti hali ham clickjacking uchun zaif boâladi, chunki u cookie lar yordamida foydalanuvchilarni autentifikatsiya qilmaydi.
Xulosa
Clickjacking foydalanuvchilarni nima sodir boâlayotganini bilmasdan ham jabrlanuvchi saytni bosishga âaldashâ usulidir. Muhim bosish bilan faollashadigan harakatlar boâlsa, bu xavfli.
Hacker oâzining yomon sahifasiga havolani xabarda joylashtirishishi yoki tashrif buyuruvchilarni boshqa usullar bilan oâz sahifasiga jalb qilishi mumkin. Koâplab variantlar mavjud.
Bir tomondan â hujum âchuqur emasâ: hacker faqat bitta bosishni toâsib oladi. Lekin boshqa tomondan, agar hacker bosishdan keyin boshqa boshqaruv paydo boâlishini bilsa, u holda ular foydalanuvchini ularni ham bosishga majburlash uchun ayyor xabarlardan foydalanishi mumkin.
Hujum juda xavfli, chunki UI ni loyihalashtirishda biz odatda hackerning tashrif buyuruvchi nomidan bosishini kutmaymiz. Shuning uchun zaifliklar butunlay kutilmagan joylarda topilishi mumkin.
- Ramka ichida koârishga moâljallanmagan sahifalarda (yoki butun veb-saytlarda)
X-Frame-Options: SAMEORIGINdan foydalanish tavsiya etiladi. - Agar sahifalarimizni iframe larda koârsatishga ruxsat berishni xohlasak, lekin xavfsiz boâlishni istasak, qoplaydi
<div>dan foydalaning.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)