Lezioni PHP: in-sicurezza con PHP

Posted on Novembre 13, 2007
Filed Under Appunti di Php |

Tratteremo in dettaglio alcuni dei problemi legati a configurazioni “errate” del php.ini che potrebbero portare a numerosi problemi per il nostro sito e non solo.

Capire come porre rimedio alle errate configurazioni ci aiutera’ a gestire al meglio il nostro sito e ad ottimizzarlo anche in termini di prestazioni e velocita’.

Una delle cose da tener presente nella configurazione del file php.ini e’ quella di lasciare ad off la variabile register_globals con la riga:
register_globals = Off

Nel caso in cui fosse possibile definire delle variabili globali ed il nostro codice fosse conosciuto potremo trovarci di fronte a problemi di sicurezza molto gravi. Esaminiamo ad esempio la seguente funzione:

nonpasso.php
<html>
<head>
</head>
<body>
<?php

$off = “off”;
if ($off == “on”)
$on = “Passato”;

if ($on == “Passato”)
echo(”Passato!”);
else
echo(”Non passato!”);
?>
</body>
</html>

eseguendo lo script nonpasso.php a video avremo:
Non passato!

Ma supponiamo di eseguire nonpasso.php?on=Passato cosa accadrebbe? Ecco il risultato:
Passato!

Ahi ahi, problemi gravi, sopratutto se il codice e’ open source. Come fare per risolvere ?
Potremo riscrivere lo script inizializzando le variabili che utilizzeremo:
nonpasso.php
<html>
<head>
</head>
<body>
<?php

$off = “off”;
$on = “nonPassato”;
if ($off == “on”)
$on = “Passato”;

if ($on == “Passato”)
echo(”Passato!”);
else
echo(”Non passato!”);
?>
</body>
</html>

Oppure potremo definire piu’ facilmente ed in maniera piu’ sicura register_globals = Off nel php.ini.
In fase di realizzazione e’ utile impostare la variabile error_reporting ad E_ALL in modo da mostrare a video tutti gli errori. Questa varibile e’ bene disattivarla in produzione per evitare spiacevoli warning che non inficiano il funzionamento del sistema ma danno soltanto comunicazioni personali ad utenti non addetti come il path informazione molto importante per un utente che vuol far danni.

Facciamo ad esempio per valutare i rischi che si corrono: l’utente MAMMA a causa di un warning in un suo script mostra il suo path completo; usualmente /home/www/MAMMA/public_html/directory/scriptErrato.php

L’utente DANNO e’ l’antagonista di MAMMA e, vedendo il path decide che e’ il momento di agire! DANNO sa bene che da casa sua e’ un po’ piu’ difficile far danni a MAMMA e allora decide di andare a trovare MAMMA. Vediamo come: DANNO sa benissimo che MAMMA e’ raggiungibile da www.sitodimamma.tld decide quindi di capire di andadove e’ la casa di MAMMA e per far cio’ si rivolge ai molti siti di whois presenti, ad es.:
www.whois.sc

Esaminando il risultato del whois riesce quindi a capire dove e’ la casa di MAMMA perche’ sa chi gli ha fornito l’hosting. Ecco trovata la casa di MAMMA. DANNO poi si chiedera’ se MAMMA abita da sola o se ha compagnia ma non puo’ chiederlo a MAMMA lo chiedera’ al padrone di casa. Andiamo quindi ad aprire la nostra shell (ALT+F2 gnome-terminal<invio>) oppure il prompt dei comandi (tastoDiWin+r — cmd<INVIO>); guardiamo il suo indirizzo IP:
ping www.sitodimamma.tld

DANNO prende l’ip e controlla se MAMMA abita in un condominio. Come ? Facile, rivolgendosi ad alcuni siti di reverse IP come http://www.myipneighbors.com/ si puo’ verificare chi abita con MAMMA.

MAMMA e’ circondata da coinquilini decine e decine di amici di MAMMA che nemmeno conosce e loro non conoscono MAMMA ma DANNO inizia a farsi un’idea piu’ chiara. E’ arrivato il momento per DANNO di diventare coinquilino di MAMMA! DANNO si rivolge allo stesso provider e, per svariate ragioni, senza rivelare che conosce MAMMA puo’ chiedere ed ottenere di stare nello stesso condominio di MAMMA. DANNO si sta avvicinando pericolosamente a MAMMA ma anche al fornitore di hosting. Tutti gli IT sanno che i problemi piu’ gravi vengono proprio dall’interno e, ahime’, DANNO e’ proprio all’interno. Ma il fornitore sa bene che DANNO ha accesso al sUO FTP, non agli altri e non puo’ risalire dal suo livello (/home/www/DANNO) ma…se DANNO si trasformasse in PHP ? Uhmmm questo potrebbe essere piu’ difficile e poco scontato per un hosting provider da tamponare.

Ma come DANNO puo’ trasformarsi in PHP ? Uhmmm…
dannoPasswd.php
<?php
passthru(”cat /home/www/MAMMA/public_html/directory/scriptErrato.php”);
?>

Eh no, non da errore! Uhmmm…DANNO e’ proprio cattivo e decide di visitare la casa ha mamma visto che conosce dove sta:
<?php
$pathDir = “/home/www/MAMMA/public_html/directory/”;

//open dir
$handleDir = @opendir($path) or die(”Impossibile aprire $pathDir”);

echo “Contenuto di $path<br/>”;

//Per ogni file…
while ($file = readdir($handleDir))
{
if($file!=”.” && $file!=”..”)
echo “<a href=’$file’>$file</a><br/>”;
}

closedir($handleDir);

?>

E MAMMA ci apri’ la sua porta di casa permettendoci di vedere le sue stanze. Ma cosa succederebbe se DANNO decidesse di aprire le porte del condominio ?
<?php
passthru(”cat /etc/passwd”);
?>

Tutto questo e’ a puro scopo di esempio e da non applicarsi se non a scopo di test in macchine di cui si e’ proprietari per testare la sicurezza interna.

Tags: , , , , ,

Others Script adv

Leave a Reply