Schutz vor SQL-Injection

Schutz vor SQL-Injection

05.12.2022
Autor: HostZealot Team
2 min.
259

In diesem Artikel wird erklärt, wie SQL-Injection funktioniert, welche Gefahren solche Angriffe bergen und wie man sich schützen kann. Vorab sei darauf hingewiesen, dass Sie mit der richtigen Vorgehensweise selbst die geringste Chance auf einen Erfolg der Angreifer leicht ausschalten können. Unkontrollierte SQL-Injection-Angriffe können Ihrem Webserver schweren Schaden zufügen.

Was eine SQL-Injektion ist und wie sie funktioniert

SQL-Injection ist eine gängige Methode zum Hacken von Websites und Software, auf denen Datenbanken (DBs) laufen. Der Kern der Methode besteht darin, beliebigen SQL-Code einzuschleusen, der es dem Hacker schließlich ermöglicht, auf verschiedene Weise mit den Datenbankdaten zu interagieren:

  • den Inhalt lesen;
  • Daten löschen;
  • neue Daten hinzufügen.

Darüber hinaus kann ein Angreifer in einigen Fällen Zugang zum Lesen und Schreiben lokaler Dateien auf dem Server erhalten, beliebige Befehle ausführen, usw.

Dies geschieht auf folgende Weise. Die meisten Websites verfügen über Datenbanken, in denen alle Informationen gespeichert sind. Wenn ein Besucher versucht, eine Seite zu laden, wird eine Anfrage an die Datenbank gesendet. Das wäre auch in Ordnung, aber der Nutzer kann die Abfrage ändern – beim Verfassen eines Kommentars, während einer Suche oder auch nur beim Wechsel von einer Seite zur anderen. Diese Abfragen sind eine gute Gelegenheit für SQL-Injection. Auslösen einer Aktion, die vom Ersteller des Skripts nicht beabsichtigt war. Schauen wir uns ein Beispiel an.

Die Ehefrau hinterlässt einen Zettel auf dem Küchentisch, auf dem sie ihrem Mann bittet, dem Nikolaus etwas Bargeld zu geben. Eine mögliche SQL-Abfrage könnte wie folgt aussehen:

NIMM 10 EURO AUS DEINEM Geldbeutel UND LEGE SIE AUF DEN TISCH FÃœR Nikolaus 

Nachdem sie dies getan hatte, ließ die Frau den Zettel auf dem Tisch liegen und ging zur Arbeit. Mascha, Nikolais Schwester, wachte auf, sah den Zettel und fügte ein paar Worte in ähnlicher Handschrift hinzu:

NIMM 10 EURO AUS DEINEM Geldbeutel UND LEGE SIE AUF DEN TISCH FÃœR Nikolaus ODER Maria

Als ihr Mann aufwachte, dachte er sofort, dass beide Kinder wussten, wofür das Geld bestimmt war. Als er Mascha sah, sagte er ihr, das Geld liege auf dem Tisch – sie solle es nehmen.

Mascha hat sich zu Unrecht durchgesetzt, aber am Ende hat sie das Geld und Nikolaus hat nichts. Dies ist ein einfaches Beispiel für eine SQL-Injektion, in einfachen Worten.

Betrachten wir nun ein realistischeres Beispiel. So sieht eine Standard-ID-Abfrage in einer Suche aus:

SELECT id,title,content FROM posts WHERE title LIKE '%Benutzers_Anfrage%'

Stellen wir uns nun aber vor, dass der Benutzer statt der Standardschlüsselwörter die folgende Kombination eingibt:

1%'; DROP TABLE posts LIKE '%;

Das Ergebnis wird eine praktikable Abfrage sein, die der Datenbankentwickler nicht vorhersehen konnte:

SELECT id,title,content FROM posts WHERE title LIKE '%1%'; DROP TABLE posts LIKE '%%'

Dies kann mit jeder Anfrage funktionieren, die die Eingabe von Benutzerdaten beinhaltet - vorausgesetzt, die Entwickler oder Sicherheitsspezialisten haben nicht die notwendigen Sicherheitsmechanismen vorgesehen. In diesem Fall genügt es, alle Anführungszeichen in Benutzeranfragen zu entfernen, um das Problem zu lösen. Im Folgenden werden die wichtigsten Möglichkeiten zum Schutz vor SQL-Injection vorgestellt.

schutz vor sql-injection

Schutz Ihrer Website vor SQL-Injection auf der Ebene des Softwarecodes

Bei Verwendung der Programmiersprache PHP können Anführungszeichen mit diesen Funktionen vermieden werden:

  • mysql_real_escape_string;
  • mysqli_real_escape_string.

Solange jede in den Datenbankabfragen verwendete Variable gefiltert wird, gibt es definitiv kein Problem. Wichtig ist nur, dass die Filterung auf der Ebene des CMS oder des Programmcodes erfolgt.

