O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

121
5 SQL-Injection
SQL-Injection ist eine der gefährlichsten Angriffsarten auf
Webserver und Webanwendungen. In diesem Kapitel wird
erklärt, wie ein SQL-Injection-Angriff durchgeführt wird und
wie man als Entwickler einen solchen Angriff verhindern kann.
5.1 Grundlagen
In den letzten Jahren wurden SQL-Injections eine immer beliebtere
Attacke, wie man auch an der steigenden Zahl der Advisories auf den
einschlägigen Security-Mailinglisten erkennen kann. Die Anzahl der
datenbankbasierten Anwendungen und auch die Publikationen, wie
man solche Anwendungen angreifen kann, sind gestiegen. Es wurden
immer mehr Exploits für SQL-Injection-Angriffe in Umlauf gebracht,
und auch die Zahl der automatischen Werkzeuge, die prüfen, ob eine
Anwendung verwundbar ist, ist in die Höhe geschnellt. Ein Exploit ist
ein Schadprogramm, das Schwachstellen in einer Applikation automa-
tisiert ausnutzen kann. Dies hat natürlich zu den verschiedensten
Angriffen auf verbreitete Applikationen geführt, die immer weiter
optimiert wurden.
Aber nicht nur die Zahl der Angriffe ist gestiegen, sondern auch
die Anzahl der Verteidigungsmöglichkeiten.
Das Problem:
Ungeprüfte Parameter
Viele Anwendungen arbeiten mit einer Datenbank zusammen, in
die sie Werte einfügen, die oft aus Benutzereingaben stammen. Aus
diesen Daten erzeugt die Webanwendung dann SQL-Statements und
schickt sie an die Datenbank. Aber auch URL-Parameter werden in
dynamischen Anwendungen an eine Datenbank weitergegeben, z.B.
die ID einer Seite oder die Artikelnummer eines Produktes in einem
Onlineshop. Das Problem, das zu einer SQL-Injection führt, besteht
darin, dass Eingaben per Parameter (GET, POST, COOKIE usw.)
ungeprüft in ein SQL-Statement eingefügt werden. Das kann zu einem
5 SQL-Injection 122
völlig anderen Statement führen, als der Anwendungsentwickler beab-
sichtigt hat, und vom Auslesen von fremden Daten bis hin zur
Löschung einer ganzen Datenbank führen.
"SELECT name,vorname FROM users WHERE id=".$_GET['id'];
Dieser PHP-Code übernimmt ungeprüft die URL-Variable id in ein
SQL-Statement. Die ungefährlichste Angriffsmöglichkeit ist das
Ändern dieser ID in der URL. Bei Datenbanksystemen, die Multi-Que-
ries, also mehrere durch »;« getrennte SQL-Statements, erlauben, kann
das auch zur Löschung von Daten führen.
SELECT * FROM users WHERE ID=1; DELETE FROM users;
Hier wird ein Lösch-Statement an eine SQL-Abfrage angefügt, die
normalerweise nur einen Satz aus der Datenbank ausliest.
Fehlermeldungen
auswerten
Um Informationen über SQL-Abfragen zu erhalten, sind
Fehlermeldungen eine große Hilfe. Diese geben Aufschluss über das
verwendete SQL-Statement.
Ungültige SQL-Abfrage:
SELECT post.postid, post.threadid
FROM post AS post
INNER JOIN thread AS thread ON(thread.threadid = post.threadid)
LEFT JOIN deletionlog AS delpost ON(delpost.primaryid = post.postid
AND delpost.type = 'post') WHERE (postid IN() OR postid IN(42, 260,
264, 272, 347, 485 );
mysql error: You have an error in your SQL syntax. Check the manual
that corresponds to your MySQL server version for the right syntax
to use near
') OR postid IN(42, 260, 264, 272, 347, 485)
mysql error number: 1064
Sehr ausführliche MySQL-
Fehlermeldung
Microsoft OLE DB Provider for SQL Server error '80040e14'
Unclosed quotation mark before the character string '''.
/admin/Login.php, line 166
Fehlermeldung eines
Microsoft-SQL-Servers
Hier werden Details oder das komplette SQL-Statement auf dem Bild-
schirm ausgegeben. Das ist in der Entwicklungsphase sicher nützlich,
auf produktiven Systemen ist das unnötig. Auf produktiven Systemen
würden Informationen an einen Benutzer oder Angreifer herausgege-
ben, die im Endeffekt nur für den Entwickler interessant sind. Hier
sollte der Administrator sämtliche Fehlerausgaben unterdrücken und
stattdessen fehlgeschlagene Queries in eine Log-Datei schreiben.
Dank der ausführlichen Fehlermeldungen kann der Angreifer seine
Attacke auf dieses SQL-Statement anpassen, bis der Angriff funktio-
niert.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required