PHP – Elencare file contenuti nelle cartelle e controllo modifiche

Troppo spesso i sistemisti sono alla ricerca di contenuto malevolo iniettato all’interno di pagine web da un attacco remoto. Di seguito andiamo a descrivere un semplice script in PHP che analizza tutti i files fino al livello di profondita’ scelto e se corrisponde al pattern preleva il contenuto e lo inserisce in un apposito database inviando una mail all’indirizzo desiderato nel caso in cui sia presente “unescape” o “iframe” e la dimensioni sia cambiata.Lo script e’ il seguente ed e’ commentato :

<?php
// Analizza tutte le cartelle fino al livello scelto cercando i file selezionati; prende il path, la dimensione ed il contenuto e lo inserisce in DB
// Se nel prossimo controllo la dimensione cambia manda una mail all’indirizzo mail di riferimento per un controllo.

// Connessione al DB: cambiare con i proprio dati.
$dbhost         = ‘localhost’;
$dbusername     = ‘root’;
$dbpasswd         = ”;
$database_name     = ‘test’;

$connection = mysql_connect(“$dbhost”,”$dbusername”,”$dbpasswd”) or die (“Impossibile collegarsi al server.”);
$db = mysql_select_db(“$database_name”, $connection) or die(“Impossibile selezionare il database.”);

$nomeTabella = “check_index”;

// Metto in un array tutte le directory…
$arrayDir = array(‘.’);
$cercaDir = “SI”;
$livello = 4;    // Livello di profondita’ di lettura…
$pathArray = array(“index.php”,”home.php”);  // File da analizzare
$mailRiferimento = “info@freescriptphp.com”;

// Preleva i nomi delle directory da analizzare con relativo path e le mette in un array…
for($i=1;$i<$livello;$i++)
{
foreach ($arrayDir as $value)
{
$rep = opendir($value);
while ($dir = readdir($rep))
{
if($dir != ‘..’ && $dir !=’.’ && $dir !=”)
{
$directory = $value.”/”.$dir;
if (is_dir($directory))
{
if (!in_array($directory,$arrayDir))
array_push($arrayDir,$directory);
}
}
}
}
}

// Cerco tutte le pagine delle directory…
$arrayFileCambiati = array();
foreach($arrayDir as $value)
{
$rep = opendir($value);
while ($file = readdir($rep))
{
if($file != ‘..’ && $file !=’.’ && $file !=”)
{
if (in_array($file,$pathArray))
{
// Leggo il file…
$nomeFile = $value.”/”.$file;

$dimensione = filesize($nomeFile);

$handle = fopen($nomeFile,”r”);
$contenuto = addslashes(fread($handle,300000));
fclose($handle);

echo($nomeFile.” – dimensione: “.$dimensione.”<br>”);
// Inserisco dimensione e path in database se il file non esiste…
$queryRicerca = “SELECT * FROM $nomeTabella WHERE path = ‘$nomeFile’”;
$sqlRic = mysql_query($queryRicerca);
if (mysql_num_rows($sqlRic) > 0)
{
// Il file gia’ esisteva; controllo la dimensione…
$dati = mysql_fetch_array($sqlRic);
$dimPrecedente = $dati[‘dimensione’];
// Se c’e’ unescape o iframe

if ((stristr($contenuto,”unescape”)) OR (stristr($contenuto,”iframe”)))
// Se la dimensione e’ cambiata…
//                    if ($dimPrecedente != $dimensione)
array_push($arrayFileCambiati,$nomeFile);
// Aggiorno il check…
$queryUpd = “UPDATE $nomeTabella SET ultimo_check = NOW()”;
$sqlUpd = mysql_query($queryUpd);
}
else
{<br />
$query = “INSERT INTO $nomeTabella (path, dimensione, contenuto, ultimo_check) VALUES (‘$nomeFile’,’$dimensione’,’$contenuto’,NOW())”;
$sql = mysql_query($query);
}
}
}
}
}
if (count($arrayFileCambiati)>0)
{
$listaFile = “”;
foreach($arrayFileCambiati as $value)
$listaFile .= $value.”\n”;
// invio mail perche’ la dimensione e’ differente…
mail($mailRiferimento,”Contenuto da verificare nei file indicati”,”Lista file da verificare:\n”.$listaFile);
}

// TO DO
// Nella mail accettare il cambiamento scrivendo la nuova dimensione in DB!

?>

E’ possibile eseguire lo script periodicamente affinche’ controlli tutto il contenuto di /var/html/www tramite un cronjob ed implementare ulteriori migliorie affinche’ salvi il contenuto modificato e sia possibile ripristinare con un click il vecchio contenuto qualora venissero riscontrati degli attacchi massivi al server con conseguente cambiamento di tutte le pagine index e home o eventuali altri stabiliti nel pattern.

Un commento su “PHP – Elencare file contenuti nelle cartelle e controllo modifiche”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *