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”

  1. Sorry for my bad english. Thank you so much for your good post. Your post helped me in my college assignment, If you can provide me more details please email me.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.