2011-06-14 67 views
1

我的网站遭到剧本kiddy非常成功的攻击。在自动化的基础上,在我的服务器上访问一个隐藏的脚本,该脚本会导致修改所有index.php文件,并在它们的顶部添加一个iframe(base 64编码)。如何确定哪些脚本正在使用fopen?

我无法让我的托管服务提供商提供帮助,因为他们说他们在这个问题上很无奈。

我怀疑如果我能确定哪些脚本正在使用php的fopen函数,那么我将能够发现主篡改脚本的位置并将其删除。

有什么建议吗?

+1

你有最近的备份? – 2011-06-14 19:26:49

+3

您可能希望使用eval()查找脚本,因为后门的内容可能是“编码的”。 – 2011-06-14 19:38:56

+0

您如何知道它是自动基础上的服务器上的隐藏脚本? – horatio 2011-06-14 20:02:06

回答

2

使用find找到所有的PHP脚本,然后用grep进行的fopen。如果您没有shell访问权限,请使用脚本下载整个目录并在您的机器上执行。

find /base/dir/with/your/scripts -name '*.php' | xargs grep 'fopen' 
+0

这会梳理所有的子目录吗? – 2011-06-14 20:05:55

+0

@Hudson是的,它会 – 2011-06-14 21:03:02

+0

我发现这种方法取得了一些成功,但我怎样才能分页腻子反馈。即使在找到代码示例的情况下,我也显示了很多返回的结果,但我无法导航到结果日志的开始处以开始梳理文件。任何关于如何让腻子分页的建议? – 2011-06-15 03:45:56

1

grep可能是你的朋友。开始仔细揣测你的猜测,看看是否有什么不寻常的东西出现。

我也仔细检查了所有日志,我可以看看是否可以确定攻击来自哪里。至少在短期内你可能能够阻止IP攻击。查看文件的日期可能能够告诉你上次访问哪些内容以查找该位置。

另外,不排除JavaScript注入。他们可以用它做一些非常有意义的事情,而且它看起来像是页面底部的一堆随机乱码。

显然,更改密码以包含任何数据库。更新所有开放源码软件,因为这通常是这些人进入的方式。您甚至可以尝试将代码所有权更改为不同的用户。任何在下次尝试帮助跟踪违规代码时都会弹出错误的问题。

而且,我想找到一个新的主机....

3

下一个步骤

  1. 关机都记录下来
  2. 重新设置您的服务器新鲜
  3. 分析代码,一点一滴,找到孔。

保持被黑客入侵的服务器运行是不负责任的。除了更改index.php文件之外,还可能安装了真正的恶意工具 - 与此同时,您的服务器可能是犯罪分子的开放代理。

的fopen

有距离的fopen改变在PHP从文件中除了十几个方面。例如

  • file_put_contents
  • move_uploaded_file
  • exec('echo foo > /path/to/bar')
  • 同样与系统,中继,了shell_exec,proc_open

如果它的真正的fopen,你很幸运。

+0

如果我想在服务器上进行持久性攻击,我实际上会使用多种技术,所以请大拇指对这篇文章 – 2011-06-14 20:18:08

+0

准确!首先包含这种情况,不要让它变得更糟。如果您有物理访问服务器的权限,请从机器上取下网线。卸下硬盘驱动器。安装新的硬盘并从备份中恢复。用另一台机器分析受损驱动器。 – 2011-06-15 06:54:53

2

