2016-02-22 10 views
6

Stellen Sie sich eine Spielzeug-PHP-Anwendung vor, die anfällig für absolute lokale Dateieinschlüsse ist, z.Warum funktioniert include ('php: // input') nicht?

<?php include($_GET['action']); 

Ich habe versucht, die folgende Anforderung es zu nutzen:

POST /?action=php://input HTTP/1.1 
Host: XXXXXXXXXXXXXXXXX 
Content-Length: 3 

foo 

Dies führt effektiv include('php://input'); mit Anfrage Körper foo, so würde ich erwarten, dass es foo zu drucken. Allerdings erhalte ich den folgenden Fehler

<br /> 
<b>Warning</b>: include(php://input): failed to open stream: operation failed in <b>XXXXXXXXXXXXXXXXX</b> on line <b>12</b><br /> 
<br /> 
<b>Warning</b>: include(): Failed opening 'php://input' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>XXXXXXXXXXXXXXXXXXX</b> on line <b>12</b><br /> 

Was ist das Problem hier? Ist das eine PHP-Sicherheitsfunktion? Wenn ja, kann jemand auf den verantwortlichen Teil des PHP-Quellcodes verweisen, der dies mildert?

+0

Was über benutzerdefinierte Streams? Mit 'stream_wrapper_register' und all dem Jazz? – Halcyon

+2

Überprüfen Sie den Wert dieser Option in Ihrer Konfiguration http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-include – Gustek

+0

@Halcyon Ich höre. Es gibt keine Möglichkeit, dies in einem modernen LAMP-Setup ausnutzbar zu machen, außer wenn Sie ein primitives Dateischreibprogramm haben (wie 'session_start()' oder anwendungsspezifische Protokollierung usw.) –

Antwort

2

Ich fand die Antwort mit Hilfe von Gustek. Offenbar fällt php://input unter dem restrction von allow_url_include, während beispielsweise php://filter nicht:

Restricted von allow_url_include: php: // input, php: // stdin, php: // Speicher und php: // Temp nur .

Quelle: Docs for php:// URL handler