php-resource.de

PHP/ PHP INSTALLATION (WAMP und LAMP) Tutorial: Webserver, Sicherheit ist realisierbar

Diese Facharbeit beschäftigt sich mit dem Herzstück eines Netzwerkes, dem Webserver.

|23.06.2006 | me1@ | 8808 | KAT : PHP/ PHP INSTALLATION (WAMP und LAMP) | | Kommentare 0


6

10

3.1.5. SQL Injektionen

Alle Scriptsprachen bieten die Möglichkeit, mit einer Datenbank zu interagieren. Gerade hier wird der Input von Benutzern oft benötigt. Die Abfragesprache für Datenbanken lautet SQL.

Beispiel:
Fast jede Homepage besitzt einen Passwortgeschützten Bereich, mit einem entsprechenden Formular für Benutzername und Passwort. Diese Eingaben werden mittels PHP und Werten aus der Datenbank überprüft.

Die Datenbanktabelle "benutzer_passwort":

ID

Benutzer

Passwort

1

admin

geheim

2

gast

gast22

Passend dazu folgender Code:

$abfrage = mysql_query("SELECT COUNT(ID) FROM benutzer_passwort "
"WHERE Benutzer='$user' AND Passwort='$pass'");
if (mysql_result($abfrage, 0)) { ... geheime Seite anzeigen ... }

Die erste Zeile fragt die Datenbank ab.
Die zweite Zeile überprüft die empfangenen Werte durch die Funktion "mysql_result".

Die Rückgabe von "mysql_result" ist entweder eine Null (keine Übereinstimmung) oder eine Zahl größer als Null. Bei einer Übereinstimmung wird die geheime Seite angezeigt.

Wenn sich der Admin einloggt, erhält die Datenbank vom Script folgende Anfrage:

SELECT COUNT(ID) FROM benutzer_passwort
WHERE Benutzer='admin' AND Passwort='geheim'
Dieses SQL Query wird von der Datenbank wie folgt interpretiert:

"Zeige die ID Nummern von der der Tabelle benutzer_passwort an, wo Benutzer gleich admin und wo Passwort gleich geheim ist und zähle die Ergebnisse."

Für das Eindringen in die geheime Seite würde ein Angreifer in die Felder für Benutzer und Passwort jeweils ' OR '1'='1 schreiben. Die Anfrage für die Datenbank lautet dadurch:

SELECT COUNT(ID) FROM benutzer_passwort
WHERE Benutzer='' OR '1'='1' AND Passwort='' OR '1'='1'

Dieses SQL Query wird von der Datenbank wie folgt interpretiert:
"Zeige die ID Nummern von der der Tabelle benutzer_passwort an, wo Benutzer gleich nichts ODER 1 gleich 1 und wo Passwort gleich nichts ODER 1 gleich 1 ist und zähle die Ergebnisse."

Weder Benutzer noch Passwort entsprechen dem Wert "nichts", doch eine 1 bleibt immer eine 1 - "mysql_result" liefert eine Zahl größer als Null und die geheime Seite wird angezeigt.

Das Problem ist eindeutig, zwei Anführungsstriche begrenzen einen Wert. Ist in dem Text ein weiterer Anführungsstrich, so wird dieser als begrenzendes Zeichen gewertet. Man braucht deshalb eine Möglichkeit, um jenes gefährliche Zeichen unwirksam zu machen.

Dieses Verhalten kann man verhindern, indem man vor dem Sonderzeichen einen Schrägstrich schreibt.

PHP hat hier als einzige Sprache eine intelligente Eigenschaft. Standardmäßig ist der Schalter "magic_quotes_gpc" in der "php.ini" aktiviert. So werden alle Inhalte, die PHP von GET-, POST- und Cookie- Variablen bekommt, automatisch mit Schrägstrichen versehen. Die Sonderzeichen ' , " , und das 0-Byte werden zu ' , " , und �.

Benutzt ein ungeübter PHP Programmierer diese Werte direkt in einem SQL Query, so sind sie automatisch maskiert. Werte, die von der Datenbank zurückkommen, sind hingegen nicht maskiert und können ohne weitere Umstände benutzt werden.

ASP und Perl kennen solch eine Automatisierung nicht. Hier müssen die Sonderzeichen eigenständig umgewandelt werden. Das Gefahrenpotential, vor allem in komplexen Anwendungen, ist nicht zu unterschätzen.

3.1.6. Datenbanken in Verbindung mit SQL Injektionen

