Ushbu bo'limda web message'lar qabul qiluvchi (recipient) sahifada DOMga asoslangan zaifliklardan foydalanish uchun manba sifatida qanday ishlatilishi mumkinligini ko'rib chiqamiz. Shuningdek, bunday hujum qanday tuzilishini, jumladan keng tarqalgan origin-verifikatsiya (kelib chiqishni tekshirish) usullarini ko'pincha qanday chetlab o'tish mumkinligini tasvirlaymiz.
Agar sahifa kiruvchi web message'larni xavfsiz bo'lmagan tarzda — masalan, event listener'da kiruvchi xabarlarning kelib chiqishini (origin) to'g'ri tekshirmasdan — qayta ishlasa, event listener chaqiradigan xususiyat va funksiyalar potensial sink'ga aylanishi mumkin. Masalan, hujumchi zararli iframe joylashtirib, postMessage() metodi orqali web message ma'lumotini zaif event listener'ga uzatishi mumkin, u esa payload'ni ota (parent) sahifadagi sink'ga yuboradi. Bu xatti-harakat web message'lardan bu sink'larning istalganiga zararli ma'lumot tarqatish uchun manba sifatida foydalanish mumkinligini bildiradi.
Zaiflikning potensial ta'siri manzil (destination) hujjatining kiruvchi xabarni qanday qayta ishlashiga bog'liq. Agar manzil hujjat yuboruvchini xabarda zararli ma'lumot uzatmasligiga ishonsa va ma'lumotni sink'ga uzatib xavfsiz bo'lmagan tarzda qayta ishlasa, u holda ikki hujjatning birgalikdagi xatti-harakati hujumchiga, masalan, foydalanuvchini buzish (compromise) imkonini berishi mumkin.
Quyidagi kodni ko'rib chiqing:
<script>
window.addEventListener('message', function(e) {
eval(e.data);
});
</script>Bu zaif, chunki hujumchi quyidagi iframeni tuzib JavaScript payload'ni kiritishi mumkin:
<iframe src="//vulnerable-website" onload="this.contentWindow.postMessage('print()','*')">Event listener xabar kelib chiqishini tekshirmagani va postMessage() metodi targetOriginni "*" deb belgilagani uchun, event listener payload'ni qabul qilib uni sink'ga — bu holda eval() funksiyasiga — uzatadi.
Hatto event listener biror ko'rinishdagi origin tekshiruvini o'z ichiga olsa ham, bu tekshirish qadami ba'zan tubdan nuqsonli bo'lishi mumkin. Masalan, quyidagi kodni ko'rib chiqing:
window.addEventListener('message', function(e) {
if (e.origin.indexOf('normal-website.com') > -1) {
eval(e.data);
}
});indexOf metodi kiruvchi xabar kelib chiqishi normal-website.com domeni ekanini tekshirish uchun ishlatilgan. Biroq amalda u faqat origin URL'ida "normal-website.com" satri biror joyda uchrashi-uchramasligini tekshiradi. Natijada, agar hujumchining zararli xabari kelib chiqishi, masalan, http://www.normal-website.com.evil.net bo'lsa, u bu tekshirish qadamini oson chetlab o'tishi mumkin.
Xuddi shu nuqson startsWith() yoki endsWith() metodlariga tayanadigan tekshirishlarga ham taalluqli. Masalan, quyidagi event listener http://www.malicious-websitenormal-website.com originini xavfsiz deb hisoblaydi:
window.addEventListener('message', function(e) {
if (e.origin.endsWith('normal-website.com')) {
eval(e.data);
}
});Vebsayt yetarli origin tekshiruvining yo'qligi sababli ishonchsiz manbadan web message ma'lumotini qabul qilaversa, kiruvchi xabar event listener'i ishlatadigan har qanday sink potensial zaiflikka olib kelishi mumkin.