Rimuovi la possibilità di leggere i file di sistema con PHP da Apache

1

Quando carico un file php (file.php) con il seguente contenuto sul server Apache

<?php
$file = $_GET['file'];
include ( $file);
?>

Sono in grado di leggere qualsiasi file di Apache utilizzando gli URL di sotto

http://domain.com/file.php?file=/etc/passwd
http://domain.com/file.php?file=/etc/httpd/conf/httpd.conf
http://domain.com/file.php?file=/etc/php.ini
http://domain.com/file.php?file=/etc/my.cnf

Sono un utente Linux quindi conosco il percorso comune dei file, sono quasi gli stessi su tutti i server Linux.

Non ho il controllo sul codice che i miei sviluppatori stanno caricando. Il processo di revisione del codice è pieno di difetti e questo tipo di codice può essere facilmente caricato sul server. L'unica cosa che possiamo fare è vietarlo attraverso i file di configurazione.

Come posso rimuovere questa vulnerabilità da Apache in modo che nessuno possa leggere i file di sistema anche se file.php è presente in htdocs?

    
posta Derek 23.06.2016 - 16:13
fonte

4 risposte

1

La stessa "vulnerabilità" è in C, Java, Perl, Ruby, Lisp, Fortran, BASIC, PASCAL, ALGOL .... i linguaggi di programmazione forniscono quasi universalmente un costrutto per leggere i file. Alcuni file su un sistema Unix sono leggibili a livello mondiale.

I do not have control on developers about what code they are uploading...

Quindi cerca con tutti i mezzi di mitigare gli errori sciocchi, ma non dare per scontato che tu possa mai rendere il codice sicuro .

Riguardo al problema specifico che hai descritto ....

open_basedir di PHP interrompe un sacco di opzioni per leggere i file (non tutti).

L'esecuzione di PHP in un chroot è un meccanismo più efficace per limitare l'accesso ai file, ma non impedisce l'accesso al codice PHP stesso.

L'esecuzione di PHP su un host separato aggiungerà un po 'di latenza - e in realtà non ha molti vantaggi rispetto all'esecuzione di chroot.

Il modo giusto per risolvere il problema è attraverso una corretta revisione del codice / controllo.

    
risposta data 24.06.2016 - 14:09
fonte
3

Questa non è una vulnerabilità in Apache. È una vulnerabilità nel tuo codice PHP.

La funzione include(x) include il file x . Se lasci che l'utente scelga qualsiasi x , sarà in grado di includere qualsiasi file. Se non vuoi che siano in grado di farlo, allora non scrivere codice PHP che li permetta. Ti suggerisco di passare solo costanti o valori da una whitelist come parametri a include() .

Se sei preoccupato per i tuoi sviluppatori che caricano codice errato come questo sul server, non c'è nulla che tu possa fare se non ottenere sviluppatori migliori (istruire o sostituire) o un processo di revisione migliore. Uno script PHP potrebbe in pratica essere scritto per fare tutto ciò che l'interprete di PHP ha dei privilegi da fare, e questo è molto. Ad esempio, potresti scrivere una backdoor in PHP dando a chiunque un accesso completo al tuo server.

Per ripetere, non esiste un file di configurazione magica che renderà PHP intrinsecamente sicuro. L'unico modo per tenere al sicuro il tuo server è caricare solo un codice sicuro, sia esso PHP o qualsiasi altra lingua. Non è possibile ottenere la sicurezza con la semplice pressione di un pulsante; devi integrare la prospettiva nel tuo intero processo di sviluppo.

    
risposta data 23.06.2016 - 17:43
fonte
0

Un modo per impedire ad Apache di leggere i file di sistema (e, in generale, qualsiasi file al di fuori della directory root web) è con SELinux. Il suo unico scopo è impedire un accesso inappropriato alle risorse del sistema (non limitato a limitare Apache, ma questo tipo di protezione è uno dei suoi grandi vantaggi).

Dovresti comunque utilizzare un sistema operativo che lo supporta, che è probabilmente RHEL e i suoi derivati (CentOS, per esempio).

    
risposta data 24.06.2016 - 12:52
fonte
0

Puoi limitare le directory che gli script PHP possono accedere utilizzando open_basedir configurazione.

es. mettere open_basedir = /var/www/ nel tuo file php.ini dovrebbe limitare PHP a / var / www /

    
risposta data 24.06.2016 - 13:23
fonte

Leggi altre domande sui tag