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

533.3 Angriffsszenarien und Lösungen
Eingabefelder darunter den Proxy mit der Adresse »127.0.0.1« und
dem Port »8008« eintragen.
Bei jeder Anfrage an einen Server wird ein Fenster geöffnet, das
sämtliche Parameter anzeigt. Unter dem Reiter »Parsed« werden alle
empfangenen Daten in Eingabefeldern angezeigt, können dort verän-
dert und weiter an den Server geschickt werden.
Dies ist die komfortabelste Methode, Parameter zu verändern oder
Header zu manipulieren.
3.3 Angriffsszenarien und Lösungen
In den folgenden Abschnitten werden einige Angriffsszenarien aufge-
zeigt und Lösungen zur Vermeidung dieser Angriffe vorgestellt. Der
Angriffsklasse SQL-Injection, die auch auf Parametermanipulation
basiert, wurde in diesem Buch ein eigenes Kapitel (Kapitel 5) gewidmet.
Wenn Sie die hier aufgezeigten Lösungen an der richtigen Stelle
und konsequent in Ihrem Programmcode implementieren, haben
Angreifer und Security-Tester keine Chance, Ihre Applikation erfolg-
reich zu attackieren.
3.3.1 Fehlererzeugung
Wie erzeuge ich Fehler?
Wie im Kapitel 2 »Informationsgewinnung« schon gesehen, geben
Fehlermeldungen Auskunft über installierte Dienste und Komponen-
ten auf dem Webserver. Diese Komponenten können durch Schwach-
stellen angreifbar sein. Fehlermeldungen können aber auch Auskünfte
über die Programmstruktur oder verwendete Befehle geben.
http://www.php-sicherheit.de/index.php?page=page1.php
Warning: main(page1.php) [function.main]: failed to open stream: No
such file or directory in /srv/www/htdocs/index.php on line 2
Warning: main() [function.include]: Failed opening 'page1.php' for
inclusion (include_path='.:/usr/local/lib/php') in
/srv/www/htdocs/index.php on line 2
Beispiel für Fehlermeldung
(include und
mysql_query)
Diesen beiden Fehlermeldungen liegt ein ungesicherter Include-Befehl
zugrunde, der über die URL-Parameter eine Datei nachlädt. Die Datei
page1.php existiert auf dem Server nicht, und PHP meldet den
entsprechenden Fehler.
Vorsicht bei Weitergabe
von Werten an eine
Include-Anweisung
Dieser URL-Parameter wird ohne Prüfung an die Include-Anwei-
sung übergeben. Folgender Programmcode wird hier möglicherweise
verwendet:
3 Parametermanipulation54
<?php
include ($_GET['page']);
?>
Include ohne jegliche
Überprüfung
Durch Anhängen einer beliebigen Datei, z.B. einer Systemdatei, an den
URL-Parameter
page kann diese Datei ausgelesen werden, wenn der
Webserver die entsprechenden Rechte dazu hat.
http://www.php-sicherheit.de/index.php?page=/etc/passwd
open_basedir
Ist die Konfigurationsoption open_basedir nicht gesetzt, können in die-
sen Fällen alle Dateien auf dem Webserver ausgelesen werden, für die
der Webserver Leserechte hat.
<?php
$file = require($_GET['file'],'r');
?>
Beispiel für ungesicherte
require()-Funktion
Ist die Konfigurationsoption open_basedir gesetzt, können nur Dateien
unterhalb des angegebenen Verzeichnisses gelesen werden. Aber Vor-
sicht, auch in diesem Verzeichnis können sich Dateien mit sensiblem
Inhalt befinden, z.B. Dateien mit Datenbankverbindungsdaten.
Datenbanken angreifen
http://www.php-sicherheit.de/index.php?id='
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 1
Bei dieser Fehlermeldung, die von mysql_query() erzeugt wurde, ist zu
erkennen, dass einer SQL-Abfrage ungeprüfte Variablen übergeben
wurden und der Inhalt dieser Variablen dann direkt an die Datenbank
ging. Dies kann zum Auslesen, Ändern oder sogar zur Löschung von
Daten in der Datenbank führen.
<?php
$res = mysql_query('SELECT id,name FROM users WHERE
id='.$_GET['id']);
?>
Beispiel für eine
SQL-Injection
Im Kapitel 5 »SQL-Injection« werden wir Ihnen diese Angriffsklasse
genauer erklären und weitere Angriffsarten aufzeigen.
Fehlermeldungen können nicht nur Hinweise auf installierte Dienste
ausgeben, sondern geben auch über die Programmstruktur Auskunft.
display_errors = off
Eine Fehlerausgabe auf einem produktiven System sollte vermie-
den werden. Dafür stellt PHP eine Konfigurationsoption zur Verfü-
gung.
display_errors = off schaltet die direkte Fehlerausgabe aus. In
38#/>D/8@989:/8*,+=/.3<=3-2/<>./8#/<@/<D?=I>D63-2+,
553.3 Angriffsszenarien und Lösungen
Verbindung mit log_errors = /pfad/zur/logdatei können Fehler, die im
produktiven Betrieb auftreten, in eine Datei geloggt werden. Diese
Datei sollte in regelmäßigen Abständen überprüft und die Fehler berei-
nigt werden.
Eine selbst implementierte Fehlerbehandlung kann helfen, die
Übersicht über die Fehler und die Log-Dateien zu behalten und gegebe-
nenfalls E-Mails an den Entwickler zu verschicken. Dabei können
auch Fehlermeldungen ausgegeben werden, die aber nicht zu viele
Informationen enthalten sollten. Auf keinen Fall sollte man den Fehler
begehen, komplette SQL-Anfragen in den Fehlermeldungen auszuge-
ben. Eine Fehlermeldung mit einer Fehlernummer und einer kurzen
Beschreibung ist vollkommen ausreichend. Für die Entwicklung wird
empfohlen, das Error-Reporting in der
php.ini auf E_ALL zu setzen, um
alle eventuellen Fehler schon im Vorfeld zu erkennen und schließlich
zu beseitigen.
3.3.2 HTTP Response Splitting
Was ist HTTP Response
Splitting?
HTTP Response Splitting ist eine relativ neue Angriffsklasse. Sie ermög-
licht es, Webseiten mithilfe von gefälschten Anfragen zu verunstalten.
Dabei nimmt der Angreifer nicht direkt auf den Webserver Einfluss,
sondern manipuliert Systeme, die dem Webserver vorgeschaltet sind.
Ein Proxy-Server, ein Cache-Server, sogar der Browser selbst sind sol-
che vorgeschalteten Systeme. Des Weiteren sind Cross-Site-Scripting-
oder Phishing-Attacken über HTTP Response Splitting möglich.
Alle diese Angriffe funktionieren unabhängig davon, welcher
Browser oder welcher Webserver verwendet werden. Es muss nur eine
Schwachstelle in einer Applikation vorhanden sein. Diese Applikation
muss lediglich einen ungenügend geprüften Parameter mit den Sonder-
zeichen
\r (CR) und \n (LF) an die header()-Funktion von PHP weiter-
geben. CR und LF sind »Carriage Return« und »Line Feed«, die Son-
derzeichen für den Zeilenumbruch. Die URL-codierte Schreibweise ist
%0d für \r und %0a für \n.
/index.php?url=%0d%0a
Anhängen von \r\n an
einen URL-Parameter
In einen Angriff mittels HTTP Response Splitting sind immer drei Par-
teien mit eingebunden:
Grundlegende Techniken
Der Webserver, auf dem die angreifbare Applikation läuft.
Das Ziel, das mit dem Webserver im Auftrag des Angreifers
kommuniziert. Dies kann ein Proxy-Server, Cache-Server oder ein
Browser-Cache sein.
Der Angreifer. Dieser stößt den Angriff an.

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