Blog

Entwickler meistern Sicherheit: Teilen & Lernen – SQL-Injection

December 6, 2018
Jaap Karan Singh

Einfach ausgedrückt ist SQL (Structured Query Language) die Sprache, die für die Kommunikation mit relationalen Datenbanken verwendet wird. Sie ist die Abfragesprache, mit der Entwickler, Datenbankadministratoren und Anwendungen die riesigen Datenmengen verwalten, die täglich generiert werden.

Unsere Daten entwickeln sich schnell zu einem der wertvollsten Güter der Welt... und wo Werte entstehen, versuchen Kriminelle, sich diese für ihre Zwecke anzueignen.

Angreifer nutzen SQL-Injection – eine der ältesten (seit 1998!) und hartnäckigsten Sicherheitslücken –, um sensible Daten aus Millionen von Datenbanken weltweit zu stehlen oder zu manipulieren. Diese Schwachstelle ist tückisch, und Entwickler müssen SQL-Injection verstehen (sowie wissen, wie man sich dagegen verteidigt), wenn wir unsere Daten sicher halten wollen.

Zu diesem Zweck werden wir drei Schlüsselaspekte der SQL-Injection erörtern:

  • Funktionsweise
  • Gefahrenpotenzial
  • Abwehrmaßnahmen

SQL-Injection verstehen

SQL-Injection lässt sich mit einem einzigen Wort erklären: Kontext.

Innerhalb einer Anwendung gibt es zwei Kontexte: einen für Daten und einen für Code. Der Code-Kontext weist den Computer an, was ausgeführt werden soll, und trennt dies von den zu verarbeitenden Daten.

Eine SQL-Injection tritt auf, wenn ein Angreifer Daten eingibt, die vom SQL-Interpreter fälschlicherweise als Code interpretiert werden.

Ein Beispiel ist ein Eingabefeld auf einer Website, in das ein Angreifer „' OR 1=1“ eingibt, was an das Ende einer SQL-Abfrage angehängt wird. Bei der Ausführung liefert diese Abfrage für jede Zeile in der Datenbank „wahr“ zurück. Das bedeutet, dass alle Datensätze der abgefragten Tabelle ausgegeben werden.

Die Auswirkungen einer SQL-Injection können katastrophal sein. Geschieht dies auf einer Anmeldeseite, könnten sämtliche Benutzerdatensätze, möglicherweise einschließlich Benutzernamen und Passwörtern, preisgegeben werden. Wenn eine einfache Abfrage zum Auslesen von Daten erfolgreich ist, können auch Abfragen zur Manipulation von Daten durchgeführt werden.

Werfen wir einen Blick auf anfälligen Code, damit Sie sehen können, wie eine SQL-Injection-Schwachstelle in der Praxis aussieht.

Sehen Sie sich diesen Code an:

String query = "SELECT account balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
   Statement statement = connection.createStatement( ... );
   ResultSet results = statement.executeQuery( query );
}

Der Code hier hängt die Parameterinformationen vom Client ohne jegliche Validierung einfach an das Ende der SQL-Abfrage an. Wenn dies geschieht, kann ein Angreifer Code in ein Eingabefeld oder in URL-Parameter einschleusen, der dann ausgeführt wird.

Das Entscheidende ist nicht, dass Angreifer nur „' OR 1=1“ an eine SELECT-Abfrage anhängen können, sondern dass sie jede Art von SQL-Abfrage (INSERT, UPDATE, DELETE, DROP usw.) manipulieren und mit allem erweitern können, was die Datenbank unterstützt. Es gibt hervorragende Ressourcen und Tools im öffentlichen Bereich, die aufzeigen, was möglich ist.

Wir werden bald lernen, wie man dieses Problem behebt. Zuerst wollen wir jedoch verstehen, wie groß der mögliche Schaden ist.

Warum SQL-Injection so gefährlich ist

Hier sind nur drei Beispiele für Sicherheitsverletzungen durch SQL-Injection:

  • Die Website der Illinois Board of Elections wurde gehackt aufgrund von SQL-Injection-Schwachstellen. Die Angreifer stahlen die persönlichen Daten von 200.000 US-Bürgern. Die Art der gefundenen Schwachstelle hätte es den Angreifern ermöglicht, die Daten auch zu verändern, was sie jedoch nicht taten.
  • Hetzner, ein südafrikanischer Webhosting-Anbieter, wurde gehackt, wobei 40.000 Kundendatensätze betroffen waren. Eine SQL-Injection-Schwachstelle führte zum möglichen Diebstahl sämtlicher Kundendaten in ihrer Datenbank.
  • Ein katholischer Finanzdienstleister in Minnesota, USA, wurde gehackt unter Verwendung von SQL-Injection. Kontodaten, einschließlich Kontonummern, von fast 130.000 Kunden wurden gestohlen.