Das Problem ist, dass die Erstellung unsicherer Datenbankabfragen viel weniger Zeit in Anspruch nimmt als die Erstellung sicherer Abfragen mit Filterung. Aus diesem Grund sind viele Websites anfällig.

Konfigurieren des Schutzes für einen Webserver

Wenn Sie den Code nicht verfeinern können, können Sie zu Beginn des Skripts alle REQUEST-Werte herausfiltern. Verwenden Sie dazu den folgenden Code:

if (!function_exists("clean")) {
if (get_magic_quotes_gpc()) {
function magicquotes_Stripslashes(&$value, $key) {
$value = stripslashes($value);
}
$gpc = array(&$_COOKIE, &$_REQUEST);
array_walk_recursive($gpc, 'magicquotes_Stripslashes');
}
function clean(&$value, $key) {
//diese Funktion bricht alle Anführungszeichen ab.
$value = mysql_real_escape_string($value);
}
}
$req = array(&$_REQUEST);

array_walk_recursive($req, 'clean');

Bei Verwendung von PHP 7 sollte die Funktion mysqli_real_escape_string verwendet werden, da die mysql-Erweiterung ab dieser Version entfernt wurde. Die Anführungszeichen werden mit der Funktion clean und dem gesamten nachstehenden Code ausgeblendet.

Als Nächstes sollten einige Regeln zum Schutz des Webservers in den Serverbereich eingefügt werden. Hier ist ein Beispiel für Nginx-Benutzer:

set $block_sql_injections 0;
if ($query_string ~ "union.*select.*\(") {
set $block_sql_injections 1;
}
if ($query_string ~ "union.*all.*select.*") {
set $block_sql_injections 1;
}
if ($query_string ~ "concat.*\(") {
set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
return 403;

}

Auf diese Weise lassen sich alle Abfragen herausfiltern, die die Wörter select und concat mit Anführungszeichen enthalten. Dies ist ein sicheres Zeichen dafür, dass eine SQL-Injection versucht wird, und alle derartigen Anfragen sollten blockiert werden.

Es ist auch möglich, verdächtige Adressen auf der Ebene des Apache-Webservers zu blockieren. Das Problem besteht darin, dass die Blockierung einiger häufig verwendeter SQL-Schlüsselwörter dazu führen kann, dass auch gewöhnliche Benutzerabfragen blockiert werden, so dass hier Vorsicht geboten ist. Wenn Sie sicher sind, dass dies notwendig ist, sollten Sie einige Zeilen in den Abschnitt VitualHost einfügen:

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

RewriteRule (.*) - [F]

Und schließlich aktivieren Sie das Modul mod_security:

sudo a2enmod mod_security

Verwenden Sie alle oben genannten Methoden in Kombination, um die höchste Effizienz beim Schutz vor SQL-Injection zu erreichen.

Aufteilung der Datenbank

Eine weitere gute Möglichkeit, die Sicherheit der Datenbank zu erhöhen, besteht darin, sie in 2-4 Teile aufzuteilen und dabei das Prinzip der geringsten Berechtigung anzuwenden. Die Idee ist, dass die Nutzer und die einzelnen Programme nur Zugang zu den Informationen haben, die sie benötigen, nicht mehr und nicht weniger.

Durch die Aufteilung der Datenbank wird diese in zwei Dateien umstrukturiert: die Server-Datenbank, die die Tabellen mit den Daten enthält, und die Client-Datenbank, in der alle anderen Objekte – Anfragen, Formulare, Berichte, Kreditkartendaten usw. – gespeichert werden. Die Trennung der Datenbank erhöht nicht nur die Sicherheit gegen SQL-Injektionen, sondern wirkt sich auch positiv auf die Leistung des Webservers aus, da nur die Daten über das Netz gesendet werden.

Einsatz fortschrittlicher Schutzsysteme

Eine weitere zuverlässige Option ist die Verwendung von Hardware-Lösungen, die auf iptables oder ipfw aufsetzen. Es gibt verschiedene Systeme zur Erkennung von Eindringlingen auf HIDS-Servern, darunter das beliebte OSSEC. Ja, diese Lösung ist schwieriger zu implementieren, aber sie ist nahezu 100 % effektiv bei der Abwehr dieser Art von Angriffen.

Resümee

Abschließend ist zu bemerken, dass es am besten ist, mehrere Methoden in Kombination anzuwenden. Dennoch gibt es keine Möglichkeit, einen 100-prozentigen Schutz gegen SQL-Injection zu garantieren – es wird immer Schwachstellen geben. Mit jeder neuen Version der PHP-Sprache verbessern die Entwickler diese, indem sie die verschiedenen Schwachstellen beseitigen. Das ist das Ende unseres Artikels, und ich danke Ihnen für Ihre Aufmerksamkeit. Einen schönen Tag noch!

Verwandte Artikel