\section{Juice Shop} \subsection{Docker} Um die Seite lokal als Docker\footnote{\href{https://www.docker.com/}{https://www.docker.com/}} Container zu betreiben wurde folgende ``docker-compose.yml'' genutzt. Zum Starten muss nun lediglich ein ``docker-compose up'' ausgeführt werden. \begin{lstlisting} version: "3.9" services: juice-shop: image: bkimminich/juice-shop:latest container_name: juice-shop restart: unless-stopped ports: - 3000:3000 \end{lstlisting} \cite[vgl.][]{juice-shop} \subsection{Analyse} \begin{figure}[H] \begin{center} \includegraphics[width=0.7\textwidth]{juice/juice-01} \caption{Startseite Juice Shop} \label{fig:Startseite Juice Shop} \end{center} \end{figure} Auf der Startseite (Abbildung \ref{fig:Startseite Juice Shop}) wird man mit verschiedenen Pop-Ups begrüßt. Es beschreibt, dass die Seite nicht sicher sei und die Applikation von der Open Web Application Security Project Foundation\footnote{\href{https://owasp.org/}{https://owasp.org/}} bereitgestellt wird. Wenn man das Tutorial startet, wird durch verschiedene Tipps hingewiesen, wie die Sicherheitslücken gefunden werden können. \newpage \subsubsection{Score-Board} So wird zum Beispiel erklärt, dass man mit F12 den Javascript-Code der Seite analysieren könnte (Abbildung \ref{fig:Javascript in den Entwicklertools von Firefox}). Der Vorschlag ist gut, da mit einer Suche der Pfad des Score-Boards entdeckt werden kann (Abbildung \ref{fig:Pfad des Score-Boards}). \begin{figure}[H] \begin{center} \includegraphics[width=0.7\textwidth]{juice/juice-02} \caption{Javascript in den Entwicklertools von Firefox} \label{fig:Javascript in den Entwicklertools von Firefox} \end{center} \begin{center} \includegraphics[width=0.7\textwidth]{juice/juice-03} \caption{Pfad des Score-Boards} \label{fig:Pfad des Score-Boards} \end{center} \end{figure} \newpage \subsubsection{Server Absturz} Wenn man nun noch nach Admin sucht, kann man eine Route in das Administrations-Panel finden. Leider sind wir aber nicht Berechtigt die Seite zu sehen (Abbildung \ref{fig:403 Administration}). Beim Ausprobieren wie man die Daten des Admins bekommen kann, hat ein Fehler den Server zum Absturz gebracht (Abbildung \ref{fig:Server Absturz}). Mit einer SQL Injection (Eingabe des Zeichen ') über den Login kann ein SQLITE Error hervorgerufen werden (Abbildung \ref{fig:SQLITE error}). \begin{figure}[H] \begin{center} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-04} \caption{403 Administration} \label{fig:403 Administration} \end{subfigure} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-06} \caption{SQLITE error} \label{fig:SQLITE error} \end{subfigure} \begin{subfigure}[b]{0.7\textwidth} \includegraphics[width=\textwidth]{juice/juice-05} \caption{Server Absturz} \label{fig:Server Absturz} \end{subfigure} \caption{Unhandled Error} \label{fig:Unhandled Error} \end{center} \end{figure} \subsubsection{Admin Anmeldung} Man kann den SQL Befehl so anpassen, damit durch ``OR TRUE --'' immer true zurück kommt und eine Authentifizierung mit dem ersten Nutzer in der Datenbank möglich ist. Glücklicherweise ist das der admin (Abbildung \ref{fig:Login Admin}). \begin{verbatim} SELECT * FROM Users WHERE email = ''' OR TRUE -- \end{verbatim} \begin{figure}[H] \begin{center} \includegraphics[width=0.7\textwidth]{juice/juice-07} \caption{Login Admin} \label{fig:Login Admin} \end{center} \end{figure} \subsubsection{Admin-Panel} Nun können wir das Admin-Panel, welches vorher nicht für uns zur Verfügung stand, nutzen. Unter ``http:\//\//localhost:3000\//\#\//administration'' sehen wir nun das Feedback der Nutzer (Abbildung \ref{fig:Admin-Panel}). \begin{figure}[H] \begin{center} \includegraphics[width=0.7\textwidth]{juice/juice-08} \caption{Admin-Panel} \label{fig:Admin-Panel} \end{center} \end{figure} \newpage \subsubsection{Anonymes Feedback erstellen} Im Score-Board gibt es ein Tutorial zum Erstellen von Feedbacks unter einem anderen Account. Dazu gibt man zuerst ein normales Feedback ab. der Request sieht wie folgt aus (Abbildung \ref{fig:Feedback Request}): \begin{verbatim} { "UserId": 1, "captchaId": 2, "captcha": "78", "comment": "test (***in@juice-sh.op)", "rating": 2 } \end{verbatim} Damit kann man in z.B. Postman ein Post Request unter einem anderen Namen mit dem neu vorgeschlagenen Captcha (Abbildung \ref{fig:Captcha Lösung}) abschicken (Abbildung \ref{fig:Neues Feedback mit falschem Namen}). \begin{figure}[H] \begin{center} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-09} \caption{Feedback Request} \label{fig:Feedback Request} \end{subfigure} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-10} \caption{Neues Feedback mit falschem Namen} \label{fig:Neues Feedback mit falschem Namen} \end{subfigure} \begin{subfigure}[b]{0.7\textwidth} \includegraphics[width=\textwidth]{juice/juice-11} \caption{Captcha Lösung} \label{fig:Captcha Lösung} \end{subfigure} \end{center} \caption{Anonymes Feedback erstellen} \label{fig:Neues Feedback erstellen} \end{figure} \newpage \subsubsection{Cross-Site-Scripting} Da in der App auch Cross-Site-Scripting eingebaut ist, dürfte es im Juice Shop dafür auch eine Möglichkeit geben. Im Score Board wird man darauf hingewiesen, dass man sich das Suchfeld anschauen sollte (Abbildung \ref{fig:Cross-Site-Scripting} / \ref{fig:Cross-Site-Scripting Bonus}). Die vorgefertigten iFrames wurden vom Score-Board kopiert. \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-13} \caption{Cross-Site-Scripting} \label{fig:Cross-Site-Scripting} \end{center} \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-14} \caption{Cross-Site-Scripting Bonus} \label{fig:Cross-Site-Scripting Bonus} \end{center} \end{figure} \subsubsection{Privacy-Policy} Login als ein Benutzer gibt außerdem die Privacy-Policy im Menü frei. \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-15} \caption{Privacy Policy} \label{fig:Privacy Policy} \end{center} \end{figure} \subsubsection{Admin Passwort raten} Man kann außerdem das Password des Admins raten. \begin{verbatim} E-Mail: admin@juice-sh.op Passwort: admin123 \end{verbatim} \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-16} \caption{Schlechtes Passwort} \label{fig:Schlechtes Passwort} \end{center} \end{figure} \subsubsection{Warenkorb} Wenn man einen anderen Warenkorb sehen möchte kann man im Session Cookie die id auf einen anderen Nutzer setzen. \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-17} \caption{Warenkorb} \label{fig:Warenkorb} \end{center} \end{figure} \newpage \subsubsection{Jims und Benders Account} Um sich mit Jims oder Benders Account anzumelden muss lediglich eine SQL Injection beim Login durchgeführt werden. Sowohl Jims als auch Benders E-Mail können in den Kommentaren zu Produkten gefunden werden. \begin{verbatim} E-Mail: jim@juice-sh.op'-- Password: irgendwas... E-Mail: bender@juice-sh.op'-- Password: irgendwas... \end{verbatim} \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-18} \caption{Jims Account} \label{fig:Jims Account} \end{center} \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-19} \caption{Benders Account} \label{fig:Benders Account} \end{center} \end{figure} \subsubsection{FTP Server} Der FTP Server ist ohne Authentifizierung unter ``http://localhost:3000/ftp'' zu erreichen. Darunter findet man auch ein Confidential Document. \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-20} \caption{Confidential Document} \label{fig:Confidential Document} \end{center} \end{figure} \newpage \subsubsection{5-Start Feedback löschen} Um 5-Star Feedback zu löschen kann man einfach auf der Administration Seite, die wir vorher gefunden hatten die Kommentare löschen. \begin{figure}[H] \begin{center} \includegraphics[width=0.8\textwidth]{juice/juice-21} \caption{5-Star Feedback} \label{fig:5-Star Feedback} \end{center} \end{figure} \subsubsection{Jeglichen Kommentare ändern} Um ein Kommentar für ein Produkt zu ändern, schicken wir zuerst ein Kommentar ab und ändern ihn, um die API herauszufinden (Abbildung \ref{fig:Kommentar Änderung Request}). Danach schauen wir mit einem GET Request welche ID wir ändern möchten (Abbildung \ref{fig:Postman Kommentar IDs}) und schicken einen PATCH Request (Abbildung \ref{fig:Postman Kommentar Änderung}) mit einem Bearer Token des Admins als Authentifizierung (Abbildung \ref{fig:Bearer Token von Admin}). \begin{figure}[H] \begin{center} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-22} \caption{Kommentar Änderung Request} \label{fig:Kommentar Änderung Request} \end{subfigure} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-24} \caption{Bearer Token von Admin} \label{fig:Bearer Token von Admin} \end{subfigure} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-23} \caption{Postman Kommentar IDs} \label{fig:Postman Kommentar IDs} \end{subfigure} \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width=\textwidth]{juice/juice-25} \caption{Postman Kommentar Änderung} \label{fig:Postman Kommentar Änderung} \end{subfigure} \end{center} \end{figure} \newpage \subsection{Ergebnis} Damit haben wir insgesamt 15 Schwachstellen ausgenutzt (Abbildung \ref{fig:Score Board Ergebnis}). \begin{figure}[H] \begin{center} \includegraphics[width=\textwidth]{juice/juice-12} \caption{Score Board Ergebnis} \label{fig:Score Board Ergebnis} \end{center} \end{figure}