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.

Source

blog.ikaes.de — Lire l'original →