消除多个 php 文件中的模式的最佳方法是什么?

消除多个 php 文件中的模式的最佳方法是什么?

在受感染的网站上使用数百个 php 文件,并在每个文件的顶部注入以下签名代码:

<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>

接下来是<?php具有合法 php 代码的相邻部分。换句话说,注入的代码不在单独的行上。

我编写了以下代码来摆脱注入的代码:

grep -Rl 457563643457563643 . | xargs sed -i 's/<[?]php.*457563643457563643.*[?]>/<\?php \/\/ RECOVERED FILE \?>/g'

效果很好,但不幸的是它也会删除注入代码后面的合法 php 标签。

完全删除每个文件顶部注入的以下部分的最佳方法是什么:

<?php /*457563643457563643*/ ?><?php /*5467543654675436*/ ?><?php /*6745833567458335*/ ?><?php /*87934538793453*/ ?>

答案1

最好的方法是转到入侵之前的备份之一并从那里开始。听起来你想要一种非最好的方法。您可以使用 sed 来做到这一点。

使用 sed,删除单行上的精确文本块的最直接方法就是使用命令s显式删除它:

sed -e 's!<?php /\*457563643457563643\*/ ?><?php /\*5467543654675436\*/ ?><?php /\*6745833567458335\*/ ?><?php /\*87934538793453\*/ ?>!!'

*这只是用任何内容替换您引用的确切字符串 -每次都需要转义元字符,但否则这将直接s!pattern!replacement!以通常的方式使用。


我会使用find -exec(更好的,-execdir如果你得到了)而不是管道xargs尤其如果我有一个我无法信任的目录树。文件名中可能包含各种内容,特别是换行符,这可能会导致执行您不喜欢的命令。对于这个特定的sed命令行,它不太可能是一个实际问题,但我不会将其排除在外。

您可以运行命令grep内部find,并且仅在文件匹配时才对文件进行操作,或者只是让其sed处理它 - 如果模式不匹配,则文件随后将是相同的。


无论如何,我仍然建议谨慎——这些标记并不是事物的有害部分,而且这些部分可能不那么明显。

也可以看看:如何处理受感染的服务器?

相关内容