sedコマンドを使用して2回目の発生前のすべてを置き換える方法は?

sedコマンドを使用して2回目の発生前のすべてを置き換える方法は?

私のウェブサイトは、少なくとも3135ファイル(私のすべてのWordPressサイト)にマルウェアを挿入したマルウェアに感染しました。

以下は感染したファイルの1つです。http://pastebin.com/FXU1ht4R

これが私が望む結果です:http://pastebin.com/YPJwjiWH

find私はいくつかの簡単なコマンド以外にgrepUnixコマンドについて何も知りません。

私は少し調査の終わりにこのコマンドを見つけましsedたが、私の場合はこのコマンドの使い方がわかりません。

上記のコードに示されているように、一般的なパターンは、コードが各ファイルの上部、つまり元のタグの前<?php<?php挿入されているということです。

cnajwp =それで、その前に2番目のタグを含むすべてのファイルを見つけてすべて削除することができると思いました<?php

cnajwp以下を使用して埋め込みファイルを見つけることができます。

find * -type f -name "*.php" -exec grep -l "cnajwp =" {} \;

<?phpしかし、これらのイベントの2番目のラベルより前のすべての項目を置き換える方法はわかりません。

ここで誰でも私を助けることができますか?

答え1

次に、コマンドを使用して感染ファイルを見つけ、最初の行で式を実行するxargsにリストを提供します。

find * -type f -name "*.php" -exec grep -l "cnajwp =" {} \; |
xargs sed -i -E '1s/^(<\?php) \$ocnajwp =.*$/\1/'

入力ファイルの例に基づいて、これはトリックを実行する必要があります。

同時に、感染がわずかに異なる場所にあるファイルを見つけ、最初の行に両方のファイルが含まれているため、次のコマンドを<?php実行してそのファイルを修復できます。

find * -type f -name "*.php" -exec \
gawk -i inplace 'NR==2 && /^<\?php$/ {next} 1' {} \;

答え2

このソリューションは、悪意のあるスクリプトが複数行にまたがって機能し、内部編集を使用してサーバー上のファイルを直接変更します。

find /base/path/here -type f -name "*.php" -exec \
sed -Ei '/<\?php/{:l1;/.*\?><\?php/!{N;bl1};s/<\?php.*\?>(<\?php)/\1/}' {} \;

これが法案に合うことを願っています。

答え3

私が知っている限り、削除したいマルウェアはすべて1行目に配置されています。ただし、マークアップもその行に配置されるため、最初の行を削除するのではなく、最初の行全体を変更する<?php必要があります。<?php

必要なのは、次のコマンドを使用することです。

sed -i '1 s/^.*$/<?php/g' yourFile.php

-iオプションはファイルをその場で変更します。

したがって、findコマンドの場合は、次のようにします。

find * -type f -name "*.php" -exec sed -i '1 s/^.*$/<?php/g' {} \;

1行目と2行目に2つのラベルを含むファイルの場合は、<?php上記のfind命令を実行してから次の命令を実行する必要があります。

find * -type f -name "*.php" -exec perl -ni -e 'print if $. < 1 or $. > 3 or !$seen{$_}++' {} \;

したがって、行1から行3までに見つかった重複行を削除します。-iオプションはファイルをその場で変更します。

関連情報