Ushbu bo'limda client-side prototype pollution zaifliklarini real hayotda qanday topishni o'rganamiz — buni ham qo'lda, ham DOM Invader yordamida avtomatlashtirilgan holda ko'rib chiqamiz. Client-side prototype pollution odatda DOM XSS'ga olib keladi.
Manbalarni qo'lda topish asosan sinov va xato jarayoni. Qisqasi, ishlaydigan manbani topmaguningizcha Object.prototype ga ixtiyoriy xususiyat qo'shishning turli usullarini sinab ko'rish kerak:
vulnerable-website.com/?__proto__[foo]=barObject.prototype.foo ni tekshiring — "bar" muvaffaqiyat, undefined esa muvaffaqiyatsizlikni bildiradi.vulnerable-website.com/?__proto__.foo=barManbalarni qo'lda topish zerikarli jarayon. Buning o'rniga Burp'ning o'rnatilgan brauzeri bilan keladigan DOM Invader'dan foydalanishni tavsiya qilamiz — u siz brauzer qilib yurganingizda prototype pollution manbalarini avtomatik sinaydi.
Manba topilgach, ekspluatatsiya uchun mos gadjet topish kerak. Buni qo'lda qilish uchun tekshirmoqchi bo'lgan xususiyatga getter o'rnatib, unga murojaat qilinganda stack trace chiqarasiz:
Object.defineProperty(Object.prototype, 'YOUR-PROPERTY', {
get() {
console.trace();
return 'polluted';
}
})Agar skript bajarilishida stack trace paydo bo'lsa, bu xususiyat ilovada biror joyda o'qilganini tasdiqlaydi. So'ng debugger orqali bosqichma-bosqich yurib, u innerHTML yoki eval() kabi sink'ga uzatilishini tekshiring.
Hozircha faqat __proto__ aksessori orqali prototipga havola oldik. Keng tarqalgan himoya — merge'dan oldin __proto__ kalitlarini olib tashlash. Lekin bu nuqsonli, chunki prototipga __proto__ satrisiz ham murojaat qilish mumkin. Har bir obyekt constructor xususiyatiga ega, u orqali prototipga yetish mumkin:
myObject.constructor.prototype // Object.prototype ga teng (== myObject.__proto__)Saytlar ko'pincha kalitlarni merge'dan oldin tozalaydi, lekin keng tarqalgan xato — kirishni rekursiv tozalamaslik. Masalan, sanitizatsiya __proto__ satrini faqat bir marta olib tashlasa:
vulnerable-website.com/?__pro__proto__to__.gadget=payloadbir marta tozalashdan keyin quyidagi yaroqli manbaga aylanadi:
vulnerable-website.com/?__proto__.gadget=payloadGadjetlar ko'pincha ilova import qiladigan uchinchi tomon kutubxonalarida uchraydi. Bu holatda DOM Invader'ning prototype pollution imkoniyatlaridan foydalanish ancha tezroq va ishonchliroq.
PortSwigger Research brauzerlarda beriladigan JavaScript API'larida bir qancha keng tarqalgan prototype pollution gadjetlarini aniqladi. Ular zaif prototype pollution himoyalarini chetlab o'tib DOM XSS'ga olib kelishi mumkin.