Die Datenbank wird in einem PostgreSQL Docker Container erstellt, der über `docker-compose` gestartet wird.
...
...
@@ -21,13 +21,39 @@ Im nächsten Schritt wird die Tabelle `users` angelegt und drei Benutzer hinzuge
```sql
CREATETABLEusers(
usernamevarchar(10),
adminboolean
is_adminboolean
);
INSERTINTOusers
(username,admin)
(username,is_admin)
VALUES
('alice',true),
('bob',false),
('mallory',false);
```
## Erklärung
Das Python Programm wird wie folgt aufgerufen: `python main.py "<username>"`
Mit der Übergabe eines Benutzernamens, wird überprüft, ob dieser ein Administrator ist. Aufgrund einer Schwachstelle in der `SELECT` Abfrage des Programm Codes, besteht nun aber die Möglichkeit Benutzern Administrator Rechte zu geben, ohne sich auf der Datenbank einzuloggen.
```
# Überprüfen ob der Benutzer 'mallory' ein Adminstrator ist
python main.py "mallory"
# Schwachstelle ausnutzen und 'mallory' Administrator Rechte geben
python main.py "'; update users set is_admin = 'true' where username = 'mallory'; select true; --"
```
Ruft man nun die Funktion wieder mit dem Benutzernamen auf `python main.py "mallory"` bekommt man statt `False` nun ein `True` zurückgegeben.
Die Schwachstelle in der Abfrage besteht darin, da keine Überprüfung erfolgt, welcher `string` in die Abfrage übergeben wird. Das Semikolon innerhalb der Abfrage spielt eine Entscheide Rolle, da es SQL Abfragen terminiert. Da keine weitere Überprüfung, des Inhalts erfolgt, den wir an die Funktion übergeben, können wir nun mithilde eines `UPDATE` Befehls Werte innerhalb der Tabelle anpassen.
Die Schwachstelle im Code (`SQL Abfrage`) kann wie folgt behoben werden:
```
"""SELECT is_admin FROM users WHERE username = %(username)s """, {'username': username}
```
Die Query wird nicht mehr mittels String Interpolation (`'%s' """ % username`) zusammengesetzt und an den Datenbankserver gesendet. Durch Abfrageparameter `%(username)s """, {'username': username}` wird nun sichergestellt, das der richtige Typ und Wert als `Parameter` an die Abfrage übergeben wird.