a. Allgemeines
• SQL-Injection (dt. SQL-Einschleusung) bezeichnet das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL-Datenbanken, die durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entsteht.
• Der Angreifer versucht dabei, über die Anwendung, die den Zugriff auf die Datenbank bereitstellt, eigene Datenbankbefehle einzuschleusen. Sein Ziel ist es, Daten auszuspähen, in seinem Sinne zu verändern, die Kontrolle über den Server zu erhalten oder einfach größtmöglichen Schaden anzurichten.
• Das heißt, dass SQL Abfragen Zugriffskontrollen hinters Licht führen, und dadurch Standard Authentifizierungs- und Authorisationschecks umgehen können, und manchmal können SQL Abfragen sogar Zugriff zu Kommandos auf Betriebssystemebene erlauben.
• Sie sind möglich, wenn Daten wie Benutzereingaben in Web-Formularen in den SQL-Interpreter gelangen und Zeichen enthalten, die für den Interpreter Sonderfunktionen besitzen:
- ==> Backslash \
- ==> Anführungszeichen „“
- ==> Apostroph ’
- ==> Semikolon ; etc.
b. Vorgang der SQL-Injection
• Der „Hacker“ benutzt eine Standard-Datenbankanfrage oder ein Formular und merkt sich dabei den übergebenen Syntax
==> http://webserver/cgi-bin/find.cgi?ID=42
• Dieser wird im SQL-Interpreter als entsprechende Befehlskette umgewandelt
==> SELECT author, subject, text FROM artikel WHERE ID=42;
• Der „Hacker“ muss sich in der SQL-Syntax Schreibweise auskennen um dem Befehl eigene Syntax-Befehle anhängen zu können.
• Um bei der oben angesprochenen Datenbank Daten ausspähen zu können, könnte der „Hacker“ folgendes schreiben:
==> http://webserver/cgi-bin/find.cgi?ID=42+UNION+SELECT+'Datenbank',+'Tabelle',+'Spalte'+ UNION+SELECT+table_schema,+table_name,+column_name+FROM+information_schema.columns+ WHERE+NOT+table_schema='information_schema';#%20
• Das Beispiel zeigt, wie bei einer Abfrage mit 3 Ergebnisspalten die Struktur sämtlicher zugreifbarer Datenbanken in Erfahrung gebracht werden kann.
• Mit zeitbasierten Angriffen (also jene, die im richtigen Moment passieren), ist es dem Angreifer auch möglich sich für die Datenbank einen Administratorenstatus anzulegen. Hierzu muss er während der eigentliche SuperUser eingelogged ist eine SQL-Injection mit einem „root“ Befehl einschleusen. Da der SuperUser vom System immer mit der Hierarchie → „Root“ versehen wird.
==> Wurde ein System infiltriert, kann man sich über den Server-Traffic die Seitenzugriffe ansehen. Ist ein Traffic sehr auffällig (Normale Monatszugriffe im Schnitt 10.000 und plötzlich sieht man in einem Monat 100.000 oder 1.000.000 Zugriffe) ist es anzunehmen, das ein Zugriffs-Algorithmus in Verbindung mit einer Root-SQL-Injection genutzt wurde um im richtigen Moment (wenn der SuperUser eingelogged ist) das System mit Administratorenrechten zu infiltrieren.
c. Gegenmaßnahmen
• Bei der Programmierung von HTML/PHP Formularen sollten zwingend Inhaltsabfragen eingebaut werden, bei denen aus der Benutzereingabe die SQL-Syntax-Befehlszeichen ( \ “ ’ + ; etc.) entfernt bzw. maskiert werden.
• Bei den Inhaltsübergaben sollten Datentypabfragen eingebaut werden, damit wenn möglich der Input auch immer dem erwarteten Datentyp entspricht.
• Bauen Sie Codefragmente in den PHP Code ein, der verhindert, dass Fehlermeldungen beim Client angezeigt werden, diese geben dem Hacker Informationen über das Datenbankschema.
• Verwendung von verschlüsselten Passwortfeldern für alle Nutzer der Datenbank und akribisches Achten auf die Nutzerverwaltung
• Legen sie einen individualisierten „SuperUser“ an und loggen sie sich ausschließlich mit diesem „Account“ ein, damit der „Root“-SU nie genutzt wird.
• Verwendung von WAF (Web-Application-Firewall)
==> Eine Web Application Firewall (WAF) oder Web Shield ist ein Verfahren, das Webanwendungen vor Angriffen über das Hypertext Transfer Protocol (HTTP) schützen soll. Es stellt damit einen Spezialfall einer Application-Level-Firewall (ALF) oder eines Application-Level-Gateways (ALG) dar. • Verwendung von „stored procedures“
==> Es ist eine Funktion in Datenbankmanagementsystemen, mit der ganze Abläufe von Anweisungen vom Datenbank-Client aufgerufen werden können. ==> Sie ist somit ein eigenständiger Befehl, der eine Abfolge gespeicherter Befehle ausführt.
==> Gespeicherte Prozeduren tragen dazu bei, die Sicherheit einer Anwendung stark zu erhöhen. Da der Client in der Regel keine DELETE-, UPDATE- oder INSERT-Zugriffsrechte mehr benötigt, ist es Angreifern nicht möglich, selbst Datenbanken zu manipulieren (z. B. durch SQL-Injection).
• Verwendung von „Prepared Statements“ mit gebundenen Variabeln
==> Dabei werden die Daten als Parameter an einen bereits kompilierten Befehl übergeben. Die Daten werden somit nicht interpretiert und eine SQL-Injection verhindert.
Kommentare
Prima! Herzlichen Dank!