Was ist eine SQL-Injection?

SQL-Injection

SQL Injection ist ein Angriff, bei dem eine Datenbank illegal manipuliert wird, indem unbeabsichtigte SQL-Anweisungen (Structured Query Language) in eine Anwendung mit einer relationalen Datenbank (RDBMS) eingefügt werden. Es gibt verschiedene Arten von SQL-Injection, je nach Methode und Zweck, und aus der Perspektive von Cyber-Angreifern reichen sie vom Diebstahl von Informationen, der Fälschung von Daten und der Untersuchung von Schwachstellen. Obwohl es sich um einen alten Angriff handelt, verursacht er auch heute noch viele Schäden. Daher ist es einer der Angriffe, vor denen Unternehmen besonders vorsichtig sein sollten. 

Relationale Datenbanken und SQL 

Bevor wir uns mit der Erklärung der SQL-Injection befassen, lassen Sie uns zunächst relationale Datenbanken und SQL erklären. Eine relationale Datenbank ist ein Datenbanktyp, der Anwendungsdaten in einem Tabellenformat verwaltet. Sie wird aufgrund der hohen Zuverlässigkeit von Transaktionen (jeder einzelne Prozess) in vielen Geschäftsanwendungen eingesetzt. 

SQL ist eine Sprache (Datenbanksprache) für den Betrieb relationaler Datenbanken. Der Betrieb ist in drei Kategorien unterteilt:  

  • Data Definition Language (DDL) zum Konfigurieren der Datenbank 
  • Data Manipulation Language (DML) zum Lesen und Aktualisieren von Daten 
  • Data Control Language (DCL) für verschiedene Kontrollen, wie z. B. Autorität 

Die Vorgaben für SQL werden von ISO festgelegt. Wenn es sich also grundsätzlich um eine relationale Datenbank handelt, ist es möglich, diese auf die gleiche Weise zu betreiben, auch wenn der Anbieter anders ist. 

Beispiel für SQL Injection

Eines Tages entdeckt ein Cyber-Angreifer eine Anwendung und macht sie zum Ziel eines Angriffs. Wir gehen davon aus, dass der Cyber-Angreifer weiß, dass bereits ein legitimer Nutzer „Ken Sato“ in dieser Webanwendung vorhanden ist. Der Cyber-Angreifer versucht, sich illegal anzumelden, indem er sich als Benutzer „Ken Sato“ ausgibt. Im Anmeldeformular gibt der Cyber-Angreifer die in Abbildung 1 gezeigte Zeichenfolge ein. Wenn Sie die SQL-Anweisung aus der Perspektive der Anwendung betrachten, wird die in Abbildung 2 dargestellte SQL-Anweisung generiert. Wie wird diese SQL-Anweisung in einer relationalen Datenbank interpretiert? 

image

Abbildung 1: Beispiel für Eingaben von Cyber-Angreifern

image

Abbildung 2: SQL-Anweisung erstellt aus der Eingabe in Abbildung 1

Wenn die relationale Datenbank diese SQL-Anweisung erhält, sucht sie zunächst nach einer Zeile in der Tabelle USERS, in der der USER NAME „Ken Sato“ ist. Da der Benutzername "Ken Sato" bereits vorhanden ist, geht die relationale Datenbank zur nächsten Suchbedingung über. Hier beginnt das Problem. 

Die relationale Datenbank sucht entsprechend der Suchbedingung nach einem Benutzer, dessen Benutzername "Ken Sato" lautet und dessen Passwort "leer" oder "'1' = '1'" ist. Da Passwörter in vielen Anwendungen erforderlich sind, sagen wir, dass dieses Mal kein Benutzer mit einem „leeren“ Passwort gefunden wurde. Aber was ist mit „1“ = „1“? Dies ist eine Formel, die vergleicht, ob „1“ und „1“ gleich sind. Natürlich ist dieses Ergebnis immer wahr. Daher erkennt die relationale Datenbank, dass ein Benutzer existiert, dessen BENUTZERNAME „Ken Sato“ ist und dessen PASSWORD „leer“ oder „1“ = „1“ ist. Infolgedessen antwortet der Datenbankserver mit Informationen, die mit dem Benutzernamen „Ken Sato“ verknüpft sind, an den Anwendungsserver, ohne das Passwort für diesen Benutzernamen zu überprüfen. Der Anwendungsserver erstellt einen Anmeldeerfolgsbildschirm basierend auf diesen Informationen und sendet ihn als Antwort an den Browser des Cyber-Angreifers. 

