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

232.4 PHP-Installation erkennen
Internet Information Server unter Windows hin. Linux kann nicht das
verwendete Betriebssystem sein, denn einen Internet Information Ser-
ver gibt es nur für Windows. Anhand der installierten Version des
Webservers lässt sich dann weiter auf die installierte Windows-Version
schließen; so ist beispielsweise ein Internet Information Server in der
Version 6 auf Windows NT nicht installierbar.
Sie sollten sich bei derlei Vermutungen jedoch stets der Tatsache
bewusst sein, dass es sehr einfach möglich ist, die Headerangaben so
zu fälschen, dass eine tatsächlich nicht existente Betriebssystemversion
vorgegaukelt wird – die genannten Methoden liefern Hinweise, nichts
Hieb- und Stichfestes!
2.4 PHP-Installation erkennen
Eine zuverlässige Erkennung der Skriptsprache PHP auf einem Server
ist im Gegensatz zum Webserver-Fingerprinting um einiges schwieri-
ger. Um wirklich zuverlässig feststellen zu können, ob die Skriptspra-
che PHP auf einem Webserver installiert ist, genügt es oft nicht, ein-
fach nur auf die Dateiendung zu schauen.
Dateiendung modifzieren
Um dem Angreifer nicht zu zeigen, dass auf dem Webserver ein
PHP-Interpreter installiert ist, kann die Dateiendung von
.php auf .html
oder .asp geändert werden. Dazu müssen Sie dem PHP-Interpreter in
der Webserver-Konfiguration als Dateiendung statt
.php die Endung
.html oder .asp zuordnen.
Dies geschieht dadurch, dass Sie folgende Zeile in einer
.htaccess-
Datei oder in der
httpd.conf des Apache-Webservers hinzufügen:
AddType application/x-httpd-php .html
Abb. 2–2
Ausgabe von nmap
2 Informationsgewinnung24
Der Nachteil hierbei ist, dass alle HTML-Dateien, auch statische, vom
PHP-Interpreter daraufhin geparst werden, ob sich nicht irgendwo in
der Datei PHP-Code befindet. Dies geht natürlich zulasten der Perfor-
mance des Webservers. Daher ist der Einsatz des Apache-Moduls
mod_rewrite oft die ressourcenschonendere Alternative. Eine Regel à la
RewriteRule (.*).html /$1.php [QSA]
sorgt dafür, dass jeder Aufruf für eine Datei mit der Endung .html vor
der Beantwortung durch den Webserver so umgeschrieben wird, dass
die tatsächliche Dateiendung, nämlich
.php, angefügt wird. Dieses Ver-
halten ist für die PHP-Anwendung fast vollständig transparent und
auch für den Nutzer der Anwendung nicht erkennbar.
Ähnlich wie der Webserver fügt PHP zu jeder durch ein PHP-
Skript bearbeiteten HTTP-Anfrage eigene Header hinzu, die das Vor-
handensein der Skriptsprache verraten können.
Informationen über die
PHP-Version unterdrücken
Das HTTP-Header-Feld X-Powered-By: ist ein solcher Header. Wenn
die
php.ini-Konfigurationsoption expose_php auf on steht, wird dieses
Header-Feld bei jeder Response zurück an den Client geschickt.
Möchten Sie Ihren Browser für die Analyse verwenden und haben
keine passenden Plugins für die Anzeige von HTTP-Headern, so kön-
nen Sie auch einfach eine spezielle Zeichenfolge an eine beliebige URL
anhängen, hinter der Sie ein PHP-Skript vermuten. Diese Zeichenfolge
lautet:
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
Wenn Sie diesen Query-String anstelle anderer URL-Parameter anfü-
gen und
expose_php On gesetzt ist, so sehen Sie das PHP-Logo. Diese
sprachinterne »Abkürzung«, um unkompliziert das PHP-Logo anzei-
gen zu können, wird u.a. in
phpinfo() verwendet und ist nach der
Deaktivierung von
expose_php nicht mehr aktiv.
Da bis auf die von Netcraft und anderen Organisationen erstellten
Statistiken kein sinnvoller Zweck von
expose_php ausgeht, sollte man
diese Option zumindest auf Produktionssystemen stets deaktivieren.
Diese Option kann in der
php.ini abgeschaltet werden.
Security by Obscurity
Dieser Ansatz zur Unkenntlichmachung der PHP-Version wird auch
»Security by Obscurity« genannt und basiert auf dem Verschleiern und
Verstecken von Informationen. Trotz aller Mühen gibt es keine hun-
dertprozentige Möglichkeit, die Verwendung von PHP zu verbergen.
Auch eine wirklich zuverlässige Methode zur Ermittlung der PHP-Ver-
(381<D5>(955H@?C50@8@1ECG?9==5B=S7<938
252.4 PHP-Installation erkennen
sion bzw. zur Feststellung, ob überhaupt ein PHP-Interpreter auf dem
Server installiert wurde, gibt es (noch) nicht.
Suchen nach bekannten
PHP-Anwendungen
Ein weiteres Indiz für die Skriptsprache PHP ist das Vorhan-
densein bekannter PHP-Anwendungen. Oft können Sie anhand der
Versionsinformationen – oder anhand ihrer Namen – erkennen, dass
es sich um eine in PHP geschriebene Software handeln muss. Ein
Forumsskript, ein Content-Management-System oder ein Blog, die
öffentlich im Internet verfügbar sind, können auf die Skriptsprache
PHP hindeuten. Bekannte Vertreter sind z.B. Typo3, WordPress, Seren-
dipity, phpBB oder auch das überaus weit verbreitete Datenbank-
Administrationsskript phpMyAdmin.
Die größte Wahrscheinlichkeit, herauszufinden, ob PHP installiert
ist, liegt in der Möglichkeit, einen Fehler in der Applikation zu erzeu-
gen. Dies kann durch unsinnige Eingaben wie z.B. Sonderzeichen
"'/%00 in Formularfeldern oder durch das Anhängen dieser Sonderzei-
chen an die Parameter in der URL geschehen.
Der Aufruf eines Skriptes mit einem ungültigen Parameter könnte
so aussehen:
/index.php?id="'/%00
Ein PHP-Skript, das den Parameter ungeprüft weiterverarbeitet, rea-
giert nun mit einer Fehlermeldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid
MySQL Result Resource in /usr/www/htdocs/index.php on line 10
Anhand dieser Fehlermeldung lässt sich zumindest erkennen, ob die
Skriptsprache PHP auf dem Webserver installiert ist. Wird die Ausgabe
von Fehlermeldungen in der
php.ini-Datei mit display_errors=off aus-
geschaltet oder ist durch den Entwickler eine eigene Fehlerbehandlung
implementiert worden, erfolgt keine Ausgabe am Bildschirm.
Zusätzlich können Sie eine Besonderheit von PHP in der Umwandlung
von URL-Parametern in skriptinterne Variablen ausnutzen. Wie in
Abschnitt 12.3.5 näher erläutert, wandelt PHP Variablennamen, die
mit einem Leerzeichen beginnen, automatisch in ihre Entsprechung
ohne Leerzeichen um. Aus einem URL-Parameter
/index.php?+id=123
wird also innerhalb des PHP-Skripts die Variable
$_GET['id']
(381<D5>(95display_errors1ECE>4?45B9=@<5=5>D95B5>(9559>55975>5
58<5B2581>4<E>7495>EBG5>975?45B71B;59>5>6?B=1D9?>5>1>J597D

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