Posso limitare PHP include () a specifici alberi di directory?

5

So che posso usare la direttiva php.ini open_basedir per limitare gli alberi di directory in cui i file possono essere aperti da PHP.

Ma in una struttura di directory come questa:

├── application
│   ├── index.php
│   └── www
├── logs
└── uploads
    └── malicious.php.jpg

Esiste un modo per impedire che malicious.php.jpg venga valutato come PHP se fosse specificato in include() , senza impedire a PHP di leggere / scrivere caricamenti su / da quella directory?

Modifica: probabilmente dovrei specificare che sono interessato a una soluzione basata su configurazioni o permessi.

    
posta Aaron Adams 31.10.2013 - 16:06
fonte

3 risposte

3

A seconda della configurazione, potresti essere in grado di utilizzare il Controllo accesso obbligatorio per ottenere qualcosa di simile a ciò che desideri. Ad esempio, considera un sistema che esegue linux con apparmor. Usando apparmor puoi limitare quali script sono autorizzati ad accedere alla directory dei caricamenti. Questa non è una soluzione perfetta poiché un paio di script saranno ancora in grado di "includere" i file, ma puoi limitare il numero di script che possono.

Ad esempio, puoi consentire a upload.php di accedere alla directory dei caricamenti, ma negare l'accesso index.php a quella directory anche se sono in esecuzione come lo stesso utente.

Suppongo che tu possa fare cose simili con altri sistemi MAC come SELinux.

    
risposta data 31.10.2013 - 17:24
fonte
3

Questo non può essere fatto senza modificare il comportamento predefinito della famiglia di funzioni include() modificando il codice sorgente PHP e compilando i propri binari. Ma, ad essere onesti, questo è un po 'inutile. Affinché malicious.php.jpg sia includ ed, hai bisogno di una vulnerabilità di inclusione dei file nel tuo codice, qualcosa come% % co_de.

La prossima cosa migliore è fare in modo che tutti gli include includano la funzione di inclusione globale che esegue determinate convalide di input. Quella funzione può controllare quali directory sono accessibili.

    
risposta data 31.10.2013 - 17:31
fonte
1

No, non proprio. L'unico modo per farlo è limitare i file che possono essere letti da PHP a livello di sistema operativo. Anche se mantieni in qualche modo restrizioni su quali percorsi potrebbero essere letti usando include() o require() , non stai ancora impedendo l'esecuzione: lo script potrebbe altrettanto facilmente utilizzare la normale funzionalità fopen() per leggere il file, e quindi solo eval() esso, con esattamente lo stesso effetto.

Ma se il codice ha la libertà di fare tutto questo, allora l'inclusione dei file è l'ultimo dei tuoi dubbi. In effetti, l'inclusione di file dannosi non dovrebbe nemmeno essere possibile se scrivi correttamente il tuo codice. In nessun caso dovresti mai (no davvero, mai ) includere o eseguire un file se il nome è originato dall'input dell'utente. Se lo fai, posso affermare categoricamente che lo stai facendo male.

Ma se vuoi limitare l'intervallo di file includibili / eseguibili / leggibili, allora chroot è dove si trova. Un po 'complicato da configurare, ma offre il livello di protezione richiesto.

    
risposta data 01.11.2013 - 08:49
fonte

Leggi altre domande sui tag