Dies ist der grundlegende Mechanismus der SQL-Injektion. Wir haben eine Anmeldung für Webanwendungen als leicht verständliches Beispiel angegeben, aber Datenbankoperationen mit SQL-Anweisungen werden in vielen Anwendungsfunktionen verwendet. Daher kann dieser Angriff nicht nur auf dem Anmeldebildschirm, sondern in verschiedenen Situationen in der Anwendung erfolgreich sein. 

Arten von SQL Injection-Angriffen

Je nach Zweck und Methode gibt es verschiedene Arten von SQL-Injection.

Fehlerbasierte SQL-Injektion

Dies ist eine SQL-Injection-Technik, die verwendet wird, um Anwendungskonfigurationen und Schwachstellen zu untersuchen. Durch absichtliche Eingabe einer ungültigen Eingabe in die Anwendung wird ein Fehler generiert, und die Details des Zielsystems werden anhand der Fehlermeldung untersucht. Obwohl die Möglichkeit, Daten mithilfe dieser Technik direkt zu fälschen oder zu lecken, gering ist, können Cyberangreifer die Informationen, die mithilfe dieser Technik erhalten wurden, verwenden, um Angriffe zu starten, die auf Schwachstellen oder andere unten beschriebene SQL-Injection-Angriffe abzielen. 

UNION Injektion

Dies ist eine SQL-Injection-Technik, die den UNION-Operator, einen SQL-Typ, verwendet, um beliebige Daten zu referenzieren. Der UNION-Operator ist ein Operator, der die Ergebnisse mehrerer SELECT-Anweisungen kombiniert. Wenn ein Cyber-Angreifer eine neue SELECT-Anweisung, die mit dem UNION-Operator beginnt, zu einer SELECT-Anweisung hinzufügt, die von einer Anwendung ausgegeben wird, wird es der Anwendung möglich, Daten zu erhalten, die nicht von der Anwendung beabsichtigt sind. Wenn der Angriff erfolgreich ist, kann der Cyber-Angreifer beliebige Daten auf Datenbanktabellenebene erhalten. Aus diesem Grund ist es eine Methode, die besonders große Schäden bei SQL-Injektionen verursachen kann. 

Blinde SQL-Injektion

Dies ist eine SQL-Injection-Technik, die eine SQL-Anweisung an eine Anwendung sendet und die Struktur der Anwendung untersucht, indem Unterschiede im Verhalten und nicht die direkten Ergebnisse beobachtet werden. Wie bei fehlerbasierter SQL-Injection ist die Möglichkeit, Daten mithilfe dieser Technik direkt zu fälschen oder zu lecken, gering. Cyberangreifer können jedoch die mit dieser Technik erhaltenen Informationen verwenden, um Angriffe zu starten, die auf Schwachstellen oder andere SQL-Injection-Angriffe abzielen. 

SQL-Injektion zweiter Ordnung 

Dies ist eine SQL-Injection-Technik, bei der ein Cyber-Angreifer eine erstellte SQL-Anweisung an eine Anwendung sendet, die zum Zeitpunkt der Ausführung unwirksam ist und sie später ausführt. Da diese Technik in einer Umgebung ausgeführt wird, in der kein direkter Benutzerzugriff erwartet wird, könnte es im schlimmsten Fall zu Intrusionen auf Datenbankebene führen, wie z. B. Änderungen an Datenbankeinstellungen und Berechtigungen. 

So verhindern Sie SQL Injection-Angriffe

Heutige Anwendungen bestehen aus verschiedenen Elementen. Daher sind für jedes Element geeignete Maßnahmen erforderlich, also mehrschichtige Abwehr.  

Dies sind die wichtigsten Maßnahmen, um Schäden durch SQL-Injection zu verhindern. 

Maßnahmen auf Datenbankebene

Eine Gegenmaßnahme auf Datenbankebene besteht darin, die Benutzerberechtigungen in der Datenbank zu optimieren. Wie oben erwähnt, sind relationale Datenbankoperationen weitgehend in drei Kategorien unterteilt: Data Definition Language (DDL), die die Datenbank konfiguriert; Data Manipulation Language (DML), die Daten liest und aktualisiert; und Data Control Language (DCL), die verschiedene Steuerelemente wie Berechtigungen verarbeitet. In vielen Fällen sind DML wie SELECT-Klauseln jedoch das, was die meisten Anwendungen normalerweise verwenden. Durch die Einschränkung von Berechtigungen für andere Vorgänge können unbeabsichtigte Datenlöschungen und Einstellungsänderungen verhindert werden. 

