【问题标题】:Removing an injection using regex [duplicate]使用正则表达式删除注入
【发布时间】:2014-11-18 18:18:16
【问题描述】:

我希望从大约 16,000 多个文件的第 1 行中删除这一特定行。

注射的开始是:

<?php if(!isset($GLOBALS`

Middle of the injection is:
`7860msvd`

And end of the injection is:
`oqggbrtstz-1; ?>

此内容仅在 1 行(第一行)

不知道怎么做,但我这里有以下内容;

sed -i -e '1 s/.*&lt;\?php if\(\!isset\(\$GLOBALS\.*7860msvd.*oqggbrtstz-1; ?&gt;//g'

error: sed: -e expression #1, char 67: Unmatched ( or \(

任何帮助都会很棒。

【问题讨论】:

  • 可以在一个文件中进行多次注射吗?可能是这里不需要的部分,例如中间还是结尾?
  • 是 1 行还是(如示例似乎显示)多行作为模式?

标签: php regex bash sed


【解决方案1】:

您错过了一些特殊字符,例如 ? 并使用 -r 获得预期结果

sed -ri  '1 s/.*<\?php if\(\!isset\(\$GLOBALS.*7860msvd.*oqggbrtstz-1; \?>//g' File

   -r, --regexp-extended

          use extended regular expressions in the script.

【讨论】:

  • @Scivic,不客气。你可以接受,我会得到一个绿色的勾号。
  • 这里如何在多行上工作 sed 一次只需要 1 行?示例显示 .*&lt;\?php ; ?&gt; 之间有几行,并且没有新的行/缓冲区加载。
  • @NeronLeVelu,我认为这些内容存在于单行中,就像我发布了答案一样。
  • 如何在所有 php 文件上运行它?
  • 上述命令并使用正则表达式 *.php 。而不是传递单个文件传递*.php
【解决方案2】:

@josifoski 是对的,不要逃避括号。对他的回答进行了小幅更正,以避免在注入之前 剥离代码:

sed -i -e '1 s/&lt;\?php if(\!isset(\$GLOBALS.*7860msvd.*oqggbrtstz-1; \?&gt;//g'

【讨论】:

  • 括号是否应该被转义取决于sed方言。
【解决方案3】:

一个重要的缺失答案是“不要那样做”。在你做任何其他事情之前强化网站。然后从已知良好的备份中恢复站点,或从版本控制中重新部署站点。

查找和修补 已知 问题并不是正确的解决方案。它会消除一个明显的症状,但不会阻止您再次被黑客入侵。如果有大量的代码库,入侵者很可能会留下您尚未注意到的其他惊喜。

【讨论】:

    【解决方案4】:

    您的命令的语法更正

    sed -i -e '1 s/.*<\?php if(\!isset(\$GLOBALS\.*7860msvd.*oqggbrtstz-1; \?>//g'
    

    当不存在反向引用和缺少转义到时不需要转义 ()?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 2011-05-02
      • 2011-01-28
      • 1970-01-01
      • 2022-08-19
      • 2011-12-23
      • 2016-04-18
      相关资源
      最近更新 更多