बिना parentheses के JS function call

मूल शीर्षक: Yet another way to invoke functions without parentheses

यह क्यों महत्वपूर्ण है

यह तकनीक CSP bypass और XSS payloads में नई संभावनाएँ खोलती है, जहाँ parentheses blocked हों।

Security researcher Bartosz ने JavaScript में बिना parentheses के arbitrary functions invoke करने का एक नया तरीका खोजा है, जो Error object के prepareStackTrace को overwrite करके काम करता है।

Bartosz ने अपने blog पर एक JavaScript payload साझा किया है जो बिना parentheses के functions invoke करता है। यह तकनीक Error object की prepareStackTrace function को target करती है — यह function normally stack traces को format करने के लिए इस्तेमाल होता है और जब किसी error का stack attribute access किया जाता है, तब यह automatically invoke होता है।

इस payload की खासियत यह है कि prepareStackTrace का function signature Function constructor जैसा ही है, इसलिए इसे सीधे function generation के लिए उपयोग किया जा सकता है। लेकिन stack trace valid JavaScript नहीं होता, इसलिए generated function को invoke करने पर syntax error आता है।

इस समस्या को हल करने के लिए Bartosz ने Array.prototype.toString() को overwrite किया, ताकि वह मनचाहा JavaScript payload return करे। इसके दो तरीके हैं: पहला, toString को एक constant function से replace करना; दूसरा, prototype pollution के जरिए Object.prototype.message को pollute करके Error.prototype.toString का उपयोग करना।

अंत में function को invoke करने के लिए valueOf trick का इस्तेमाल किया गया — object के default valueOf को overwrite करके उसे primitive के रूप में call किया जाता है। Final payload महज पाँच lines का है:

Object.prototype.message='alert\x281337\x29'; Array.prototype.toString=Error.prototype.toString; Error.prepareStackTrace=Function; const x=new Error; x.valueOf=x.stack; +x;

स्रोत

blog.ikaes.de — मूल लेख पढ़ें →