Dakle, danas mi je dan baš počeo onako fino…
Dobih od Googla da mi jedan site blokiran, pa me nazvalo par korisnika da su i njihove stranice blokirane (malware na siteu), rekoh da vidim što se zbiva…
Kad ono veselje.
Bez obzira na hosting, i bez obzira na site (bio to “obični” HTML site, wordpress, joomla ili neki petnaesti CMS) uhvatila ih neka epidemija JS injectiona.
Na jednom hostingu tražio sam restore backupa i stvar je bila riješena, ali drugi hostinzi nisu bili tako otvoreni za backup.
A kako imam gomilu siteova, a JS injection zarazio je gotovo sve JS skripte (i poneke PHP) nije mi bilo druge nego ručno uklanjati (ili podizati kompletne siteove nanovo).
Međutim, kako to iziskuje barem mjesec dana posla (obzirom na količinu siteova), odlučio sam sklepati PHP skriptu za uklanjanje te 3 varijante JS injectiona iz code-a i za “zaključavanje” zaraženih i očišćenih datoteka (jer će prilikom svakog idućeg pokušaja vjerojatno te iste datoteke biti zaražene), te zaključavanje svih JS datoteka na siteu.
Code je u prilogu (tko želi neka korisiti na vlastitu odgovornost, meni je poslužio vrlo dobro, bez nuspojava i neželjenih brisanja):
<?php
function find_pattern($filename)
{
$openFile=file_get_contents($filename);
// provjeri da li je injection code unutar php datoteke
$pattern="/php\n(\#(.*)#\nerror(.*?)#\n)/s";
$f=preg_match($pattern,$openFile,$aMatch);
if (strpos($aMatch[0],"error_reporting")>1)
{
// ako je, ukloni ga iz datoteke, i ponovno zapisi tu datoteku
$newfile=str_replace($aMatch[0],"php ",$openFile);
// otkljucaj file
chmod ($filename,0777);
$fp=fopen($filename,'w');
fwrite($fp,$newfile,strlen($newfile));
fclose($fp);
// zakljucaj file
chmod ($filename,0444);
echo '<li style="color:#0f0;font-weight:700;">ZAMIJENJENO - '.$filename.'</li>';
}
// provjeri JS injection (pattern 2)
$openFile=file_get_contents($filename);
$pattern="/(\*\/\nfunction getCookie(.*?)\n\n\/[*\/\s\/])/s";
$f=preg_match($pattern,$openFile,$aMatch);
if (strpos($aMatch[0],"getCookie")>1)
{
// ako je, ukloni ga iz datoteke, i ponovno zapisi tu datoteku
$newfile=str_replace($aMatch[0],"",$openFile);
// otkljucaj file
chmod ($filename,0777);
$fp=fopen($filename,'w');
fwrite($fp,$newfile,strlen($newfile));
fclose($fp);
// zakljucaj file
chmod ($filename,0444);
echo '<li style="color:#0f0;font-weight:700;">ZAMIJENJENO - '.$filename.'</li>';
}
// provjeri JS injection (pattern 3)
$pattern="/(\*\/\ndocument\.write\(\"\<script\ssrc\=(.*?)\*[*\/\s\/])/s";
$f=preg_match($pattern,$openFile,$aMatch);
if (strpos($aMatch[0],"document.write")>1)
{
// ako je, ukloni ga iz datoteke, i ponovno zapisi tu datoteku
$newfile=str_replace($aMatch[0],"",$openFile);
// otkljucaj file
chmod ($filename,0777);
$fp=fopen($filename,'w');
fwrite($fp,$newfile,strlen($newfile));
fclose($fp);
// zakljucaj file
chmod ($filename,0444);
echo '<li style="color:#0f0;font-weight:700;">ZAMIJENJENO - '.$filename.'</li>';
}
}
function ListFolder($path)
{
$dir_handle = @opendir($path) or die("Unable to open $path");
$dirname = end(explode("/", $path));
echo ("<li>$dirname\n");
echo "<ul>\n";
while (false !== ($file = readdir($dir_handle)))
{
$color="#000";
if($file!="." && $file!="..")
{
if (is_dir($path."/".$file))
{
ListFolder($path."/".$file);
}
else
{
if (strpos($file,".js")>0 || strpos($file,".php")>0)
{
$color="#f00";
find_pattern($path."/".$file);
}
echo "<li style='color:".$color.";'>$file (".$path."/".$file.")</li>";
// ako je JS file zakljucaj ga svakako
if (strpos($file,".js")>0)
{
chmod ($path."/".$file,0444);
echo "<li style='color:#ff2200;'>".$file." ZAKLJUCAN!</li>";
}
$color="#000";
}
}
}
echo "</ul>\n";
echo "</li>\n";
closedir($dir_handle);
}
ListFolder("./");
?>
U funkciji “find_pattern” mogu se dodati i drugi patterni (regex) za prepoznavanje malware-a unutar coda sitea.
Način korištenja:
Spremiti gornji code u php file (npr. “ciscenje.php”) i podignuti ga u root site-a. Pozvati ga (“www.mojsite.com/ciscenje.php”) i code ostalo obavlja sam. Inficirane datoteke oznaci zelenom bojom (na ekranu, na listi). Datoteke koje provjerava oznacuje crvenom bojom. Kada pronađe inficiranu datoteku (prema patternu), zamijeni taj dio codea unutar datoteke, i preko nje snimi “očišćenu” verziju, te zaključa datoteku (kako novi JS injection ne bi mogao ponovno upisivati u nju).
Eto, čisto da pomognem nekome tko je možda u gabuli kao što sam ja bio, pa da ne mozga previše