Moin!
Nur die *_uploaded_file()-Funktionen prüfen, ob der darin angegebene Dateiname tatsächlich von einem Upload im aktuellen Skriptaufruf stammt. Diese Prüfung ist durch keine Alternative innerhalb von PHP-Code zu ersetzen.
Du willst also sagen, dass $_FILES nach Belieben von anderen Instanzen manipuliert werden kann?
Das will ich nicht sagen, aber Fakt ist: In $_FILES steht einfach nur ein Dateiname drin, und dieser Wert ist nicht schreibgeschützt. Wenn also irgendwo eine Code-Injection passieren kann, entweder als manipuliertbare Sicherheitslücke oder durch unbewußte Schadcodeeinschleppung (z.B. Installation eines bösartigen Plugins), ist dieser Wert genauso gefährdet.
Man wird bei objektorientierter Programmierung $_FILES in der Regel auch nicht direkt als "global state" innerhalb einer für das Prüfen und Verschieben von Dateien zuständigen Klasse verwenden, sondern in der Regel einem Request-Objekt alle zugehörigen Superglobalen als Dependency übergeben. $_FILES ist zu diesem Zeitpunkt also längst nicht mehr der Name der Datenstruktur, die der Verschiebecode tatsächlich benutzt. Und deshalb geht dir der Aufmerksamkeitsfaktor von $_FILES = "Hier gehts um hochgeladene Dateien" verloren, weil vermutlich nur noch ein $tmpfile in ein $targetfile kopiert wird - was mit move_uploaded_file() nur dann funktioniert, wenn die Datei tatsächlich hochgeladen war, egal ob der Dateiname ursprünglich aus $_FILES kam, oder sonstwoher.
Das genau zeichnet doch aber $_FILES, $_GET, $_POST, ... aus, dass das eben nicht mehr möglich ist. Die Arrays werden im ausschließlichen Einflussbereich des Scriptes gespeichert und sollten keinerlei Manipulation mehr ermöglichen.
http://www.google.de/search?q=php+remote+code+exection+vulnerability
Ja, man wird drüber streiten können, ob es bei solch einer Lücke tatsächlich noch notwendig ist, irgendwelche Uploads auf existierende, interessante Dateien umzubiegen - aber das Argument, es sei keinerlei Manipulation mehr möglich, das ist falsch. Von "außen" (parallel laufende Skripte etc.) eher nicht (ungeschützer fremder Speicherzugriff auf den Variableninhalt von $_FILES sei mal auszuschließen), aber im laufenden Skript selbstverständlich.
Da die Werte
- $_FILES['uploadfilename']['error']
- $_FILES['uploadfilename']['tmp_name']
- $_FILES['uploadfilename']['size']
vom Server angelegt werden, sollten sie sicher sein!
In der ersten Zeile an Position 0 des ausgeführten Skripts: Ja. Danach nicht mehr.
Anderenfalls zeig mir bitte die Stelle, an der fremde Instanzen noch Zugriff darauf hätten. Dann hätten wir diese ganze Diskussion tatsächlich abkürzen können!
https://forum.selfhtml.org/?t=206726&m=1403987
Deine Reaktion darauf... naja. Sachliche Diskussion ist was anderes.
- Sven Rautenberg