OGNL

Apache Struts2 évalue l'OGNL issu des données de requête via %{...} et ${...}, et une fois le sandbox d'accès aux membres nettoyé, l'expression atteint Runtime et ProcessBuilder pour l'exécution de code.

2 min de lecturemis à jour le 13 oct. 2026florianamette1 contributeur
Demander à votre assistant (MCP)Modifier sur GitHub

OGNL (Object-Graph Navigation Language) est le langage d'expression que Struts2 utilise pour déplacer des valeurs entre la requête, la value stack et la vue. Les attributs de tag, la conversion de type et les noms de paramètres sont tous évalués comme de l'OGNL, écrits %{...} dans les tags et atteignables sous ${...} dans certains contextes. Lorsque des données de requête transitent vers une chaîne que Struts évalue ensuite, via une double évaluation forcée, un nom de paramètre conçu à dessein ou un attribut de tag construit à partir d'une entrée, la grammaire OGNL s'exécute face à la value stack.

OGNL est un langage objet complet : il nomme des classes, construit des objets et appelle des méthodes. Struts2 moderne enveloppe l'évaluation dans un sandbox, un SecurityMemberAccess avec des classes et des noms de package exclus appliqués au travers du contexte OGNL, donc un appel nu à java.lang.Runtime est bloqué. Les pages d'exploitation ci-dessous couvrent à la fois la preuve de l'évaluation sans toucher au sandbox et le nettoyage de la restriction d'accès aux membres pour atteindre le runtime.

Outils#

  • Burp Suite : Repeater et Intruder pour l'injection OGNL dans les puits Struts2.
  • J2EEScan : extension Burp qui détecte l'injection d'expression OGNL et Struts.
  • struts-pwn : outil de PoC pour les vecteurs OGNL de Struts2.

Références#