Sensible Daten können dazu verwendet werden, Konten zu übernehmen, Passwörter zurückzusetzen, Geld zu stehlen oder Betrug zu begehen.

Selbst Informationen, die nicht als sensibel oder persönlich identifizierbar gelten, können für weitere Angriffe genutzt werden. Adressdaten oder die letzten vier Ziffern Ihrer staatlichen Identifikationsnummer können verwendet werden, um sich bei Unternehmen als Sie auszugeben oder Ihr Passwort zurückzusetzen.

Bei einem erfolgreichen Angriff können Kunden das Vertrauen in das Unternehmen verlieren. Die Beseitigung von Systemschäden oder behördliche Bußgelder können Millionen kosten.

Aber so muss es für Sie nicht enden.

SQL-Injection abwehren

SQL-Injection lässt sich abwehren, indem Teile Ihrer Anwendung klar gekennzeichnet werden, sodass der Computer weiß, ob es sich bei einem bestimmten Teil um Daten oder um auszuführenden Code handelt. Dies kann durch parametrisierte Abfragen erreicht werden.

Wenn SQL-Abfragen Parameter verwenden, nutzt der SQL-Interpreter den Parameter ausschließlich als Daten. Er führt ihn nicht als Code aus.

Ein Angriff wie „' OR 1=1“ funktioniert beispielsweise nicht. Die Datenbank sucht nach der Zeichenfolge „OR 1=1“ und findet sie nicht. Sie wird einfach mit den Schultern zucken und sagen: „Entschuldigung, das konnte ich nicht finden.“

Ein Beispiel für eine parametrisierte Abfrage in Java sieht so aus:

Code example showing use of parameterized SQL queries to securely insert user data.

Die meisten Entwicklungs-Frameworks bieten integrierte Schutzmechanismen gegen SQL-Injection.

Object-Relational Mapper (ORMs), wie Entity Framework in der .NET-Familie, parametrisieren Abfragen standardmäßig. Damit ist das Thema SQL-Injection ohne weiteres Zutun Ihrerseits erledigt.

Sie müssen jedoch wissen, wie Ihr spezifisches ORM funktioniert. Zum Beispiel Hibernate, ein beliebtes ORM in der Java-Welt, kann bei falscher Verwendung weiterhin anfällig für SQL-Injection sein.

Die Parametrisierung von Abfragen ist die erste und beste Verteidigungslinie, aber es gibt noch weitere. Auch gespeicherte Prozeduren (Stored Procedures) unterstützen SQL-Parameter und können zur Verhinderung von SQL-Injection eingesetzt werden. Denken Sie daran, dass die gespeicherten Prozeduren ebenfalls korrekt erstellt sein müssen, damit dies funktioniert.

// Das sollte WIRKLICH auch validiert werden
String custname = request.getParameter("customerName");
// Eingabevalidierung zur Erkennung von Angriffen durchführen
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.preparedStatement( query );
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery( );

Validieren und bereinigen Sie immer Ihre Eingaben. Da Zeichenfolgen wie „OR 1=1“ von einem legitimen Benutzer Ihrer Anwendung nicht eingegeben werden, müssen Sie diese auch nicht zulassen. Sie können dem Benutzer eine Fehlermeldung anzeigen oder die Zeichen vor der Verarbeitung aus der Eingabe entfernen.

Verlassen Sie sich dabei jedoch nicht allein auf Validierung und Bereinigung. Clevere Angreifer haben Wege gefunden, dies zu umgehen. Es sind gute Strategien für eine tiefengestaffelte Verteidigung (Defense in Depth, DiD), aber die Parametrisierung ist der sicherste Weg, um alle Eventualitäten abzudecken.

Eine weitere gute DiD-Strategie ist das Prinzip der „geringsten Rechte“ (Least Privilege) innerhalb der Datenbank sowie die Verwendung von Whitelists für Eingaben. Die Durchsetzung der geringsten Rechte bedeutet, dass Ihre Anwendung keine unbegrenzten Befugnisse innerhalb der Datenbank hat. Sollte ein Angreifer Zugriff erlangen, ist der mögliche Schaden begrenzt.

