1. SQL Injection
Was ist SQL Injection¶
Es ist eine Schwachstelle in der, der Angreifer Anfragen die aus der App zur Datenbank gesendet werden abgreift und manipuliert um ggf. Daten von anderen Usern abzufragen bzw. generell Daten auf die man eigentlich keinen Zugriff hat. Bei manch gravierenden Schwachstellen lÀsst sich ggf. auch der Backend-Server manipulieren.
Wie erkennt man SQL Schwachstellen¶
Durch eine systematische Reihe von Test an jedem Eingabepunkt der Anwendung - z. B. beim Login die Username Password Felder.
- Eingabe von ' und beobachte Fehlermeldung
- SQL-spezifischer Syntax die den ursprĂŒnglichen Wert verĂ€nden
- Gib etwas ein das das Ergebnis nicht Àndern sollte vs Gib etwas ein, das das Ergebnis verÀndert sollte
- Boolean-Checks(Immer Wahr, Immer Falsch)
- Zeitverzögerung(time-based tests)
- Man proviert eine Abfrage die lĂ€nger braucht als normal und misst die Antwortzeit - Wenn die Antwortzeit deutlich lĂ€nger dauert kann man davon ausgehen, dass ein Befehl in der Datenbank ausgefĂŒhrt wird.
- OAST / Out of band (Netzwerk Check)
- Man lĂ€sst die App etwas ausfĂŒhren, sodass die DB versucht nach auĂen auf z. B. einen exploit-server zu connecten
Die meisten SQL-Injection-Schwachstellen treten in der WHERE-Klausel einer SELECT-Abfrage auf. Mit diesem Typ sind die meisten erfahrenen Tester vertraut.
SQL-Injection kann jedoch an jeder Stelle innerhalb einer Abfrage und in verschiedenen Abfragetypen auftreten. Weitere hÀufige Stellen, an denen SQL-Injection vorkommt, sind:
- In
UPDATE-Anweisungen, innerhalb der zu aktualisierenden Werte oder in derWHERE-Klausel. - In
INSERT-Anweisungen, innerhalb der eingefĂŒgten Werte. - In
SELECT-Anweisungen, innerhalb des Tabellen- oder Spaltennamens. - In
SELECT-Anweisungen, innerhalb derORDER BY-Klause
Versteckte Daten anzeigen lassen¶
z. B. Ein Shop zeigt die Produkte in unterschiedlichen Kategorien an. Wenn User auf "Gifts" Kategorie klickt, ruft der Browser folgendes auf:
Dadurch fragt die App in der Datenabnk folgendes ab.
Und gibt folgendes zurĂŒck:
- all details (*)
- from the products table
- where the category is Gifts
- and released is 1.
The restriction released = 1 is being used to hide products that are not released. We could assume for unreleased products, released = 0.
--> Angemommen der Shop hat keinen SQL Injection Schutz, dann können Angreifer folgenden Request erstellen.
--> Die DB ruft dann foglendes auf:
--- ist ein Kommentar Indikator. D.h alles danach wird nicht verarbeitet
Oder auch mit folgendem Befehl:
https://insecure-website.com/products?category=Gifts'+OR+1=1--
--> DB ruft auf:
Die modifizierte Anfrage gibt entweder alle Items mit Kategorie=Gifts oder 1=1, also gibt es alle Items zurĂŒck weil 1=1 immer true
Subverting application logic¶
Bei einer App in der man sich z. B. mit Benutzername und Passwort anmelden kann:
Wenn die Abfrage die Daten eines Bentuzers zurĂŒckliefert, ist die Anmeldung erfolgreich. Andernfalls wird sie abgelehnt.
Wenn der Angreifer diese Abfrage aber zB verÀndert und beim benutzername folgendes baut
administrator'-- sieht die Anfrage wie folgt aus: Die Passwort abfrage wird einfach auskommentiert