JS : appeler des fonctions sans parenthèses
Original : Yet another way to invoke functions without parentheses
Pourquoi c'est important
Cette technique élargit les vecteurs XSS dans les environnements CSP restrictifs.
Un chercheur a découvert une nouvelle technique JavaScript permettant d'invoquer des fonctions arbitraires sans parenthèses, en détournant Error.prepareStackTrace et prototype pollution.
Bartosz publie sur son blog une technique d'injection JavaScript originale : appeler n'importe quelle fonction sans utiliser de parenthèses, une contrainte courante dans les contextes de contournement de CSP ou de XSS filtré.
Le mécanisme repose sur `Error.prepareStackTrace`, une fonction normalement chargée de formater les stack traces. Elle accepte deux paramètres — l'erreur et un tableau de positions dans le code — ce qui correspond exactement à la signature du constructeur `Function`. En assignant `Function` à `Error.prepareStackTrace`, on peut donc générer dynamiquement du code JavaScript.
Problème : l'Array de positions renvoyé n'est pas du JS valide. La solution passe par la pollution de prototype. En écrasant `Array.prototype.toString` avec `Error.prototype.toString`, puis en injectant le payload via `Object.prototype.message`, on contrôle la chaîne retournée par l'Array — et donc le code généré.
Pour l'invocation finale, Bartosz utilise l'astuce `valueOf` : en assignant la stack à `valueOf` de l'objet, un simple opérateur unaire `+x` déclenche l'exécution. Le payload complet tient en cinq lignes et se teste directement dans la console du navigateur.