Home » Home » Informationen » Glossar » SQL Injection
SQL Injection
SQL-Injektion (engl. SQL Injection) 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 dabei Daten in seinem Sinne zu verändern oder Kontrolle über den Server zu erhalten.
Ursache
Für SQL-Injektionen nutzbare Fehler treten auf, wenn eine Applikation Benutzereingaben als Teil von SQL-Abfragen an den Server weiterreicht, ohne die vom Benutzer eingegebenen Werte ausreichend zu prüfen und etwaig enthaltene Metazeichen zu maskieren, um ihnen so die Sonderfunktion zu nehmen. Metazeichen in SQL sind zum Beispiel der umgekehrte Schrägstrich, das Anführungszeichen, der Apostroph und das Semikolon. Diese Zeichen können durch Voranstellen des Maskierungszeichens, einem umgekehrten Schrägstrich, die Funktion als Metazeichen entzogen werden, sodass es als normales Textzeichen gewertet wird. Dieser Vorgang wird auch „Escapen“ genannt.
Oft sind solche Lücken in CGI-Scripten und auch in Programmen zu finden, die Daten wie Webseiteninhalte oder E-Mails in SQL-Datenbanken eintragen. Nimmt ein solches Programm die Maskierung nicht korrekt vor, kann ein Angreifer durch den gezielten Einsatz von Funktionszeichen weitere SQL-Befehle einschleusen oder die Abfragen so manipulieren, dass zusätzliche Daten verändert oder ausgegeben werden. In einigen Fällen besteht auch die Möglichkeit, Zugriff auf eine Shell zu erhalten, was im Regelfall die Möglichkeit zur Kompromittierung des gesamten Servers bedeutet.
Stored Procedures sind in diesem Zusammenhang sicherer. Dabei werden die Benutzereingaben in einem Programm an die Stored Procedures übergeben. Erst dort wird die SQL-Abfrage erzeugt und ausgeführt, wodurch die Injektion weiterer SQL-Befehle in Benutzereingaben verhindert wird.
Gegenmassnahmen
Generell ist die Webanwendung für die korrekte Prüfung der Eingabedaten verantwortlich, so dass vor allem die Metazeichen betreffenden Datenbanksystems entsprechend zu maskiert sind, die für Ausnutzung dieser Sicherheitslücke verantwortlich sind. Weitergehend können auch die Eingabedaten auf die Eigenschaften erwarteten Werte geprüft werden- So bestehen deutsche Postleitzahlen beispielsweise nur aus Zahlen. Geeignete Schutzmaßnahmen sind in erster Linie dort zu implementieren.
Doch auch aufseiten des Datenbankservers lassen sich Sicherheitsvorkehrungen treffen. So sollten die Benutzer, mit denen sich eine Webanwendung beim Datenbankserver authentifiziert, nur die Privilegen besitzen, die er auch tatsächlich benötigt. So können zumindest einige der möglichen Angriffe unwirksam werden.
Hat ein Betreiber eines Webservers keine Kontrolle über die Anwendungen kann durch Einsatz von Web Application Firewalls (WAF) zumindest teilweise verhindert werden, dass SQL-Injektion-Schwachstellen ausgenutzt werden können.
Es ist nicht schwer, bestehende Programme so umzubauen, dass SQL-Injektionen nicht mehr möglich sind. Das hauptsächliche Problem der meisten Programmierer ist fehlendes Wissen über diese Art von Angriffen. Nachfolgend einige Beispiele, um die Angriffe abzuwehren.
PHP
In PHP steht zu diesem Zweck die Funktion mysql_real_escape_string() zur Verfügung, die jedoch lediglich für eine MySQL-Verbindung benutzbar ist. Wird eine andere Datenbank benutzt, so ist diese Funktion nicht geeignet. Doch PHP hält für fast jede Datenbank eine solche Escape-Funktion bereit. Die PHP-Oracle-Funktionen besitzen jedoch beispielsweise keine Escape-Funktion, hingegen können dort Prepared Statements verwendet werden, was bei der beliebten MySQL-Datenbank erst mit den Funktionen von MySQLi möglich geworden ist.
Häufig wird aus Bequemlichkeit einfach die Konfigurationsoption
„magic_quotes_gpc“ auf „on“ gestellt, mit der von außen kommende
Benutzereingaben automatisch maskiert werden. Doch dies ist nicht
empfehlenswert. Denn manche nicht selber programmierte Scripte setzen
eigenständig Funktionen wie etwa addslashes()
oder das bereits weiter oben genannte mysql_real_escape_string() ein.
D. h. dass bereits allen relevanten Zeichen in den Benutzereingaben
durch Magic Quotes ein Backslash
vorangestellt wurde und nun durch die Escape-Funktion erneut ein
Backslash vorangestellt wird. Somit verfälscht man die Benutzereingaben
und erhält anstatt einem einfachen Anführungszeichen ein
Anführungszeichen mit vorangestelltem Backslash (\"). Auch aus Gründen der Portabilität
sollte bei der Entwicklung von Anwendungen auf diese Einstellung
verzichtet und stattdessen alle Eingaben manuell validiert und maskiert
werden, da nicht davon ausgegangen werden kann, dass auf allen Systemen
dieselben Einstellungen vorherrschen oder möglich sind.
Weitere PHP Klassen und Funktionen:
http://www.phpclasses.org/searchtag/sql+injection/by/package.html