Juice Shop: Software hacken zum Spaß

In diesem Monat haben wir als Park’ler die Chance, an einer besonderen Fortbildung teilzunehmen: Einem internen Capture The Flag (CTF) Event basierend auf dem Juice Shop. Bei diesem Event geht es darum ein System zu hacken, das absichtlich viele verschiedene Sicherheitslücken enthält . In einem CTF bekommen die Teilnehmerinnen und Teilnehmer, die sich selbst in Teams organisieren, Punkte für das Ausnutzen von Sicherheitslücken. Dies motiviert die Teams so viele Lücken wie möglich zu finden und teilweiße die zu Grunde liegenden Probleme in Coding Challenges zu beheben.

Das Ziel der Attacken ist unsere Method Park eigene Instanz des OWASP Juice Shop, genannt Saftladen. Der OWASP Juice Shop beschreibt sich selbst als „die wahrscheinlich modernste und raffinierteste unsichere Webapplikation“. Sie kann von jedem frei genutzt werden, um sich im Bereich Web Security fortzubilden. Der Juice Shop bietet dabei jede Funktionalität, die man von einem modernen Webshop erwartet. Er bietet eine Vielzahl von großartigen Produkten (unter anderem eine große Auswahl verschiedener Säfte 😊), einen Warenkorb und die Möglichkeit sich einen Account zu erstellen. Dort kann man Zahlungsweisen und Lieferadressen hinterlegen. Sogar eine optionale Premium Mitgliedschaft kann erworben werden!

Übersicht über den Juice Shop

Capture The Flag Events machen einerseits Spaß, andererseits kann man als Teilnehmerin/Teilnehmer auch viel aus verschiedenen Bereichen der Cybersecurity lernen. Beispielsweise sicheres Programmieren, Softwaredesign oder Angriffsarten. Dafür tauschen unsere Kolleginnen und Kollegen für vier Wochen die Rolle der Engineers mit der der „bösen“ Hackerinnen und Hacker und wenden verschiedene Arten von Angriffen auf die Sicherheitslücken an. Aus allen Kategorien der OWASP Top 10 finden sich Sicherheitslücken im Juice Shop. Zum Beispiel: Broken Access Control, Improper Input Validation und Unvalidated Redirects. Einige Angriffe auf den Juice Shop beschreibe ich dir in dieser Artikelreihe näher.

 

ACHTUNG SPOILER!!!


Juice Shop Herausforderung: Client-side XSS Protection

Bei einer Cross Site Scripting (XSS) Attacke versucht die Angreiferin/der Angreifer eigenen JavaScript Code in fremde Webseiten einzubinden. Grundsätzlich existieren verschiedene Arten von XSS, beispielsweise reflektiertes und persistentes XSS. Auch der Juice Shop enthält Schwachstellen, die persistente XSS Attacken erlauben. Eine dieser Schwachstellen resultiert daraus, dass der Server Code die Nutzereingaben bei der Registrierung eines Accounts nicht überprüft. Stattdessen übernimmt der Webbrowser die Verifikation per JavaScript (sogenannte clientseitige Verifikation). Dies kann eine Angreiferin/ein Angreifer aber leicht umgehen, indem sie/er direkt mit der Server-API spricht.

In dieser Herausforderung versuche ich mich mit einer E-Mail-Adresse zu registrieren, die ein Stück JavaScript Code enthält. Die Idee dahinter ist, dass registrierte Nutzerinnen und Nutzer typischerweise in einer Datenbank gespeichert werden. Diese Nutzerdaten werden an unterschiedlichen Stellen der Webapplikation ausgegeben, beispielsweise in der Nutzerverwaltung. Der erste Versuch wird leider von der clientseitigen Verifikation verhindert, die erkennt, dass es sich nicht um eine E-Mail-Adresse handelt (siehe Bild).

Unerlaubte Eingabe in der Nutzerregistrierungsmaske (falsch formatierte Email).

Ich registriere mich also mit einer validen E-Mail und schaue mir den erzeugten Netzwerkverkehr mit den Entwicklertools des Browsers an. Das Formular schickt einen HTTP POST Request an folgenden Endpunkt: https://juice.internal/api/Users/ Im Body der Anfrage sind alle Informationen des Formulars enthalten:


{email: "joh@john", password: "testtest", passwordRepeat: "testtest",…}

Mithilfe der Entwicklertools kann ich die Anfrage als JavaScript „fetch“ Aufruf kopieren, anschließend modifizieren und erneut mit der JavaScript Konsole verschicken. In diesem Request tausche ich die E-Mail durch den JavaScript Code:


fetch("https://juice.internal/api/Users/", {
  "headers": {
    …
  },
  "referrer": "https://juice.internal/",
  "referrerPolicy": "strict-origin-when-cross-origin",
  "body": "{\"email\":\"<iframe src=\\\"javascript:alert(`xss`)\\\">\",\",\"password\":\"testtest\",\"passwordRepeat\":\"testtest\",\"securityQuestion\":{\"id\":1,\"question\":\"Your eldest siblings middle name?\",\"createdAt\":\"2022-05-11T06:14:51.966Z\",\"updatedAt\":\"2022-05-11T06:14:51.966Z\"},\"securityAnswer\":\"John\"}",
  "method": "POST",
  "mode": "cors",
  "credentials": "include"
});

Das ist die richtige Lösung! Der Juice Shop belohnt mich mit einer Erfolgsmeldung und ich kann mich zufrieden der nächsten Schwachstelle widmen. Die Lektion aus dieser Aufgabe: Ich sollte mich bei Nutzerinput nicht auf die clientseitige Validierung verlassen!

Weiter geht es im nächsten Teil der Artikelreihe, in dem ich die Herangehensweise an weitere Aufgaben zeigen werde.

Mehr Informationen zu den Themen Safety und Security kannst du hier in unserem Kompetenzfeld oder bei unserem ParkCheck für Cybersecurity finden.