Possiamo notare che la pagina web stampa il messaggio “hello hacker” e che nell’URL è definito un parametro page. Possiamo provare a giocare con il parametro, provando ad inserire ad esempio un file inesistente per produrre un errore.
Così facendo otteniamo stampato sulla pagina web un output molto succulento che contiene:
Da questo capiamo che viene utilizzato uno script PHP per includere un file tramite la funzione include() di PHP.
Possiamo verificare direttamente sulla macchina.
Il codice sorgente PHP mostra che se il parametro page è definito, viene incluso lo script puntato da page.
Si nota come il parametro page sia definito nella URL e quindi possa essere modificato.
Se si va a controllare la configurazione di PHP:
cd /etc/php5/apache2/
cat php.ini | grep error_reporting
cat php.ini | grep display_errors
Si nota che vengono stampati TUTTI gli errori (E_ALL) e che vengono stampati su STDOUT (error_reporting=On)
Debolezza: Eccessiva verbosità dell’output → capiamo che viene usato uno script con una determinata funzione.
L’attaccante può stampare dei file noti e visualizzarne liberamente il contenuto:
Debolezza: file critici di sistema con permessi di accesso laschi.
Possiamo provare a stampare file dell’utente che (notiamo verificando sulla macchina) hanno permessi di accesso in lettura a tutto il mondo.
page=/home/user/.bashrc
Ci viene stampato il contenuto del file con le configurazioni di bash dell’utente user.
L’output HTML dell’applicazione è mischiato all’output diagnostico di PHP, che espone informazioni interessanti per l’attaccante.
Per mitigare questa debolezza si usa il pacchetto Debian php5-common, che fornisce due modelli di file di configurazione PHP:
php.ini-development, per la modalità di sviluppophp.ini-production, per la messa in produzioneTra le tante cose, il file di configurazione di produzzione setta display_errors = Off, che specifica di non stampare gli errori, né su STDOUT né su STDERR.
Dopo aver effettuato un backup dell’attuale file di configurazione, si può procedere a sostituirlo con quello più adatto di produzione:
cd /etc/php5/apache2
cp /usr/share/php5/php.ini-production php.ini # copia il file nella cartella attuale e lo rinomina php5.ini
Dopodiché si riavvia il web server:
/etc/init.d/apache2 restart
Se ora si prova ad inserire come argomento una pagina inesistente, non verrà stampato nulla e l’attaccante non avrà modo di carpire informazioni utili.
Non presente sulle slide.
Non so, forse una sanitizzazione dell’input che verifica l’assenza di slash.