2012-05-14 6 views
6

Abbiamo un'applicazione Java IRC in cui agli utenti è consentito eseguire PHP arbitrario e ottenere il risultato. Ecco un esempio di ciò che questo viene utilizzato per:Codice jailing PHP arbitrario

btc: <php>$btc = json_decode(file_get_contents('https://btc-e.com/api/2/1/ticker'), true); $ticker = $btc['ticker']; echo "Current BTC Ticker: High: $".$ticker['high']." Low: $".$ticker['low']." Average: $" . $ticker['avg']; 

Abbiamo anche una messa a punto di pitone, ma ci piace PHP perché PHP non richiede a capo nel codice ovunque. (Perché questo è IRC, non possiamo dare è a capo a meno che non exec un file .py web-caricato)

Il problema è come impedire alle persone di cercare di sfruttare il sistema, come ad esempio in:

<php>echo readfile("/etc/passwd"); 

Quale sarebbe, chiaramente, leggere il file passwd per tutti da vedere.
Stiamo anche avendo questo problema, dopo aver cercato di bloccare readfile():

<php>$rf = readfile; echo $rf("/etc/passwd"); 

Come dovremmo andare sulla protezione di questo sistema? (Il codice completo è su github, per qualsiasi interessato: https://github.com/clone1018/Shocky)

Come una parte, nessuna informazione reale viene esposta, poiché l'intera cosa è in una VM, quindi non è una "bomba temporale" o qualcosa . Vogliamo comunque bloccarlo.

+7

Perché il tuo server web ha i diritti di leggere '/ etc/passwd'? Blocca il tuo utente Web per i principianti. – afuzzyllama

+1

@afuzzyllama Questo non ha nulla a che fare con l'utente web; '/ etc/passwd' è leggibile in tutto il mondo per la maggior parte delle distribuzioni Linux.Alcuni programmi richiedono l'accesso a quel file per funzionare e non contengono comunque password. –

+0

@Ryan P - Per "utente web" intendevo l'utente che esegue apache, non l'utente sul sito web. – afuzzyllama

risposta

4

Questo sembra inserire un foro in un colino. La sicurezza del filesystem dovrebbe essere gestita dal sistema operativo, non dall'applicazione. E per quanto riguarda lo /etc/passwd, il sistema operativo lo sta già proteggendo.

Ecco la prima linea del mio /etc/passwd - sì, ho intenzione di postare pubblicamente:

root:x:0:0:root:/root:/bin/bash 

Di solito, le password non sono in realtà memorizzati in /etc/passwd. Le informazioni dell'utente sono, ma le password vengono sostituite con x, con la password reale disponibile solo per l'utente root.

Tuttavia, è necessario bloccare PHP in una certa misura. È possibile modificare molte opzioni PHP durante il runtime con ini_set, incluso open_basedir. http://www.php.net/manual/en/ini.core.php#ini.open-basedir

+0

Accettare perché questo è qualcosa che non abbiamo fatto. – Riking

+0

** @ Ryan P: ** Questo non risolve ancora il problema di root, se lo facciamo, potrebbero ancora '$ a = 'include'; $ a ('sql.php'); 'o simile. ** @ afuzzyllama: ** Questo evita anche il problema di root,/etc/passwd era solo un esempio. Anche se l'utente fosse in un ambiente chroot, sarebbero comunque in grado di accedere agli altri file in quella prigione, non lo vogliamo. – clone1018

+0

Se si imposta 'open_basedir' in una directory senza file, non è possibile aprire altro che lo script in esecuzione. Il metodo utilizzato per aprire il file è irrilevante; influenza anche 'include'. –

-4

Se si desidera solo per limitare la lettura del file forse questo può aiutare http://www.php.net/manual/en/ini.core.php#ini.open-basedir

Se si sta utilizzando una vecchia versione di PHP < 5.4 è possibile considerare l'utilizzo di PHP safe mode

http://php.net/manual/en/ini.sect.safe-mode.php

Impostare le seguenti voci per la modalità provvisoria per limitare il php

safe_mode_exec_dir 
disable_functions = readfile,system 

e molti altri

Inoltre, l'utente non sarà in grado di leggere alcun file per il quale uid è diverso, ad es./Etc/password. Tieni presente che la modalità sicura è deprezzata/rimossa dalle ultime versioni di php

+1

Non dovresti suggerire a nessuno di usare funzionalità deprecate, specialmente quando è stato rimosso nella versione attuale. –

+0

Booo ha detto che il vecchio saggio :-P. In questo caso, per questa particolare modalità d'uso, la modalità sicura sembra essere la migliore, anche se deprezzata, di una non-risposta del vecchio saggiatore (che non cerca nemmeno lontanamente di toccare la soluzione alle domande ma ottiene comunque +2). – APZ

+0

Una soluzione a un problema e una risposta a una domanda non sono la stessa cosa. Cerco di dare soluzioni ai problemi piuttosto che rispondere ciecamente alle domande, poiché il primo è spesso preferibile a quest'ultimo. –