El hallazgo
Dos parámetros de URL de la consola de administración de GlassFish,
alertSummary y alertDetail, llegan al motor jsftemplating sin
tratarse como datos. Como ese motor parsea el árbol de componentes entero en vez de
sustituir cadenas, una expresión ahí se evalúa.
Por qué el escapado no servía
Había un htmlEscape() aplicado al valor. Protege contra inyección de HTML, que
era la amenaza que alguien tenía en mente, pero el expression language se evalúa antes de
que la salida llegue a renderizarse como HTML: el escapado llega tarde.
Confirmarlo
Antes de pensar en ejecutar comandos, un payload mínimo resuelve si la expresión se evalúa siquiera:
alertSummary=%23%7B7*7%7D
→ el banner muestra "49" en vez de "7*7"
De ahí, la ejecución se confirmó primero fuera de banda con un ping ICMP a un host mío: la salida no se devuelve, así que un canal out-of-band es la única forma de ver algo.
Impacto
Con acceso autenticado a la consola esto es compromiso total del servidor: los comandos se ejecutan con los privilegios del servidor de aplicaciones. Puntuada CVSS 9.1, corregida en GlassFish 8.0.2, 7.1.1 y 7.0.26.