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

5 SQL-Injection 130
5.3 Syntax einer SQL-Injection
Um eine SQL-Injection erfolgreich durchzuführen, muss man das vom
Entwickler verwendete SQL-Statement »erraten«. Dazu ist es notwen-
dig, die möglicherweise verwendeten SQL-Schlüsselwörter und Son-
derzeichen zu kennen.
5.3.1 Sonderzeichen in SQL
Wie wir bei der PHP-Funktion mysql_real_escape_string() schon gese-
hen haben, müssen einige Sonderzeichen für die Verwendung in SQL-
Statements maskiert werden. Maskiert bedeutet, dass dem Sonderzei-
chen ein Backslash vorangestellt wird. Hier eine Auflistung der zu
maskierenden Sonderzeichen:
NULL – Mit dieser NULL ist keine 0, "0" oder ein "" gemeint, sondern
einfach »Keine Daten«. Dies wird benötigt, um bei einer SQL-
Injection mit
UNION die Parameterliste mit Platzhaltern aufzufüllen
– etwa so: …
UNION SELECT ID,NULL,NULL FROM ...
\x00 – Dies ist eine hexadezimale Null und das Ende-Kennzeichen
eines Strings in der Programmiersprache C.
\r, \n – Die Sonderzeichen für einen Zeilenumbruch.
' und " – Die Begrenzungszeichen für einen String in der SQL-Syntax.
\x1a – Dieses Zeichen entspricht der Tastenkombination STRG-Z.
Hiermit können auf der Kommandozeile Befehle ausgeführt wer-
den. Das ist eine sogenannte Escape-Sequenz.
\ – Der Backslash ist das Sonderzeichen für das Auszeichnen von
hexadezimalen und textuellen Sonderzeichen, wie
\r, \t oder \n.
% – Das Prozentzeichen ist der Platzhalter für mehrere beliebige
Zeichen. Enthält ein Query eine WHERE-Klausel wie etwa
LIKE
'Pet%' werden alle Zeilen zurückgegeben, die mit Pet beginnen,
also Peter, Petra oder auch Petroleum.
() – Die runden Klammern schließen Ausdrücke ein oder fassen
diese zusammen, um Präzedenzen auszudrücken. Beispiel:
SELECT ID FROM Tabelle WHERE ((ID=0 OR ID=1) AND (Name != '' AND
Vorname NOT '') AND Ort NOT '')
Die Sonderzeichen \n, \r, \x00, \ (Backslash) und \x1a haben keinen
direkten Einfluss auf ein SQL-Statement, sondern wirken sich in Log-
Dateien aus.
Angriffe auf Log-Dateien
des SQL-Servers
MySQL kann pro SQL-Query einen Datensatz in eine Log-Datei
schreiben, falls dies so konfiguriert ist. Hier wirkt sich zum Beispiel ein
1315.3 Syntax einer SQL-Injection
\n sehr wohl aus, indem es die entsprechende Zeile in der Log-Datei
umbricht.
Die Zeichen »
'«, »"«, »%« oder der String »NULL« haben
Auswirkungen auf ein SQL-Statement und müssen deshalb auf jeden
Fall maskiert werden. Die runden Klammern »
()« können beliebig
eingesetzt werden, um Ausdrücke einzuschließen oder zusammenzu-
fassen.
5.3.2 Schlüsselwörter in SQL
Im Folgenden werden alle Schlüsselwörter vorgestellt, die im Zusam-
menhang mit einer SQL-Injection stehen:
NOT, ! – Das ist das logische NICHT. Falls ein Ausdruck TRUE ist,
gibt ein
NOT-Ausdruck das Ergebnis FALSE zurück. Beispiel: ID NOT 10
gibt
TRUE zurück, wenn die ID nicht 10 ist.
AND, && – Das logische UND. Beide Ausdrücke links und rechts von
AND müssen TRUE zurückgeben – etwa im SQL-Ausdruck ID = 10 AND
Name='Peter'
. Die ID muss 10, und der Name muss Peter sein, ansons-
ten schlägt dieses Statement fehl.
OR, || – Das logische ODER. Einer der beiden Ausdrücke links oder
rechts von
OR muss TRUE zurückgeben. Ein Beispiel wäre folgender
Ausdruck:
ID = 10 OR Name='Peter' – eine der beiden Bedingungen
muss erfüllt sein, entweder
ID=10 oder Name='Peter'.
Um ein SQL-Statement richtig zu erraten, müssen auch diese logischen
Operatoren mit einbezogen werden, denn diese können in einem State-
ment beliebig verwendet werden.
5.3.3 Einfache SQL-Injection
Wenn die SQL-Abfrage einfach ist, ist auch die SQL-Injection einfach.
Ist eine SQL-Abfrage kompliziert, dann benötigt man viele Versuche,
um eine erfolgreiche SQL-Injection durchzuführen. In beiden Fällen
sind nur einige grundlegende Dinge notwendig, um herauszufinden,
wie kompliziert die Query eigentlich ist.
SELECT-Befehle
Die einfachste SQL-Abfrage ist ein SELECT-Befehl, in dem der mani-
pulierte Parameter in der
WHERE-Klausel steht. Der Angreifer muss nur
in der Lage sein, an diese
WHERE-Klausel schädlichen Code anzufügen,
sodass diese SQL-Abfrage andere Daten zurückgibt, als sie sollte. In
66/ #98./<D/3-2/8 38 +>/8 .3/ +8 /38/ +>/8,+85 K,/<1/,/8 A/<./8
7K==/87+=53/<>A/<./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