3

我有一种病毒,它感染了我客户的一台服务器上的数千个文件。

幸运的是,我已经在这个人的服务器上处理了许多其他恶意软件,而且这个看起来很容易做简单的正则表达式(他把他所有的网站都放在同一个帐户上:(但我正在与他一起解决这个问题)。

基本上,与我见过的大多数恶意软件不同,它在 GOOD 代码的关闭 ?> 之前注入 php(这使得很难确定什么是好代码/坏代码),这个当前的恶意软件总是添加一个新的<?php ... malware ... ?>.

所以基本上,说这里有很好的代码:

<?php
require('./wp-blog-header.php'); 
?>

与其在 require 语句之后但在 ?> 之前立即添加某种 base64_decode eval(当页面碰巧以条件/复杂语句结束时,这会使删除变得困难),这将始终添加以下代码和 NEW<?php ... ?>像这样:

<?php
require('./wp-blog-header.php'); 
?><?php ... malware ...?>

我不想在这里放任何恶意代码,但是,恶意代码总是这样开始的:

<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir = "tons and tons of characters";$eva1tYlbakBcVSir = "\x6335\1443\3x6f\1534\x70\170\x65";$SNIPSNIPSNIPSNIP;} ?>

我想搜索每个文件<?php @error_reporting(0); if (!isset,如果它是页面上的最后一个 PHP 语句,则删除

4

2 回答 2

12

这是使用纯 php 清理整个项目的方法。

在任何情况下,我均不对任何损害承担任何责任,包括但不限于因使用提供的代码而引起、导致或以任何方式与之相关的直接、间接、特殊或后果性损害,无论是否基于在保证、合同、侵权或其他方面;伤害是否由人员或财产或其他原因造成;以及是否因使用此代码的结果而遭受损失或产生损失。;p

<?php 
//Enter it as it is and escape any single quotes
$find='<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir =\'\';?>';

echo findString('./',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                        //The cleaning bit
                        echo "The string '".htmlentities($find)."' was found in the file '$path/$file and exists at position $pos and has been removed from the source file.<br />";
                        $clean_source = str_replace($find,'',$filesource);
                        file_put_contents($path.'/'.$file,$clean_source);
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>

祝你好运。

更新(使用正则表达式):

<?php 
error_reporting(E_ALL);
$find='<\?php @error_reporting\(0\); if \(!isset\((.*?)\?>';

echo findString('./',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){

                        $filesource=file_get_contents($path.'/'.$file);
                        //The cleaning bit
                        echo "The string '".htmlentities($find)."' was found in the file '$path/$file and has been removed from the source file.<br />";
                        $clean_source = preg_replace('#'.$find.'#','',$filesource);
                        // $clean_source = str_replace($find,'',$filesource);
                        file_put_contents($path.'/'.$file,$clean_source);
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>
于 2012-05-02T22:46:31.387 回答
1

到目前为止,这是最接近的(谢谢 mvds)

sed -e "s/<?php @error_reporting.*?>//g" --in-place=_cleaned *

尽管 --in-place=_cleaned 给出了错误sed: illegal option -- -

于 2012-05-02T22:43:30.980 回答