我仍然在使用grep和ssh访问来发现和清除问题。这可能是,而不是一个嵌入式脚本重写我的文件,PHP代码正在执行输入窗体上的某个地方。我还不确定。与此同时,我写了一个脚本,用于抵抗eval(base64_decode注入到我的index.php文件中。这会检查并删除index.php文件中的eval(base64_decode('');)并将我的文件结构搜索到5个目录层次深,这足以满足我的网站。我有它设置为上一个cronjob每隔5分钟运行一次。它似乎并没有被服务器密集的。

<?php 
$level=5; 
function get_sorted($path) 
{ 
    //$ignore = array('.',"'","error_log"); 
    $dh = @opendir($path); 
    while ($file = @readdir($dh)) 
    { 
     if (!strstr($file,'.')&&!strstr($file,"'")&&!strstr($file,"error_log")&&!strstr($file,"README")&&!strstr($file,"cookietxt")&&$file!='.'&&$file!='..') 
     { 
      $directories[] = $file; 
     } 
     else 
     { 
      if ($file!='.'&&$file!='..') 
      { 
       $files[] = $file; 
      } 
     } 
    } 

    $array = array($directories,$files); 
    return $array; 
} 

function clean_files($files, $path) 
{ 
    //echo 1;exit; 
    if ($files) 
    { 
     foreach($files as $key=>$val) 
     { 
      //echo $val; 
      if ($val == 'index.php') 
      { 
       //echo 1; exit; 
       //fopen .htacess 
       $targetFile = "$path/$val"; 
       echo "Checking: $targetFile <br>"; 

       $handle1 = fopen($targetFile, 'r');  
       $data = @fread($handle1,filesize($targetFile)); 
       fclose($handle1); 



       $string = preg_match('/eval.base64_decode(.*?)\;/', $data, $matches); 
       $string = $matches[0]; 

       if ($string) 
       { 
        echo "MALWARE FOUND IN $targetFile ! ... rewriting!<br>"; 
        $data = str_replace($string,'', $data); 
        $handle1 = fopen($targetFile, 'w'); 
        fwrite($handle1, $data); 
        fclose($handle1); 
        //exit; 
       } 
       unset($string); 
       unset($data); 

      } 
     } 
    } 
    else 
    { 
     echo "<br>No files discovered in $path<br>"; 
    } 
} 

//clean first level 
$array = get_sorted('.'); 
$directories = $array[0]; 
$files = $array[1]; 
clean_files($files,'.'); 

//get second level & clean 
foreach ($directories as $key=>$val) 
{ 
    $p_1 = "./$val"; 
    $a_1 = get_sorted($val); 
    $d_1 = $a_1[0]; 
    $f_1 = $a_1[1]; 

    //echo $val; 
    //print_r($d_1); 
    //echo "<hr>"; 
    clean_files($f_1, "{$p_1}"); 

    //check and clean level 2 
    if ($d_1) 
    { 
     foreach ($d_1 as $k_1=>$v_1) 
     { 
      //echo $v_1;exit; 
      $p_2 = $p_1.'/'.$v_1; 
      $a_2 = get_sorted($p_2); 
      $d_2 = $a_2[0]; 
      $f_2 = $a_2[1]; 

      clean_files($f_2, $p_2); 

      if ($d_2) 
      { 
       //check and clean level 3 
       foreach ($d_2 as $k_2=>$v_2) 
       { 

        $p_3 = $p_2.'/'.$v_2; 
        //echo $p_3; 
        $a_3 = get_sorted($p_3); 
        $d_3 = $a_3[0]; 
        $f_3 = $a_3[1]; 
        //echo"<hr>$v_2"; 
        //print_r($f_3);exit; 
        clean_files($f_3, $p_3); 
        //unset($ 
       } 

       //check and clean level 4 
       if ($d_3) 
       { 
        foreach ($d_3 as $k_3=>$v_3) 
        { 
         $p_4 = $p_3.'/'.$v_3; 
         $a_4 = get_sorted($p_4); 
         $d_4 = $a_4[0]; 
         $f_4 = $a_4[1]; 

         clean_files($f_4, $p_4); 
        } 

        //check and clean level 5 
        if ($d_4&&$level==5) 
        { 
         foreach ($d_4 as $k_4=>$v_4) 
         { 
          $p_5 = $p_4.'/'.$v_4; 
          $a_5 = get_sorted($p_5); 
          $d_5 = $a_5[0]; 
          $f_5 = $a_5[1]; 

          clean_files($f_5, $p_5); 
         } 
        } 
       } 
      } 
     } 
    } 

} 




?> 

,如果您有类似的问题,请小心并且正在尝试运行这个脚本,它会删除所有eval(base64_encode脚本恶意或不在index.php文件中),还可以编辑preg_match表达式来定位其他自然注入,也可以使用此代码定位索引以外的文件.php

相关问题