more vulnerabilities
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 58 KiB |
BIN
Lab01/documentation/images/juice/juice-13.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
Lab01/documentation/images/juice/juice-14.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
Lab01/documentation/images/juice/juice-15.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
Lab01/documentation/images/juice/juice-16.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
Lab01/documentation/images/juice/juice-17.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
Lab01/documentation/images/juice/juice-18.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Lab01/documentation/images/juice/juice-19.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
Lab01/documentation/images/juice/juice-20.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Lab01/documentation/images/juice/juice-21.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
Lab01/documentation/images/juice/juice-22.png
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
Lab01/documentation/images/juice/juice-23.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
Lab01/documentation/images/juice/juice-24.png
Normal file
After Width: | Height: | Size: 200 KiB |
BIN
Lab01/documentation/images/juice/juice-25.png
Normal file
After Width: | Height: | Size: 99 KiB |
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
\subsection{Docker}
|
\subsection{Docker}
|
||||||
|
|
||||||
Um die Seite lokal im docker zu betreiben wurde folgende ``docker-compose.yml'' genutzt:
|
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}
|
\begin{lstlisting}
|
||||||
version: "3.9"
|
version: "3.9"
|
||||||
|
@ -16,9 +16,7 @@ services:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
Es muss nun lediglich ein ``docker-compose up'' ausgeführt werden.
|
\cite[vgl.][]{juice-shop}
|
||||||
|
|
||||||
\cite[vgl. dazu][]{juice-shop}
|
|
||||||
|
|
||||||
\subsection{Analyse}
|
\subsection{Analyse}
|
||||||
|
|
||||||
|
@ -30,7 +28,11 @@ Es muss nun lediglich ein ``docker-compose up'' ausgeführt werden.
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\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. Die Applikation wird von der Open Web Application Security Project Foundation\footnote{\href{https://owasp.org/}{https://owasp.org/}} bereitgestellt. Wenn man das Tutorial startet, wird durch verschiedene Tipps hingewiesen, wie die Sicherheitslücken gefunden werden können.
|
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}).
|
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}).
|
||||||
|
|
||||||
|
@ -47,35 +49,40 @@ So wird zum Beispiel erklärt, dass man mit F12 den Javascript-Code der Seite an
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
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:Server Absturz}).
|
\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{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-04}
|
\begin{subfigure}[b]{0.48\textwidth}
|
||||||
\caption{403 Administration}
|
\includegraphics[width=\textwidth]{juice/juice-04}
|
||||||
\label{fig:403 Administration}
|
\caption{403 Administration}
|
||||||
\end{center}
|
\label{fig:403 Administration}
|
||||||
\end{figure}
|
\end{subfigure}
|
||||||
\begin{figure}[H]
|
\begin{subfigure}[b]{0.48\textwidth}
|
||||||
\begin{center}
|
\includegraphics[width=\textwidth]{juice/juice-06}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-06}
|
\caption{SQLITE error}
|
||||||
\caption{SQLITE error}
|
\label{fig:SQLITE error}
|
||||||
\label{fig:SQLITE error}
|
\end{subfigure}
|
||||||
\end{center}
|
\begin{subfigure}[b]{0.7\textwidth}
|
||||||
\end{figure}
|
\includegraphics[width=\textwidth]{juice/juice-05}
|
||||||
\begin{figure}[H]
|
\caption{Server Absturz}
|
||||||
\begin{center}
|
\label{fig:Server Absturz}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-05}
|
\end{subfigure}
|
||||||
\caption{Server Absturz}
|
\caption{Unhandled Error}
|
||||||
\label{fig:Server Absturz}
|
\label{fig:Unhandled Error}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\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}).
|
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}
|
\begin{verbatim}
|
||||||
"SELECT * FROM Users WHERE email = ''' OR TRUE -- AND password =
|
SELECT * FROM Users WHERE email = ''' OR TRUE --
|
||||||
'202cb962ac59075b964b07152d234b70' AND deletedAt IS NULL"
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
|
@ -86,6 +93,8 @@ Man kann den SQL Befehl so anpassen, damit durch ``OR TRUE --'' immer true zurü
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\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}).
|
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{figure}[H]
|
||||||
|
@ -98,6 +107,8 @@ Nun können wir das Admin-Panel, welches vorher nicht für uns zur Verfügung st
|
||||||
|
|
||||||
\newpage
|
\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}):
|
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}
|
\begin{verbatim}
|
||||||
|
@ -114,27 +125,172 @@ Damit kann man in z.B. Postman ein Post Request unter einem anderen Namen mit de
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-09}
|
\begin{subfigure}[b]{0.48\textwidth}
|
||||||
\caption{Feedback Request}
|
\includegraphics[width=\textwidth]{juice/juice-09}
|
||||||
\label{fig:Feedback Request}
|
\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}
|
\end{center}
|
||||||
|
\caption{Anonymes Feedback erstellen}
|
||||||
|
\label{fig:Neues Feedback erstellen}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\subsubsection{XSS}
|
||||||
|
|
||||||
|
Da ich in meiner App Cross-Site-Scripting eingebaut hatte, wollte ich hier auch probieren, ob es geht. Im Score Board wird man darauf hingewiesen, dass man sich das Suchfeld anschauen sollte (Abbildung \ref{fig:XSS} / \ref{fig:XSS-Bonus}).
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-11}
|
\includegraphics[width=0.8\textwidth]{juice/juice-13}
|
||||||
\caption{Captcha Lösung}
|
\caption{XSS}
|
||||||
\label{fig:Captcha Lösung}
|
\label{fig:XSS}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
|
||||||
\begin{figure}[H]
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.7\textwidth]{juice/juice-10}
|
\includegraphics[width=0.8\textwidth]{juice/juice-14}
|
||||||
\caption{Neues Feedback mit falschem Namen}
|
\caption{XSS-Bonus}
|
||||||
\label{fig:Neues Feedback mit falschem Namen}
|
\label{fig:XSS-Bonus}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Damit haben wir insgesamt 6 Schwachstellen ausgenutzt (Abbildung \ref{fig:Score Board Ergebnis}).
|
\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-18}
|
||||||
|
\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{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
|
|
|
@ -20,5 +20,6 @@
|
||||||
\vfill
|
\vfill
|
||||||
\raggedright{}
|
\raggedright{}
|
||||||
\HRule{13pt}{1pt} \\
|
\HRule{13pt}{1pt} \\
|
||||||
\titleemph{Dozent:} Prof. Dr. rer. nat. Tobias Heer
|
\titleemph{Dozent:} Prof. Dr. rer. nat. Tobias Heer\\
|
||||||
|
\titleemph{Git:} \href{https://git.unjx.de/flo/SWB6-ITSec/src/branch/master/Lab01}{https://git.unjx.de/flo/SWB6-ITSec/src/branch/master/Lab01}
|
||||||
\end{titlepage}
|
\end{titlepage}
|
||||||
|
|