Ushbu bo'limda DOM nima ekanini tavsiflaymiz, DOM ma'lumotlarini xavfsiz bo'lmagan tarzda qayta ishlash qanday zaifliklarni keltirib chiqarishini tushuntiramiz va o'z vebsaytlaringizda DOMga asoslangan zaifliklarning oldini qanday olish mumkinligini ko'rsatamiz.
Agar DOMga asoslangan zaifliklar ortidagi asosiy tushunchalar bilan allaqachon tanish bo'lsangiz va ularni real, ataylab zaif qilib yaratilgan nishonlarda amalda sinab ko'rmoqchi bo'lsangiz, quyidagi havola orqali ushbu mavzudagi barcha laboratoriyalarga kirishingiz mumkin.
Barcha DOMga asoslangan zaiflik laboratoriyalarini ko'rish
Document Object Model (DOM) — bu veb-brauzerning sahifadagi elementlarni ierarxik ko'rinishda tasvirlashidir. Vebsaytlar DOM'ning tugunlari (node) va obyektlarini, shuningdek ularning xususiyatlarini (property) o'zgartirish uchun JavaScript'dan foydalanishi mumkin. DOM'ni o'zgartirishning o'zi muammo emas. Aslida, bu zamonaviy vebsaytlar ishlashining ajralmas qismidir. Biroq ma'lumotni xavfsiz bo'lmagan tarzda qayta ishlaydigan JavaScript turli hujumlarga imkon berishi mumkin. DOMga asoslangan zaifliklar vebsayt hujumchi nazorat qila oladigan qiymatni — manba (source) deb ataladi — olib, uni xavfli funksiyaga — sink deb ataladi — uzatadigan JavaScript'ni o'z ichiga olganda yuzaga keladi.
DOMga asoslangan ko'plab zaifliklarni mijoz tomonidagi (client-side) kod hujumchi nazorat qila oladigan ma'lumotni qanday o'zgartirishidagi muammolarga bog'lash mumkin.
Bu zaifliklardan foydalanish yoki ularni yumshatish uchun avval manbalar (sources) va sink'lar (sinks) o'rtasidagi taint flow (ma'lumot oqimi) asoslari bilan tanishib olish muhim.
Manba (source) — bu hujumchi nazorat qilishi mumkin bo'lgan ma'lumotni qabul qiladigan JavaScript xususiyatidir (property). Manbaga misol — location.search xususiyati, chunki u so'rov satridan (query string) kirish ma'lumotini o'qiydi, buni esa hujumchi nisbatan oson nazorat qila oladi. Pirovardida, hujumchi nazorat qila oladigan har qanday xususiyat potensial manbadir. Bunga havola qiluvchi URL (document.referrer satri orqali ochiladi), foydalanuvchining cookie'lari (document.cookie satri orqali ochiladi) va web message'lar kiradi.
Sink — bu hujumchi nazorat qiladigan ma'lumot unga uzatilsa, nomaqbul oqibatlarni keltirib chiqarishi mumkin bo'lgan potensial xavfli JavaScript funksiyasi yoki DOM obyektidir. Masalan, eval() funksiyasi sink hisoblanadi, chunki u o'ziga uzatilgan argumentni JavaScript sifatida qayta ishlaydi. HTML sink'iga misol — document.body.innerHTML, chunki u hujumchiga zararli HTML kiritish va ixtiyoriy JavaScript bajarish imkonini berishi mumkin.
Asosan, DOMga asoslangan zaifliklar vebsayt ma'lumotni manbadan sink'ga uzatganda va sink uni mijoz sessiyasi kontekstida xavfsiz bo'lmagan tarzda qayta ishlaganda yuzaga keladi.
Eng keng tarqalgan manba — bu URL bo'lib, unga odatda location obyekti orqali murojaat qilinadi. Hujumchi jabrlanuvchini zaif sahifaga yuboradigan havola tuzib, foydali yukni (payload) URL'ning so'rov satri (query string) va fragment qismlariga joylashi mumkin. Quyidagi kodni ko'rib chiqing:
goto = location.hash.slice(1)
if (goto.startsWith('https:')) {
location = goto;
}Bu DOMga asoslangan open redirection'ga (ochiq qayta yo'naltirish) zaif, chunki location.hash manbasi xavfsiz bo'lmagan tarzda ishlanadi. Agar URL https: bilan boshlanadigan hash fragmentini o'z ichiga olsa, bu kod location.hash xususiyatining qiymatini olib, uni window'ning location xususiyati sifatida o'rnatadi. Hujumchi bu zaiflikdan quyidagi URL'ni tuzib foydalanishi mumkin:
https://www.innocent-website.com/example#https://www.evil-user.netJabrlanuvchi bu URL'ga tashrif buyurganda, JavaScript location xususiyatining qiymatini https://www.evil-user.net ga o'rnatadi va bu jabrlanuvchini avtomatik ravishda zararli saytga qayta yo'naltiradi. Bu xatti-harakatdan, masalan, fishing hujumini tuzish uchun oson foydalanish mumkin.
Quyidagilar turli taint-flow zaifliklaridan foydalanish uchun ishlatilishi mumkin bo'lgan odatiy manbalardir:
document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
DatabaseQuyidagi turdagi ma'lumotlar ham taint-flow zaifliklaridan foydalanish uchun manba sifatida ishlatilishi mumkin:
Quyidagi ro'yxat keng tarqalgan DOMga asoslangan zaifliklarni va ularning har biriga olib kelishi mumkin bo'lgan sink misolini qisqacha ko'rsatadi. Tegishli sink'larning to'liqroq ro'yxati uchun quyidagi havolalar orqali muayyan zaiflikka bag'ishlangan sahifalarga murojaat qiling. Har bir qatorda: zaiflik turi — misol sink.
document.write()window.locationdocument.cookieeval()document.domainWebSocket()element.srcpostMessage()setRequestHeader()FileReader.readAsText()ExecuteSql()sessionStorage.setItem()document.evaluate()JSON.parse()element.setAttribute()RegExp()DOMga asoslangan hujumlar tahdidini butunlay yo'q qiladigan yagona chora yo'q. Biroq, umuman olganda, DOMga asoslangan zaifliklardan qochishning eng samarali yo'li — har qanday ishonchsiz manbadan olingan ma'lumotning istalgan sink'ga uzatiladigan qiymatni dinamik ravishda o'zgartirishiga yo'l qo'ymaslikdir.
Agar ilovaning kerakli funksionalligi bu xatti-harakatni muqarrar qilsa, u holda mijoz tomonidagi kod ichida himoya choralari joriy qilinishi kerak. Ko'p hollarda tegishli ma'lumotni oq ro'yxat (whitelist) asosida tekshirish mumkin — faqat xavfsiz ekani ma'lum bo'lgan kontentga ruxsat beriladi. Boshqa hollarda ma'lumotni tozalash (sanitize) yoki kodlash (encode) zarur bo'ladi. Bu murakkab vazifa bo'lishi mumkin va ma'lumot joylanadigan kontekstga qarab, JavaScript escaping, HTML encoding va URL encoding'ni to'g'ri ketma-ketlikda birlashtirishni talab qilishi mumkin.
Muayyan zaifliklarning oldini olish choralari uchun yuqoridagi jadvaldan havola qilingan tegishli zaiflik sahifalariga murojaat qiling.
DOM clobbering — bu sahifaga HTML kiritib, DOM'ni o'zgartirish va pirovardida vebsaytdagi JavaScript'ning xatti-harakatini o'zgartirish uchun ishlatiladigan ilg'or texnikadir. 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.