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

1235.2 Auffinden von SQL-Injection-Möglichkeiten
display_errors=off
Auf vielen Produktionssystemen ist das Anzeigen von Fehlern
ausgeschaltet. Das geschieht mit der
php.ini-Konfigurationsdirektive
display_errors=off. Hat man keinen Zugriff auf die php.ini, kann man
eine Änderung der Konfiguration auch über die PHP-Funktion
ini_set() einrichten.
Dies wird auch von einigen Security-Experten als eine der Lösungen
für SQL-Injection angesehen. Das ist aber nicht richtig, denn die SQL-
Injection-Möglichkeit besteht weiterhin. SQL-Injection basiert darauf,
dass durch manipulierte Queries die Anwendung verschiedenartig rea-
giert. Die verschiedenen Reaktionen drücken sich meist durch Fehler-
meldungen aus. Das Unterdrücken der Fehlermeldungen ist eine wei-
tere Implementierung des Ansatzes »Security by Obscurity«, der sich
in der Vergangenheit als nicht wirksam herausgestellt hat. Dieser
Ansatz geht davon aus, dass SQL-Injection nur mit einer Ausgabe
einer Fehlermeldung funktionieren kann. Unter dem Begriff »Blind
SQL-Injection« gibt es einen anderen Ansatz, der ohne jegliche Fehler-
meldungen auskommt. Dieser Ansatz interpretiert das Verhalten des
Servers und der Applikation ohne Zuhilfenahme einer Fehlermeldung.
5.2 Auffinden von SQL-Injection-Möglichkeiten
$_SERVER['HTTP_USER _
AGENT'] ändern
Um eine Applikation mittels einer SQL-Injection anzugreifen, muss
man einen Parameter finden, der an eine Datenbank übergeben und
nicht korrekt validiert wird. Dies kann per URL-, per Formular- oder
als Cookie-Parameter passieren. Aber auch die SERVER-Variablen in
PHP werden teilweise durch den Client gefüllt und sind somit änder-
bar. Ein Beispiel hier ist
$_SERVER['HTTP_USER_AGENT']. Dieser Parame-
ter kann mithilfe von Browser-Plugins geändert werden.
Felder in einer SQL-Datenbank können drei verschiedene Typen
haben: Number, String oder Date. Für eine SQL-Injection ist es wich-
tig, diese Typen von Parametern zu identifizieren. In einem SQL-State-
ment werden diese drei Typen unterschiedlich behandelt.
Datentypen von
Tabellenfeldern
Ein Typ Number (INT, FLOAT usw.) wird meist ohne »'« oder
»
"« in einer SQL-Query verwendet. Ein String (VARCHAR, TEXT
usw.) wird immer mit »
'« oder »"« im SQL-Statement umschlossen.
Das sind wichtige Informationen, die wir für eine erfolgreiche SQL-
Injection benötigen. Ein Typ Date wird entweder als String oder als
Number an eine SQL-Datenbank übergeben, je nachdem, in welchem
#3/=966>/8.3=:6+C*/<<9<=+?0900 =/>D/8?7/38/?81/A966>/?=1+,/@98
/26/<7/6.?81/8D?@/<238./<8
5 SQL-Injection 124
Format dieser vorliegt. Ein Unix-Timestamp ist vom Typ Number, ein
Format-String wie 'YYYY-MM-DD HH:MM:SS' ist ein String.
5.2.1 GET-Parameter
GET-Parameter sind Daten, die an die URL angehängt oder durch ein
Formular mit dem Attribut
method="GET" an eine Applikation überge-
ben werden. Durch Verändern eines dieser Parameter kann überprüft
werden, ob bei diesem Parameter eine SQL-Injection möglich ist.
Wird ein Formular über die GET-Methode an den Server übermit-
telt, kann jedes Formularfeld mit seinem Namen auch an die URL
angehängt werden.
SQL-Injection über URL
durchführen
Mit
/index.php?formularfeld_name=value
kann auch hier einfach eine SQL-Injection-Schwachstelle identifiziert
werden. Ändert man nun einen dieser Parameter, so können Effekte
auftreten, die der Entwickler der Applikation nicht bedacht hat und
dementsprechend unbehandelt lässt.
Durch Anhängen der Sonderzeichen »
'« und »"« an den Parame-
ter werden ungewollte Effekte wie z.B. Fehlermeldungen in der Appli-
kation hervorgerufen. Beispiel:
index.php?artnr=1000'"
Diese Sonderzeichen beenden in einem SQL-Statement einen String.
Bei falscher Validierung treten hier Schwachstellen ans Tageslicht.
Sehen wir uns den dazugehörigen PHP-Code an:
<?php
...
mysql_query ('SELECT name,beschreibung,preis FROM artikel WHERE
artnr='.$_GET['artnr']);
...
?>
Unsichere SQL-Abfrage
Wird hier nun der manipulierte Parameter eingefügt, wird aus dem
Query-String folgender:
SELECT name,beschreibung,preis FROM atrikel WHERE artnr=1000'"
Aufgelöste SQL-Query
Wir erhalten dann einen Syntaxfehler der Datenbank:
Fehlermeldung der
Datenbank
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
''' at line xxx
1255.2 Auffinden von SQL-Injection-Möglichkeiten
Fehlermeldung von
MySQL
Diese Ausgabe erhalten wir aber nur nach dem Aufruf der PHP-Funk-
tion
mysql_error(). Eine andere, weit häufigere Fehlermeldung bzw.
Warnung ist:
Warning: mysql_fetch_assoc(): supplied argument is not a valid
MySQL result resource in /srv/www/htdocs/post.php on line xxx
Nun wissen wir anhand dieser Fehlermeldungen, um welche Daten-
bank es sich handelt. Ob dieser Parameter nicht richtig validiert wird,
kann man hier nicht hundertprozentig sagen. Es könnte auch sein, dass
eine Validierung stattfindet, aber nur nicht korrekt in die SQL-Abfrage
übernommen wird.
Kommentarzeichen
in SQL
Weitere mögliche Sonderzeichen sind »--« oder »/*«, die
Kommentarzeichen für verschiedene Datenbanksysteme sind. »--« ist
das Kommentarzeichen für MS-SQL-Server und Oracle-Datenbank-
Server. »
/*« ist eigentlich ein mehrzeiliger Kommentar für einen
MySQL-Server, der mit »
*/« wieder abgeschlossen werden muss. Fehlt
dieser Abschluß, betrachtet MySQL den Kommentar am Ende des
Queries als abgeschlossen und meldet keinen Fehler. »
;« ist bei allen
Datenbanken ein Trennzeichen für eine Multi-Query. Die PHP-Funk-
tion
mysql_query() lässt allerdings nur eine SQL-Abfrage zu.
mysqli_multi_query()Erst mit der Funktion mysqli_multi_query(), der MySQLi-Exten-
sion, sind Mehrfach-Abfragen möglich. Andere Datenbanksysteme
lassen aber multiple SQL-Abfragen ohne spezielle Funktionen zu.
5.2.2 POST-Parameter
POST-Parameter sind Parameter, die aus einem HTML-Formular an
einen Server übermittelt werden. Die Manipulation ist in diesem Fall
nicht so einfach wie bei GET-Parametern, aber unmöglich ist sie nicht.
Durch Speicherung des Formulars auf der lokalen Festplatte und
anschließendem Ergänzen des
action-Attributs des Formular-Tags um
die URL lassen sich auch hier die Formularparameter manipulieren.
Aus
<form action="/verarbeite.php" method="post">
wird
<form action="http://www.php-sicherheit.de/verarbeite.php"
method="post">.
36>/<8 #3/ .+= #/7359698 +?= +66/8 +<+7/>/<8 2/<+?= ?7 ?81/A966>/
/2<0+-2,0<+1/8D?@/<238./<8

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