2016-02-22 6 views
6

Immaginate un'applicazione PHP giocattolo vulnerabile all'inclusione di file locali assoluti, ad es.Perché include ('php: // input') non funziona?

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

ho provato la seguente richiesta di sfruttarlo:

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

foo 

Esegue in modo efficace include('php://input'); con richiesta di corpo foo, quindi mi si aspetterebbe per stampare foo. Tuttavia, ottengo il seguente errore

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

Qual è il problema qui? È una funzionalità di sicurezza PHP? In tal caso, qualcuno può indicare la parte responsabile del codice sorgente PHP che lo attenua?

+0

Che dire flussi personalizzati? Usando 'stream_wrapper_register' e tutto quel jazz? – Halcyon

+2

Controlla il valore di questa opzione nella tua configurazione http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-include – Gustek

+0

@Halcyon Sto ascoltando. Non c'è modo che io abbia trovato questo sfruttabile su una moderna installazione LAMP, eccetto se hai una primitiva di scrittura di file (come 'session_start()' o una registrazione specifica dell'applicazione, ecc.) –

risposta

2

Ho trovato la risposta con l'aiuto di Gustek. Apparentemente php://input rientra nella restrction di allow_url_include, mentre per esempio php://filter evitando di:

ristretta da allow_url_include: php: // input php: // stdin, php: // memoria e php: // solo temperatura .

Fonte: Docs for php:// URL handler