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.
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.