OWASP bietet ein hervorragendes SQL Injection Cheat Sheet, das zeigt, wie man diese Schwachstelle in verschiedenen Sprachen und auf unterschiedlichen Plattformen handhabt. Wenn Sie jedoch noch einen Schritt weiter gehen möchten, können Sie direkt auf unserer Plattform eine SQL-Injection-Challenge in Ihrer bevorzugten Sprache spielen. Hier sind einige der beliebtesten zum Einstieg:

SQL-Injection in C#

SQL-Injection in Node.js

SQL-Injection in Python Django

SQL-Injection in Java Spring

Die Reise beginnt

Sie haben große Fortschritte beim Verständnis von SQL-Injection und den notwendigen Schritten zur Behebung gemacht. Großartig!

Wir haben besprochen, wie SQL-Injection entsteht: Typischerweise nutzt ein Angreifer Eingaben, um Ihre Datenbankabfragen für seine eigenen bösartigen Zwecke zu manipulieren.

Wir haben auch gesehen, welchen Schaden die Ausnutzung von SQL-Injection-Schwachstellen anrichten kann: Konten können kompromittiert und Millionenbeträge verloren gehen – ein Albtraum, und zwar ein teurer.

Wir haben gesehen, wie man SQL-Injection verhindert:

  • Parametrisierung von Abfragen
  • Verwendung von Object-Relational Mappern und Stored Procedures
  • Validierung und Whitelisting von Benutzereingaben

Jetzt sind Sie an der Reihe. Übung ist der beste Weg, um weiter zu lernen und Meisterschaft zu erlangen. Warum schauen Sie sich also nicht unsere Lernressourcen zu SQL-Injection an und probieren dann unsere kostenlose Demo der Plattform aus? Damit sind Sie auf dem besten Weg, ein Secure Code Warrior zu werden.

Slogan

Kontrollieren Sie KI-gestützte Entwicklung, bevor sie in Produktion geht

Bewerten Sie KI-gestützte Risiken, setzen Sie Richtlinien für sicheren Code direkt beim Commit durch und beschleunigen Sie die sichere Bereitstellung über Ihren gesamten SDLC hinweg.

Demo buchen
Ressourcenbibliothek

Weitere Blogs entdecken

Erhalten Sie Zugang zu Experteninhalten über sichere Programmierung, KI-Governance und Software-Risikomanagement.

alle anzeigen
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Mehr erfahren
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

Mehr erfahren
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Eine Sicherheitskultur: Wie Sage sein Champions-Programm aufgebaut hat

Erfahren Sie, wie Sage die Sicherheit durch einen flexiblen, beziehungsorientierten Ansatz gestärkt, über 200 Security Champions ausgebildet und eine messbare Risikoreduzierung erzielt hat.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Cybersecurity Awareness Month 2026: Das Verständnis von KI-Sicherheit ist entscheidend für die Unternehmensverteidigung

Wir haben einen Punkt erreicht, an dem die meisten führenden KI-Unternehmen öffentlich eine weltweite Verlangsamung der KI-Entwicklung gefordert haben, damit die Sicherheitsvorkehrungen Schritt halten können. Doch die Wahrheit ist: Ernsthafte Sicherheitsprobleme sind bereits Realität geworden. Dies bringt unzählige Sicherheitsverantwortliche und Führungsteams in eine dringliche Lage, da die finanziellen Kosten und Risiken durch die Implementierung von KI stetig steigen.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Enabler 8: Branding für Ihr Programm

Ein Programm für sicheres Programmieren braucht mehr als nur großartige Inhalte, um erfolgreich zu sein. Enabler 8 zeigt, wie Branding die Teilnahme zu einem begehrten, statusorientierten Erlebnis macht.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Jeder Mitarbeiter steht jetzt an vorderster Front der KI-Cybersicherheit

Die Unternehmenslandschaft wandelt sich mit einer Geschwindigkeit, die kaum jemand vorhergesehen hat, bis es zu spät war. Wir haben offiziell die Schwelle von handgeschriebenem Code und einfacher Copilot-Unterstützung hin zur Ära des Agentic Development Lifecycle (ADLC) überschritten. Während autonome KI-Agenten eine beispiellose Effizienz in vielen Bereichen versprechen, bringen sie auch eine völlig neue Klasse von Sicherheits- und Regulierungsrisiken mit sich.

Mehr erfahren

Sichere KI-gestützte Entwicklung vor dem Release

Erkennen Sie Entwicklerrisiken, setzen Sie Richtlinien durch und verhindern Sie Schwachstellen über den gesamten Softwareentwicklungszyklus hinweg.

Demo buchen
Keine Elemente gefunden.