【发布时间】:2017-02-17 04:48:11
【问题描述】:
我的一个网站感染了一些恶意代码。代码只添加到所有PHP文件的第一行,如下:
<?php $ulhmjwklj = '#-#O#-#N# .......xqxe-1; ?> /*BEGIN LEGIT CODE HERE*/ <?php....
恶意代码长达数千个字符,包含大量特殊字符和空格,因此我尝试创建一个脚本来删除它:
for i in $(find . -name \*.php); do
sed -i -E "s/<\?php\s$ulhmjwklj.*\?>//" $i;
echo $i;
done;
此sed 命令将正确删除恶意代码,同时将合法代码留在第一行,但随后在所有后续行中删除所有<?php ... ?> 标记。所以我尝试将sed 命令更改为仅在第一行搜索/替换:
for i in $(find . -name \*.php); do
sed -i -E "1s/<\?php\s$ulhmjwklj.*\?>//" $i;
done;
现在sed 命令只会在每个文件的第一行运行,但它也会删除任何合法的 PHP 标签,这些标签直接附加到恶意代码之后的第一行。
有人可以解释一下我在哪里出错了吗?
【问题讨论】:
-
所有文件中恶意代码的长度都固定了吗?还是因文件而异?
-
另外,您总共有多少个 PHP 文件?他们都受到影响吗?
-
.*很贪心... -
Bash 将寻找一个名为
$ulhmjwklj的变量。如果你逃避它,那么 sed 将把$作为行尾。需要双转义,或者不要使用双引号字符串。 -
是的,所有 PHP 文件都被感染了,恶意代码是每个文件中的固定字符数。我正在考虑下一步走这条路线......