Maßnahmen auf Anwendungsebene

Es stehen eine Vielzahl von Gegenmaßnahmen auf Anwendungsebene zur Verfügung. 

  • Platzhalter verwenden 

SQL-Injection kann verhindert werden, indem SQL-Anweisungen mithilfe von Platzhaltern erstellt werden. Platzhalter weisen SQL-Anweisungen mechanisch Eingabewerte zu, die im Voraus von der Anwendung erstellt wurden, und selbst wenn ungültige Werte als Eingabe für die Anwendung bereitgestellt werden, handelt es sich um ungültige Werte, und die Erstellung der endgültigen SQL-Anweisung wird angehalten.

  • Ordnungsgemäßes Entweichen von Eingabewerten

Symbole und Zeichenfolgen, die besondere Bedeutungen in SQL-Anweisungen haben, werden entzogen und wie normale Zeichenfolgen behandelt, um unbeabsichtigte relationale Datenbankoperationen zu verhindern. Beispiele für Zeichen, die entgangen werden können, sind „` (Einzelanführung), „; (Semicolon/Bedeutung: das betreffende Symbol gilt als Ende der SQL-Anweisung)“, „-- (zwei aufeinanderfolgende Bindestriche/Bedeutung: das Symbol nach dem Symbol wird als Kommentar behandelt)“ und „UNION (UNION-Klausel/Bedeutung: kombiniert die Ergebnisse von zwei oder mehr SELECT-Anweisungen)“. Darüber hinaus ist bei Zahlen wie „1“ explizit zu definieren, ob sie in der Datenbank als „Zahlen“ oder „Zeichen“ behandelt werden und entsprechend zu konvertieren.

  • Fehler ausblenden

Fehlermeldungen, die von Anwendungen angezeigt werden, können Cyber-Angreifern viele Informationen bereitstellen. Wie in „Fehlerbasierte SQL Injection“ beschrieben, können Angreifer diese Nachrichten verwenden, um weitere Angriffe zu starten. Bei der Entwicklung von Anwendungen ist es wichtig, keine Fehlermeldungen direkt anzuzeigen, die zu einem Verständnis der internen Umgebung des Systems führen könnten, nicht nur der Datenbank.

  • Anwenden von Patchprogrammen auf Paketsysteme

Wenn Sie ein Paketsystem verwenden, empfehlen wir Ihnen, das offiziell vom Anbieter bereitgestellte Patch so schnell wie möglich anzuwenden. Dies schützt Ihr System vor verschiedenen Schwachstellen, einschließlich SQL Injection.

Network-level measures

Measures at the network level include the use of IPS (Intrusion Prevention System) and WAF (Web Application Firewall). IPS is a solution that monitors the network and detects/blocks malicious communications. WAF is a solution that protects web applications, and by inspecting web communications, it detects/blocks attacks that target vulnerabilities in web applications.

Measures at the overall operating environment level

After implementing the above-mentioned measures, it is possible to objectively evaluate the effectiveness of the measures and any deficiencies by conducting external penetration tests and vulnerability assessments.

Unterschied bei Cross-Site-Scripting

Während beide Schwachstellen durch bösartigen Code oder Daten verursacht werden können, die von Website-/App-Benutzern und Administratoren gesendet werden, unterscheiden sie sich in Bezug auf die Auswirkungen. CSS/XSS verursacht in der Regel Störungen auf Client- oder Besucherseite und kann verwendet werden, um Sitzungen zu entführen, Websites zu veruntreuen, bösartige Inhalte herunterzuladen und URLs umzuleiten. Andererseits beeinträchtigen Injektionen die Serverseite stark und können zu Datenverlust und anderen Folgen führen. 

Schlussfolgerung

Obwohl SQL Injection ein alter Angriff ist, gibt es immer noch viele bestätigte Fälle, die in den letzten Jahren großen Schaden verursachen. Daher ist es immer noch ein Angriff, vor dem Unternehmen vorsichtig sein sollten. Wenn eine Technik wie die UNION-Injektion verwendet wird und der Angriff erfolgreich ist, kann dies zu einem großen Informationsleck führen. Durch geeignete Maßnahmen ist es jedoch möglich, solche Schäden zu verhindern, bevor sie auftreten. Als Sicherheitsmaßnahme für Unternehmensorganisationen empfehlen wir neben den oben genannten Maßnahmen aus der Perspektive der Verteidigung in der Tiefe, dass regelmäßig Sicherheitsbewertungen durchgeführt werden, wie externe Penetrationstests und Schwachstellendiagnose.