Skip to content

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 der WHERE-Klausel.
  • In INSERT-Anweisungen, innerhalb der eingefĂŒgten Werte.
  • In SELECT-Anweisungen, innerhalb des Tabellen- oder Spaltennamens.
  • In SELECT-Anweisungen, innerhalb der ORDER 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:

https://insecure-website.com/products?category=Gifts

Dadurch fragt die App in der Datenabnk folgendes ab.

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

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.

https://insecure-website.com/products?category=Gifts'--

--> Die DB ruft dann foglendes auf:

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
- -- 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:

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

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:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

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

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''