MySQL unterstützt nicht die Befehle "SUBSELECT" oder "UNION", diese erweitern elegant die Möglichkeit, Daten auszuwählen. Der aus mancher Sicht schon rudimentäre SQL-Befehlssatz unterstützt zusätzlich keine multiplen Befehle. MySQL ist unfreiwillig sehr immun gegenüber SQL Injektionen, nur einfache Manipulationen wie im o.g. Beispiel werden als korrekter Syntax gewertet. Gefährlich kann der Befehl "INTO OUTFILE" werden, welcher bei falscher Vergabe der Rechte für die Datenbank, beliebige Dateien ins Dateisystem schreibt.

Im Gegensatz zu MySQL beherrscht MS SQL eine viel komplexere Grammatik. "SUBSELECT" und "UNION" sind erlaubt. Folgender Befehl würde z.B. eine völlig fremde Tabelle auslesen:

SELECT COUNT(ID) FROM benutzer_passwort
WHERE Benutzer='' UNION ALL SELECT FremdesFeld FROM FremdeTabelle --' AND Passwort=''

Die beiden Striche kennzeichnen einen Kommentar. So wird der restliche Teil mit dem störenden AND passwort='' komplett ignoriert.

Nicht weniger gefährlich sind Multiple Statements. Mit nachfolgenden Befehl würde zum Beispiel die komplette Tabelle mit allen Einträgen gelöscht werden:

SELECT COUNT(ID) FROM benutzer_passwort
WHERE Benutzer='' UNION ALL SELECT FremdesFeld FROM FremdeTabelle --' AND Passwort=''

Sehr vielfältig, aber umso gefährlicher, verhalten sich die "default stored procedures". Stored Procedures sind Makros oder ganze Programme für eine Datenbank. MS SQL hat standardmäßig schon viele SPs an Board - auch wenn diese normalerweise vielleicht nie benutzt werden. Mit der MS SQL Datenbank würde dieses Query funktionieren:

SELECT COUNT(ID) FROM benutzer_passwort
WHERE Benutzer='' EXEC master.dbo.xp_cmdshell 'dir *.* > c:liste.txt' --' AND Passwort=''

Die SP "xp_cmdshell" erlaubt es, jeden beliebigen Systembefehl auszuführen. In diesem Beispiel wird eine Verzeichnisliste in die entsprechende Datei geschrieben. Der zerstörerischen Kreativität eines Angreifers sind hier kaum Grenzen gesetzt.

Auch die meisten anderen Datenbanken, wie Oracle, IBM DB2 und PostgreSQL unterstützen weitgehend den ANSI SQL/92 Standard und bieten somit viele Angriffspunkte für SQL Injektionen. Eine Illustration hierzu befindet sich im Kapitel 4.2.

3.1.7. Fazit

Im Zusammenhang mit Computersicherheit kommt man oft mit zwei Philosophien in Berührung. Bisher wurde das Sicherheitskonzept "Alles erlauben, was nicht ausdrücklich verboten ist." beschrieben, was zur Folge hat, dass man in einer Anhäufung von Regeln das Ziel verlieren kann. In Konkurrenz dazu existiert eine weitere grundsätzliche Auffassung: "Alles verbieten, was nicht ausdrücklich erlaubt ist."

Für das Beispiel mit dem Systembefehl könnte eine Liste mit erlaubten Dateinamen, denen eine eindeutige Nummer zugeordnet ist, eine Vereinfachung darstellen. Verpackte Dateien werden nur mit Hilfe ihrer Nummer heruntergeladen. Der anfängliche Mehraufwand rentiert sich schnell, denn mit Hilfe dieser Liste können nachträglich bestimmten Benutzern besondere Rechte zugewiesen werden.

Navigation -> Seitenanzahl : (10)

  «  1 2 3 4 5 6 7 8 9 10  » 
Kommentare zum Tutorial
Tutorial kommentieren
 
Über den Autor
me1@

me1@

Status
Premium Mitglied

Beruf
Unbekannt

Mitglied seit:
30.04.2009

letzte Aktivität
04.06.2009

 

Tutorial bewerten

Hat Ihnen dieses Tutorial gefallen? Dann bewerten Sie es jetzt! Fünf Sterne bedeutet "Sehr gut", ein Stern "Unzureichend".



 

aktuelle Artikel

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Neu | Berni

Wissensbestand in Unternehmen

Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Neu | Berni