Se non commetti errori, le origini PHP non possono essere lette dall'esterno: finché apache è configurato per gestire file .php tramite mod_php, verranno sempre eseguiti, mai pubblicati come non elaborati.
Tuttavia, gli errori sono facili da fare e si trovano spesso nel codice di produzione. Gli errori tipici includono:
- Vulnerabilità di attraversamento del percorso. Lo schema tipico è che tu costruisci un nome di file basato su qualche input dell'utente (ad esempio un parametro
$_GET
), e poi servi questo file attraverso, diciamo, readfile
. Ad esempio, se hai readfile("/home/me/pages/{$_GET['pageid']}.html")
, un utente malintenzionato può facilmente piantare qualcosa come "../../../../../../../../../../../etc/shadow"
.
- File PHP con estensioni non standard. Apache utilizza l'estensione per determinare il tipo MIME di un file, quindi decide come gestirlo in base a ciò.
config.php
sarà interpretato, ma config.php.inc
no; dal momento che .inc
non è un'estensione nota nella maggior parte delle configurazioni, Apache usa il testo in chiaro, il che significa che il codice sorgente può essere richiesto su Internet.
- Caricamento del codice. In genere, tale vulnerabilità si verifica quando si dispone di caricamenti di file gestiti in modo improprio, ad es. autorizzare le directory arbitrarie nel nome file caricato o il caricamento in un percorso sotto la radice del documento. Quando un utente malintenzionato riesce a piantare
.php
file in una posizione in cui vengono eseguiti, è possibile eseguire codice PHP arbitrario sul server, incluso il codice che legge altri script ed estrae le password.
- Vulnerabilità nell'esecuzione di codice in modalità remota. Simile al caricamento del codice; se hai
eval
, include
, system
, exec
o chiamate simili nel tuo codice, e i loro argomenti sono parzialmente forniti dall'utente, potresti essere nei guai - gli input non correttamente sterilizzati a uno di questi costrutti possono consentire agli aggressori di eseguire codice PHP o comandi shell arbitrari.
- Visualizzazione degli errori nell'output della pagina. Molti errori ed eccezioni contengono dati sensibili, almeno parti del codice sorgente, ma a volte (ad es. PDOExceptions) anche nomi utente e password.
- Errori di configurazione di Apache. Apache è una cosa potente, piena di funzioni oscure e alcune di esse hanno implicazioni sulla sicurezza.
Oltre a evitare queste trappole, dovresti mettere solo i file sotto la root del documento che devono essere chiamati direttamente; qualsiasi include, file di dati, file di configurazione, librerie, ecc., andare nelle directory outside root del documento.