diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..25420fe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "Säuberungsfunktion" + ] +} \ No newline at end of file diff --git a/Lab01/documentation/app/app.tex b/Lab01/documentation/app/app.tex index 143e634..13c7760 100644 --- a/Lab01/documentation/app/app.tex +++ b/Lab01/documentation/app/app.tex @@ -1,2 +1,147 @@ -\section{Eigene App} +\section{App} +\subsection{Beschreibung der App} + +Die App soll eine einfache Erstellung von Aufgaben anbieten. Der Task soll erstellt, erledigt und gelöscht werden können. Jeder Benutzer sieht nur seine Tasks und kann auch nur seine eigenen Tasks bearbeiten. Als Frontend wird HTML\footnote{\href{https://developer.mozilla.org/en-US/docs/Web/HTML}{HTML}}, CSS\footnote{\href{https://developer.mozilla.org/en-US/docs/Learn/CSS/First_steps/What_is_CSS}{CSS}} und JavaScript\footnote{\href{https://www.javascript.com/}{JavaScript}} verwendet. Im Backend kommt eine SQLite\footnote{\href{https://sqlite.org/index.html}{SQLite}} und Go\footnote{\href{https://go.dev/}{Go}} zum Einsatz. + +\subsection{A01:2021 - Broken Access Control} + +\subsubsection{Beschreibung der Schwachstelle} + +Der Benutzer muss sich zuerst Registrieren (Abbildung \ref{fig:Registrieren}). Es wird im Frontend keine Validierung, außer auf Leerzeichen, durchgeführt. + +\begin{figure}[H] + \begin{center} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{app/app-01} + \caption{Registrieren} + \label{fig:Registrieren} + \end{subfigure} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{app/app-02} + \caption{Login} + \label{fig:Login} + \end{subfigure} + \end{center} + \caption{Authentifizierung} + \label{fig:Authentifizierung} +\end{figure} + +Wenn ein Nutzer schon existiert wird lediglich die Fehlermeldung der Datenbank zurückgegeben und angezeigt. Dadurch kann man schon registrierte Benutzernamen leicht erkennen. + +\begin{figure}[H] + \begin{center} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{app/app-04} + \caption{Benutzername existiert} + \label{fig:Benutzername existiert} + \end{subfigure} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{app/app-03} + \caption{Leerzeichen} + \label{fig:Leerzeichen} + \end{subfigure} + \end{center} + \caption{Fehler bei der Authentifizierung} + \label{fig:Fehler bei der Authentifizierung} +\end{figure} + +Wenn der Benutzer sich anmeldet wir ein Cookie mit dem Nutzernamen im Frontend gespeichert (Abbildung \ref{fig:Gespeichertes Cookie}). Zusätzlich wird im Backend vermerkt, dass der Nutzer angemeldet ist. Somit reicht es im Frontend aus, nur den Benutzernamen als Authentifizierung im Header mitzuschicken. Damit kann durch z.B. das Raten von Nutzernamen mit den Registrierung-Fehlermeldungen, unbefugter Zugriff auf die App erfolgen. CORS im Backend wurde ausgeschaltet um das Entwickeln einfacher zu machen. + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.8\textwidth]{app/app-05} + \caption{Gespeichertes Cookie} + \label{fig:Gespeichertes Cookie} + \end{center} +\end{figure} + +\subsubsection{Schwachstelle ausbessern} + +Bei der Registrierung und dem Anmelden sollte sowohl im Frontend als auch im Backend auf Fehler validiert werden. In Frameworks wie Vue, React oder Angular kann dies einfach gemacht werden. Zusätzlich bieten Backends eine Säuberungsfunktion für Form-Daten an, die unerlaubte Zeichen verhindern. + +Fehlermeldungen sollten nur das nötigste dem Benutzer verraten. Wenn die Fehlermeldung der Datenbank ans Frontend gesendet wird kann das zu erheblichen Sicherheitslücken führen. Die gezeigte Fehlermeldung ``UNIQUE constraint failed: users.username'' gibt preis, dass der Benutzer schon existiert und kann dadurch zum Anmelden missbraucht werden. + +Ein Login mit JWT Token\footnote{\href{https://jwt.io/}{JWT}} erscheint hier sinnvoller, da dies verschiedene Vorteile hat: +\begin{list}{-}{} + \item Ablaufdatum -> Kann nur für eine bestimmte Zeit ausgenutzt werden + \item Zufällig -> Kann nicht erraten werden, wie z.B. der Benutzername + \item Verifizierung möglich +\end{list} + +Die Abspeicherung des Login-Status im Backend ist eine große Sicherheitslücke. Damit kann der Angreifer mit einer List von Benutzernamen so lange probieren, bis er sich, als einer der Nutzer der eingeloggt ist, anmelden kann. Durch den JWT Token würde eine der Login-Prozess ohne die Abspeicherung des aktuellen Status des Nutzers ablaufen. + +Cors sollte eingeschaltet und konfiguriert werden, damit Anfragen auch nur von dem als sicher geltenden Frontend verschickt werden. + +\subsection{A03:2021 - Injection} + +\subsubsection{Beschreibung der Schwachstelle} + +Es kann in der App nach Aufgaben gesucht werden (Abbildung \ref{fig:Suchen im Frontend}). Der eingegebene Filter wird dazu an das Backend geschickt und als Antwort kommt eine liste an Aufgaben zurück (Abbildung \ref{fig:Suchen im Backend}). Die eigentliche Suchfunktion wird hierbei von Backend übernommen. + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.6\textwidth]{app/app-07} + \caption{Suchen im Frontend} + \label{fig:Suchen im Frontend} + \end{center} +\end{figure} +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.7\textwidth]{app/app-08} + \caption{Suchen im Backend} + \label{fig:Suchen im Backend} + \end{center} +\end{figure} + +\newpage + +Nun kann allerdings durch eine Injection das Anzeigen aller Aufgaben erzwungen werden (Abbildung \ref{fig:SQL Injection}). + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.9\textwidth]{app/app-09} + \caption{SQL Injection} + \label{fig:SQL Injection} + \end{center} +\end{figure} + +\newpage + +\subsubsection{Schwachstelle ausbessern} + +Der Code im Backend ist fehlerhaft. Anstatt die von Go zur Verfügung gestellte ``Sprintf'' Funktion zu nutzen (Abbildung \ref{fig:Fehlerhafter Code}), sollte die von GORM\footnote{\href{https://gorm.io/}{GORM ORM Library}} abgesicherte Art der SQL Query verwendet werden (Abbildung \ref{fig:Korrekter Code}). Damit können Injections verhindert werden (Abbildung \ref{fig:SQL Injection verhindert}). + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.9\textwidth]{app/app-06} + \caption{Fehlerhafter Code} + \label{fig:Fehlerhafter Code} + \end{center} +\end{figure} +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.9\textwidth]{app/app-10} + \caption{Korrekter Code} + \label{fig:Korrekter Code} + \end{center} +\end{figure} +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.8\textwidth]{app/app-11} + \caption{SQL Injection verhindert} + \label{fig:SQL Injection verhindert} + \end{center} +\end{figure} + +\subsection{A03:2021 - Injection} + +\subsubsection{Beschreibung der Schwachstelle} + +\subsubsection{Schwachstelle ausbessern} + +\subsection{A03:2021 - Injection} + +\subsubsection{Beschreibung der Schwachstelle} + +\subsubsection{Schwachstelle ausbessern} \ No newline at end of file diff --git a/Lab01/documentation/images/app/app-01.png b/Lab01/documentation/images/app/app-01.png new file mode 100644 index 0000000..b8f7b01 Binary files /dev/null and b/Lab01/documentation/images/app/app-01.png differ diff --git a/Lab01/documentation/images/app/app-02.png b/Lab01/documentation/images/app/app-02.png new file mode 100644 index 0000000..69eb285 Binary files /dev/null and b/Lab01/documentation/images/app/app-02.png differ diff --git a/Lab01/documentation/images/app/app-03.png b/Lab01/documentation/images/app/app-03.png new file mode 100644 index 0000000..fb5606b Binary files /dev/null and b/Lab01/documentation/images/app/app-03.png differ diff --git a/Lab01/documentation/images/app/app-04.png b/Lab01/documentation/images/app/app-04.png new file mode 100644 index 0000000..af799d0 Binary files /dev/null and b/Lab01/documentation/images/app/app-04.png differ diff --git a/Lab01/documentation/images/app/app-05.png b/Lab01/documentation/images/app/app-05.png new file mode 100644 index 0000000..c316322 Binary files /dev/null and b/Lab01/documentation/images/app/app-05.png differ diff --git a/Lab01/documentation/images/app/app-06.png b/Lab01/documentation/images/app/app-06.png new file mode 100644 index 0000000..409f43a Binary files /dev/null and b/Lab01/documentation/images/app/app-06.png differ diff --git a/Lab01/documentation/images/app/app-07.png b/Lab01/documentation/images/app/app-07.png new file mode 100644 index 0000000..0b5dd1f Binary files /dev/null and b/Lab01/documentation/images/app/app-07.png differ diff --git a/Lab01/documentation/images/app/app-08.png b/Lab01/documentation/images/app/app-08.png new file mode 100644 index 0000000..717b82f Binary files /dev/null and b/Lab01/documentation/images/app/app-08.png differ diff --git a/Lab01/documentation/images/app/app-09.png b/Lab01/documentation/images/app/app-09.png new file mode 100644 index 0000000..0f1890d Binary files /dev/null and b/Lab01/documentation/images/app/app-09.png differ diff --git a/Lab01/documentation/images/app/app-10.png b/Lab01/documentation/images/app/app-10.png new file mode 100644 index 0000000..c2e7dde Binary files /dev/null and b/Lab01/documentation/images/app/app-10.png differ diff --git a/Lab01/documentation/images/app/app-11.png b/Lab01/documentation/images/app/app-11.png new file mode 100644 index 0000000..4961b87 Binary files /dev/null and b/Lab01/documentation/images/app/app-11.png differ