\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}
