Was ist SQL-Injection? So verhindern Sie SQLi-Angriffe
Veröffentlicht: 2023-09-15Webanwendungen prägen unser Online-Erlebnis Tag für Tag. Wir vernetzen uns, interagieren, kaufen ein und schauen uns lustige Katzenvideos an – alles über Web-Apps. Sie erbringen wichtige Geschäftsdienste und speichern sensible Daten. Doch je öfter wir etwas nutzen, desto anfälliger wird es für Angriffe.
Ein Cyberangriff, vor dem Sie auf Apps achten sollten, die Schwachstellen in der strukturierten Abfragesprache (SQL) ausnutzen, ist die häufige und gefährliche SQL-Injection.
Was ist SQL-Injection?
SQL-Injection (SQLi) ist eine schädliche Code-Injection-Technik, mit der Cyber-Angreifer Schwachstellen in Webanwendungen ausnutzen. Sie nutzen die Schwachstellen aus, um sich unbefugten Zugriff zu verschaffen, indem sie einer Datenbankabfrage eine Reihe von Schadcodes hinzufügen.
SQL-Injection-Angriffe führen zu unzulässigem Datenzugriff, Manipulation, Identitätsdiebstahl, finanziellen Verlusten, Reputationsschäden und rechtlichen Konsequenzen. Entwickler und Organisationen müssen die Risiken verstehen und umfassende Sicherheitsmaßnahmen implementieren. Tools wie Web Application Firewalls (WAF) und digitale Forensik-Software sollen vor SQL-Injection-Angriffen schützen. Unternehmen können sich zum Schutz ihrer Apps auch auf umfassende Website-Sicherheitssuiten verlassen.
Lesen Sie diesen SQL-Injection-Spickzettel, um anhand von Beispielen zu erfahren, wie SQL-Angriffe ausgeführt werden, welche Variationen es gibt und wie man solche Angriffe verhindern kann.
Warum sind SQL-Injection-Angriffe gefährlich?
SQL-Injection steht seit Jahren auf der Top-10-Liste der Sicherheitsrisiken für Webanwendungen des Open Worldwide Application Security Project (OWASP). Allein im Jahr 2022 stellte OWASP mehr als 274.000 Vorfälle irgendeiner Form der Injektion in den von ihnen getesteten Apps fest; Am häufigsten waren SQL-Injection und Cross-Site-Scripting (XSS).
Angreifer können SQL-Injektionen verwenden, um Folgendes zu verursachen:
- Fehler in Webanwendungen durch Ändern oder Löschen von Informationen innerhalb einer Datenbank.
- Datenschutzverletzungen liegen vor , wenn Hacker unbefugten Zugriff auf vertrauliche Daten erhalten, die in Datenbanken gespeichert sind, wie z. B. persönliche Informationen, Finanzunterlagen oder Passwörter.
- Kompromittierte Systeme durch Zugriff auf weitere, nicht autorisierte Systeme, die dieselben gemeinsam genutzten Datenbanken verwenden. Dies ermöglicht es Angreifern, ihre Angriffe auf andere Systeme im selben Netzwerk auszuweiten oder einen verteilten Denial-of-Service (DDoS) durchzuführen.
Diese destruktiven Handlungen schädigen Unternehmen unwiederbringlich. Die Straftaten gefährden die Privatsphäre und Datenintegrität und führen zu einem Verlust des Kundenvertrauens und des Rufs des Unternehmens. Darüber hinaus stellt die Bewältigung der Folgen für das Unternehmen eine zusätzliche finanzielle Belastung dar.
Beispiele für reale SQL-Injection-Angriffe
Es ist mehr als zwei Jahrzehnte her, seit SQL-Injection zum ersten Mal auf den Markt kam. Zwanzig Jahre später ist es immer noch berüchtigt, wie die folgenden prominenten SQL-Injection-Vorfälle belegen.
- Heartland Payments Systems: Im Jahr 2008 kam es bei Heartland Payments Systems zu einer der größten Datenschutzverletzungen in der Geschichte: Durch einen SQLi-Angriff wurden über 130 Millionen Kredit- und Debitkartendaten offengelegt. Heartland zahlte Millionenstrafen.
- Yahoo : Im Jahr 2012 wurden durch einen SQL-Injection-Angriff die Kontodaten von fast 5 Millionen Yahoo-Benutzern kompromittiert, darunter E-Mail-Adressen und Passwörter.
- Freepik: Hacker haben im Jahr 2020 bei einem SQL-Injection-Angriff auf die Flaticon-Website des Unternehmens die E-Mails und Passwörter von 8,3 Millionen Freepik- und Flaticon-Benutzern gestohlen.
- WooCommerce: Das beliebte WordPress-Plugin hat eine SQL-Injection-Schwachstelle behoben, die 5 Millionen Websites dem Datendiebstahl aussetzte.
- BillQuick: Cyberkriminelle nutzten eine blinde SQL-Schwachstelle in der beliebten Abrechnungsplattform aus, um Ransomware zu verbreiten.
- MOVEit: Im Mai 2023 nutzte die Cl0p-Ransomware-Bande eine SQL-Injection-Schwachstelle im Managed-File-Transfer-Softwaretool MOVEit aus, von der über 1.000 Organisationen und mindestens 60 Millionen Einzelpersonen betroffen waren, was den bisher größten Datenverstoß des Jahres darstellte.
Wie funktioniert ein SQL-Injection-Angriff?
Schauen wir uns die Grundlagen von Datenbanken und SQL-Abfragen an, die wir in modernen Webanwendungen verwenden. Dies wird uns helfen, das Innenleben der SQL-Injection besser zu verstehen.
Alle Websites nutzen relationale Datenbanken, auch SQL-Datenbanken genannt, um Daten über ihre Benutzer und Apps zu speichern. Dabei kann es sich um Benutzerinformationen, Anmeldedaten, Zahlungsinformationen oder alles andere über das Unternehmen handeln. Nehmen Sie zum Beispiel eine E-Commerce-Website. Es speichert Produktdaten, Benutzerkonten, Bestelldaten und Zahlungsinformationen in seiner Datenbank.
Die Websites übernehmen dann die Daten aus diesen Datenbanken und stellen benutzerspezifische Inhalte oder Dienste bereit. Dieser Prozess erfolgt dank SQL, einer standardisierten Programmiersprache zur Verwaltung von Datenbanken. Wann immer Sie etwas von einer App abrufen müssen, beispielsweise Ihre Kaufhistorie, stellen Sie tatsächlich eine Anfrage an die Datenbank mithilfe von SQL-Abfragen, einem Befehl, der eine Datenbank anweist, eine bestimmte Aktion auszuführen.
Um Webinteraktionen reibungslos zu gestalten, ermöglichen viele Websites Benutzern die Eingabe von Daten, um SQL-Abfragen durchzuführen. Dazu können Dinge wie Suchbegriffe, Benutzernamen oder Zahlungsdetails gehören.
Betrachten Sie das Beispiel der E-Commerce-Website. Eine einfache SQL-Abfrage zur Anzeige Ihres Bestellverlaufs aus der Datenbank mit der Tabelle „Bestellungen“ (o) und einer Tabelle „Produkte“ (p) sieht wie folgt aus:
SELECT o.order_id, o.order_date, p.product_name, p.price
AB Bestellungen o
JOIN-Produkte p ON o.product_id = p.product_id
WO o.user_id = 12345;
Dieser SQL-Code wählt die Bestell-ID und das Datum aus der Bestelltabelle sowie den Produktnamen und den Preis aus der Produkttabelle für die BENUTZER-ID 12345 aus der Website-Datenbank aus. Typischerweise basiert die ID auf der Eingabe des Benutzers. Probleme entstehen, wenn die Eingabe nicht ordnungsgemäß überprüft und gesteuert wird. Angreifer nutzen diese Schwachstelle aus, um einen SQL-Injection-Angriff durchzuführen.
So verläuft es normalerweise.
- Identifizierung anfälliger Eingabefelder: Angreifer finden zunächst Eingabefelder in der Webanwendung, in die sie möglicherweise Schadcode einschleusen können. Sie übermitteln unterschiedliche Werte und sehen, wie die App reagiert. um herauszufinden, ob. Wenn die Anwendung die Benutzereingaben nicht ordnungsgemäß validiert oder bereinigt, verarbeitet die Anwendung ihre Eingaben als SQL-Code. Diese potenzielle Schwachstelle wird zur Code-Injection genutzt.
- Code-Injektion über Benutzereingaben: Nachdem Angreifer verstanden haben, wie die Anwendung mit Eingaben umgeht, erstellen sie eine Nutzlast, einen bösartigen SQL-Code, der die Sicherheitslücke ausnutzt. Dazu gehört das Hinzufügen von SQL-Steuerzeichen wie einfache Anführungszeichen ('), doppelte Anführungszeichen (“) oder Gleichheitszeichen (=), um die SQL-Abfragestruktur zu ändern. Durch die Verwendung dieser Steuerzeichen mit gängigen SQL-Befehlen wie SELECT und FROM können Angreifer auf Daten vom Datenbankserver zugreifen oder diese abrufen.
Anschließend übermitteln sie speziell gestaltete Eingaben zusammen mit legitimen Anfragen und täuschen die Anwendung so vor, dass sie den zwielichtigen Code als legitimen Teil der Abfrage behandelt. - Ausführung: Die Datenbank, die den Angriff nicht bemerkt, verarbeitet die Abfrage und führt den eingeschleusten Code aus, als wäre es eine legitime Anfrage.
- Ausnutzung: Abhängig von der Absicht des Angreifers kann der eingeschleuste SQL-Code vertrauliche Daten abrufen, Informationen ändern oder löschen oder sogar unbefugten Zugriff gewähren. Dadurch wird die Sicherheit der Anwendung gefährdet und möglicherweise werden vertrauliche Informationen preisgegeben.
Beispiel für eine SQL-Injection
Stellen Sie sich eine Webanwendung vor, die einen URL-Parameter verwendet, um Produktdetails basierend auf einer Produkt-ID abzurufen, etwa so:
http://example.com/products?id=1
Ein Angreifer könnte versuchen, bösartigen SQL-Code einzuschleusen, um einen Fehler zu verursachen und Informationen wie diese abzurufen: http://example.com/products?id=1' OR 1=1; –
Wenn die Anwendung die Benutzereingaben nicht ausreichend validiert und bereinigt, könnte die SQL-Abfrage wie folgt manipuliert werden:
SELECT * FROM products WHERE OR 1=1; - - ';
In diesem Fall war die ursprüngliche Abfrage darauf ausgelegt, ein Produkt mit der ID 1 abzurufen, aber die Eingabe des Angreifers ändert die Abfrage so, dass aufgrund des Zusatzes 1=1 und des angehängten doppelten Bindestrichs (- -) alle Produkte zurückgegeben werden. Es macht das ursprüngliche schließende einfache Anführungszeichen ungültig und führt dazu, dass alle Produktdetails angezeigt werden oder Fehlermeldungen angezeigt werden, die Angreifer ausnutzen können.
33 %
der kritischen Sicherheitslücken in Webanwendungen im Jahr 2022 waren auf SQL-Injections zurückzuführen.
Quelle: Statista
Die weit verbreitete Verbreitung von SQL-Schwachstellen und die Anziehungskraft der Web-App-Datenbank mit all ihren geschäftskritischen Daten machen SQL-Injection zu einem der hartnäckigsten Cyberangriffe.
Quelle: Spiceworks
Arten von SQL-Injection-Angriffen
Es gibt drei Haupttypen von SQL-Injection-Angriffen, je nachdem, wie Angreifer Informationen abrufen oder mit der Datenbank interagieren:
- Klassisches oder In-Band-SQLi
- Blindes oder inferenzielles SQLi
- Out-of-the-Band-SQLi
1. Klassisches oder In-Band-SQLi
In-Band ist die häufigste Art von SQL-Injection-Angriff. Der klassische Hacker nutzt denselben Kommunikationskanal (In-Band), um bösartigen SQL-Code einzuschleusen und die Ergebnisse abzurufen. Die beiden Hauptvarianten von In-Band-SQLi sind:
Union-basiertes In-Band-SQLi
Dieser Angriff nutzt den UNION-SQL-Operator, der zum Kombinieren von Daten aus dem Ergebnis von zwei oder mehr SELECT-Anweisungen verwendet wird. Auf diese Weise können Angreifer Daten aus Tabellen abrufen, auf die sie keinen direkten Zugriff haben.
Fehlerbasiertes In-Band-SQLi
Bei dieser Technik löst ein Angreifer absichtlich Fehler in einer SQL-Abfrage aus, um die von der Datenbank zurückgegebenen Fehlermeldungen auszunutzen. Die Fehler können wertvolle Informationen über die Datenbankstruktur, Tabellennamen, Spaltennamen und manchmal auch die Daten selbst preisgeben. Fehlerbasiertes SQLi kann auch als Out-of-the-Band-SQLi ausgeführt werden.
2. Inferenzielles (blindes) SQLi
Bei einem blinden SQLi kann der Angreifer die Ergebnisse seines Angriffs nicht direkt sehen. Stattdessen leiten sie Informationen ab, indem sie das Anwendungsverhalten oder Fehlermeldungen beobachten, die auf ihre Anfragen reagieren. Diese Art von Angriff ist zeitintensiv, da Hacker eine Reihe von SQL-Abfragen durchführen müssen, um potenzielle Schwachstellen zu finden, die sie ausnutzen können. Zwei Varianten von blindem SQLi sind:
Zeitbasiertes blindes SQLi
Hierbei stellen die Angreifer Abfragen, die dazu führen, dass die Datenbank ihre Antwort verzögert, bevor sie reagiert. Sie leiten Informationen über die Datenbank ab, indem sie auf die Antwortzeit achten.
Boolescher blinder SQLi
Bei Boolean Blind SQLi machen sich Angreifer die Art und Weise zunutze, wie eine Anwendung auf wahre oder falsche Bedingungen in SQL-Abfragen reagiert. Basierend auf den Antworten der Webanwendung leiten sie Informationen über die Datenbank ab, auch wenn keine Daten aus der Datenbank zurückgegeben werden.
3. Out-of-the-Band-SQLi
Ein Out-of-the-Band-SQLi-Angriff führt dazu, dass die Anwendung Daten an einen von den Hackern kontrollierten Remote-Endpunkt sendet. Ein Angriff wie dieser erfordert, dass die SQL-Server über bestimmte Funktionen verfügen, beispielsweise die Möglichkeit, externe Netzwerkanforderungen wie HTTP-Anfragen (Hypertext Transfer Protocol) zu initiieren.
So verhindern Sie SQL-Injection-Angriffe: ein Spickzettel
Um SQL-Injection zu verhindern, ist ein mehrschichtiger Ansatz erforderlich, der sichere Codierungspraktiken und kontinuierliche Überwachung umfasst. Hier ist ein Spickzettel mit wichtigen Schritten, die Ihnen helfen, sich vor SQL-Injection-Angriffen zu schützen.
Verwenden Sie vorbereitete Aussagen
Der primäre Schutz gegen SQL-Injection-Angriffe sind vorbereitete Anweisungen mit parametrisierten Abfragen. Vorbereitete Anweisungen stellen sicher, dass Benutzereingaben als Daten und nicht als ausführbarer Code behandelt werden.
Entwickler stellen SQL-Codes für Abfragen vorab als Vorlagen mit Platzhaltern für Eingabewerte des Benutzers zusammen. Zum Zeitpunkt der Abfrageausführung binden die vorbereiteten Anweisungen tatsächliche Werte anstelle von Platzhaltern. Dadurch wird die Ausführung von Schadcode gestoppt.
Vorbereitete Anweisungen werden gegenüber dynamischen SQL-Anweisungen bevorzugt. Sie schreiben SQL-Abfragen während der Ausführungszeit, was sie gegen Injektionsangriffe schwächt.
Vorbereitete Anweisungen in gängigen Programmiersprachen:
Hier sind sprachspezifische Empfehlungen für die Verwendung vorbereiteter Anweisungen (parametrisierte Abfragen) in der gängigen Datenbankprogrammierung:
- Java Enterprise Edition (EE): Verwenden Sie die PreparedStatement- Klasse aus dem java.sql-Paket. Binden Sie Parameter mit Methoden wie setString , setInt usw.
- Python (SQLite3) : Verwenden Sie Platzhalter ( ? ) in Abfragen. Binden Sie Parameter mithilfe eines Tupels oder einer Liste .
- PHP: Verwenden Sie die PHP-Erweiterung für Datenobjekte (PDO) . Verwenden Sie vorbereitete Anweisungen mit Platzhaltern (:). Binden Sie Parameter mit bindValue oder bindParam .
- .NET : MySqlCommand- Objekt verwenden. Binden Sie Parameter mit Parameters.AddWithValue .
Eine weitere Methode zur Verhinderung von SQL-Injections ist die Verwendung gespeicherter Prozeduren oder einer Gruppe vorkompilierter SQL-Codes, die immer wieder verwendet werden können.
Üben Sie die Eingabevalidierung
Bei der Eingabevalidierung wird die Benutzereingabe vor der Verarbeitung überprüft, um sicherzustellen, dass sie bestimmte Kriterien erfüllt. Eine Zulassungsliste, auch Whitelist genannt, ist ein wichtiger Aspekt der Eingabevalidierung. Dabei werden im Rahmen von SQL-Abfragen nur vordefinierte, sichere Werte oder Muster akzeptiert. Jede Eingabe, die nicht den eingestellten Kriterien entspricht, wird abgelehnt. Dadurch wird aktiv verhindert, dass bösartige oder unerwartete Eingaben in das System gelangen.
Verwenden Sie objektrelationale Mapping-Bibliotheken
ORM-Bibliotheken (Object-Relational Mapping) sind wertvolle Werkzeuge für Entwickler, die mit relationalen Datenbanken arbeiten. Sie ermöglichen Entwicklern die Interaktion mit Datenbanken mithilfe der Programmiersprache ihrer Wahl und reduzieren so die Notwendigkeit, unformatierte SQL-Abfragen zu schreiben. ORM-Bibliotheken bieten integrierten Schutz vor SQL-Injection-Angriffen.
Schulen Sie die Entwickler und IT-Teams in sicheren Codierungspraktiken. Stellen Sie sicher, dass Sie regelmäßig Sicherheitsüberprüfungen und Penetrationstests durchführen, um Schwachstellen zu finden.
Tipp: Helfen Sie Ihren Programmierern und Entwicklern, sicheres Codieren schneller zu erlernen, mit Schulungstools für sicheren Code.
Setzen Sie das Prinzip der geringsten Privilegien durch
Das Prinzip der geringsten Rechte gewährt Datenbankbenutzern nur die für die Ausführung ihrer Aufgaben erforderlichen Mindestberechtigungen. Die Befolgung dieses Prinzips reduziert die Auswirkungen potenzieller SQL-Injection-Angriffe oder anderer Cyberangriffe. Wenden Sie außerdem eine strenge Zugriffskontrolle auf Ihre Datenbank an.
Bereitstellen einer Web Application Firewall (WAF)
Eine WAF überwacht den eingehenden Netzwerkverkehr von Anwendungen und blockiert potenziellen bösartigen Datenverkehr basierend auf einer Liste bekannter Angriffssignaturen.
Die 5 besten Web Application Firewall (WAF)-Tools:
- Azure Web Application Firewall
- AWS WAF
- Imperva Web Application Firewall (WAF)
- Cloudflare-Spektrum
- Symantec Web Application Firewall und Reverse Proxy
* Oben sind die fünf führenden WAF-Lösungen aus dem Grid Report Sommer 2023 von G2 aufgeführt.
Eine WAF nutzt vordefinierte Regeln, um verdächtige Muster und Anomalien im eingehenden Datenverkehr zu erkennen, wie etwa SQL-Schlüsselwörter und bösartige Payloads. Es bereinigt und validiert Benutzereingaben und blockiert oder filtert schädliche Anfragen. Dies trägt dazu bei, gefährliche SQL-Abfragen zu stoppen, sobald sie in das System gelangen.
Moderne WAFs passen sich durch maschinelles Lernen an neue Angriffsmethoden an.
Weitere Sicherheitstools zur Verhinderung von SQL-Injection-Angriffen
Neben WAF erschweren mehrere andere Sicherheitsplattformen SQL-Injection-Angriffe.
- Schwachstellenscanner suchen nach bekannten und unbekannten Schwachstellen in Webanwendungen.
- SAST-Tools (Static Application Security Testing) und Software zur statischen Codeanalyse finden Sicherheitslücken, ohne tatsächlich Code auszuführen.
- Dynamische Software zum Testen der Anwendungssicherheit simuliert Angriffe auf laufende Anwendungen und identifiziert Schwachstellen.
- Intrusion-Detection- und Prevention-Systeme sowie digitale Forensik-Software untersuchen Anomalien und Angriffe auf Anwendungen in Echtzeit.
Bewachen Sie Ihre Datenfestungen
SQL-Injection-Angriffe stellen eine ernsthafte Bedrohung für die Sicherheit von Web-Apps dar. Unternehmen riskieren den Verlust wertvoller Daten, der Privatsphäre der Benutzer und ihres guten Rufs, wenn die Angriffe erfolgreich sind.
Obwohl keine einzelne Lösung absolute Sicherheit gegen SQL-Injection garantiert, verringert die Kombination der hier besprochenen vorbeugenden Maßnahmen die Wahrscheinlichkeit von Angriffen erheblich. Webentwickler und Datenbankadministratoren sollten strenge Abwehrmaßnahmen ergreifen und ihre Webanwendungen gegen potenzielle Ausnutzung schützen.
Möchten Sie eine umfassende Lösung zur Sicherung Ihrer Website? Entdecken Sie Web-Sicherheitssoftware und wie sie gegen Cyberangriffe hilft, die zu Datenschutzverletzungen führen.