Skip to content

1. Prototype Pollution

Was ist Protoype Pollution

Ist eine JavaScript-Schwachstelle die es einem Angreifer ermöglicht Eigenschaften von einem globalen Objekt hinzufügen welche dann wiederum auch von Objekten geerbt werden. Meistens wird das mit anderen Schwachstellen verknüpft.

Was ist ein Objekt in Javascript

Eine Kollektion von Key:Value Paaren auch genannt "Properties"

const user = { 
    username: "wiener", 
    userId: 01234, 
    isAdmin: false 
}

Man kann auf die Paare entweder mit Punkt oder Klammer Notation aufrufen

user.username // "wiener"
user['userId'] // 01234

Was sind Prototypes in JS

  • Definition: Ein Prototype ist ein Objekt, von dem ein anderes Objekt erbt. Jede Instanz hat einen internen Verweis ([[Prototype]]) auf ihr Prototype-Objekt.

  • Kette (Prototype Chain): Wenn du obj.foo liest, sucht JS erst auf obj, dann auf dessen Prototype, dann weiter die Kette hoch - bis null. z. B.

    class User {
      greet() { return "Hi " + this.name; } // liegt auf User.prototype
    }
    const u = new User();
    u.name = "Nico";
    u.greet(); // "Hi Nico"
    

Prototype Chain

Alles in Javascript sind technisch gesehen Objekte die alle beliebig miteinader vererbt sind. Js-objects-visual.png

Zugriff auf Prototyp-Objekt mit __proto__

Man kann mit __proto__ von jedem Objekt auf seinen Prototyp zugreifen. - Die Eigenschaft fungiert als Setter als auch als Getter

username.__proto__
username[`__proto__`]

username.__proto__                        // String.prototype
username.__proto__.__proto__              // Object.prototype
username.__proto__.__proto__.__proto__    // null

Prototypen ändern

Obwohl es schlechte Praxis ist, ist es möglich in JS den Prototypen zu ändern. Dabei lassen sich sogar neue Methoden hinzufügen. z. B. Modernes JS bietet trim() für Strings, aber bevor es diese Methode gab, haben Entwickler teilweise ihre eigene gebaut und ergänzt - somit hatte jeder String ebenfalls Zugriff auf die Methode.

früher:

String.prototype.removeWhitespace = function(){
    // führende und nachfolgende Leerzeichen entfernen
}
let searchTerm = "  example ";
searchTerm.removeWhitespace();    // "example"

heute:

let searchTerm = "  example ";
searchTerm.trim();    // "example"