JavaServer Pages évalue l'unified expression language dans ${...}, en résolvant les noms face aux portées page, requête, session et application au travers du pageContext. L'expression est évaluée immédiatement au rendu de la page. L'injection apparaît lorsque des données de requête atterrissent dans une expression que le conteneur évalue ensuite : un paramètre renvoyé dans un contexte ${...}, une valeur passée à application.evaluate via l'ExpressionFactory JSP, ou un attribut de tag construit à partir d'une entrée utilisateur. Le conteneur exécute l'EL résultant avec les portées de la page à portée de main.
La surface atteignable correspond à la grammaire EL servlet. Les objets de portée implicites (param, header, sessionScope, requestScope, applicationScope, pageContext) exposent les attributs qu'une décision d'accès lit, et à partir d'EL 2.2 l'invocation de méthode atteint la réflexion et le runtime de l'hôte.
- Contournement d'autorisation : atteindre les maps de portée et le
pageContextpour lire et forcer les valeurs dont dépend un contrôle. - Exécution de code : utiliser l'invocation de méthode et la réflexion pour atteindre un moteur de script ou
ProcessBuilder.
Outils#
- Burp Suite : Repeater et Intruder pour injecter dans les expressions JSP ${...}.
- J2EEScan : extension Burp avec des contrôles d'injection Java EL.