Ushbu bo'limda DOM-based XSS (DOM XSS)'ni ta'riflaymiz, uni qanday topish va turli source/sinklar bilan qanday ekspluatatsiya qilishni tushuntiramiz.
DOM-based XSS zaifliklari JavaScript hujumchi boshqaradigan manbadan (source, masalan URL) ma'lumot olib, uni dinamik kod bajarilishini qo'llab-quvvatlaydigan sink'ga (masalan eval() yoki innerHTML) uzatganda yuzaga keladi. DOM XSS uchun eng keng tarqalgan source — URL, u odatda window.location obyekti orqali olinadi. Source va sinklar orasidagi taint oqimi haqida batafsil: DOM-based zaifliklar sahifasi.
DOM XSS'ni qo'lda sinash uchun odatda developer tools'li brauzer (masalan Chrome) kerak. Har bir source'ni navbatma-navbat sinashingiz kerak.
HTML sinkda DOM XSS'ni sinash uchun source'ga (masalan location.search) tasodifiy satr qo'yib, developer tools bilan u DOM'da qayerda paydo bo'lishini qidiring. "View source" ishlamaydi, chunki u JavaScript o'zgarishlarini hisobga olmaydi. Chrome'da Ctrl+F bilan DOM'ni qidiring.
Bu sinklarda kiritmangiz DOM'da paydo bo'lmasligi mumkin, shuning uchun JavaScript debugger bilan kiritma sink'ga qanday yetib borishini kuzatishingiz kerak. Har bir source uchun (masalan location) u kodda qayerda o'qilishini topib, break point qo'yib, qiymat qanday ishlatilishini kuzating.
DOM XSS'ni qo'lda topish zerikarli bo'lishi mumkin. Burp brauzeridagi o'rnatilgan DOM Invader kengaytmasi og'ir ishning ko'p qismini bajaradi.
document.write sink script elementlari bilan ishlaydi, shuning uchun oddiy payload ishlatishingiz mumkin:
document.write('... <script>alert(document.domain)</script> ...');Ba'zan document.writega yozilgan kontent atrofdagi kontekstni o'z ichiga oladi (masalan select element ichida), buni hisobga olishingiz kerak.
innerHTML sink zamonaviy brauzerlarda script elementlarini qabul qilmaydi, shuning uchun img yoki iframe kabi muqobil elementlar va event handlerlar (onerror) kerak:
element.innerHTML='... <img src=1 onerror=alert(document.domain)> ...'jQuery'ning attr() funksiyasi DOM elementlari atributlarini o'zgartirishi mumkin. URL kabi manbadan olingan ma'lumot href atributiga uzatilsa, javascript: psevdo-protokoli bilan XSS mumkin:
?returnUrl=javascript:alert(document.domain)jQuery'ning $() selektori location.hash source bilan ishlatilganda klassik DOM XSS'ga sabab bo'lgan. Buni hashchange hodisasi orqali ekspluatatsiya qilish mumkin:
<iframe src="https://vulnerable-website.com#" onload="this.src+='<img src=1 onerror=alert(1)>'">Sayt HTML elementida ng-app atributini ishlatsa, AngularJS uni qayta ishlaydi va ikki jingalak qavs {{...}} ichidagi JavaScript'ni bajaradi — burchak qavslar yoki eventlarsiz.
Reflected DOM XSS'da server so'rovdan ma'lumotni qayta ishlab, uni javobga aks ettiradi; sahifadagi skript esa uni xavfsiz bo'lmagan tarzda sink'ga yozadi. Stored DOM XSS'da server ma'lumotni saqlab, keyingi javobga qo'shadi.