sedを使用して感染したファイルのPHPの脆弱性を削除する

sedを使用して感染したファイルのPHPの脆弱性を削除する

最近、私のサーバーは一連のPHP攻撃の対象となり、ClamAVを使用して感染したファイルの多くを識別できました。

ここでの問題は、一部の合法的なファイルが感染し、一部は完全にマルウェアです。

幸いにも、感染したファイルの形式は次のとおりです。

<?php //malicious code ?>
<?php //legitimate part ?>

だから私はsedPHPタグの最初のエントリを削除できると思いました。これにより、正当なコードはそのまま残り、悪意のある部分は削除されます。

これを行うには、次のコマンドを使用しました。

sed 's/<?php.*?>//' file.php

これには2つの問題があります。

  1. 最初のアイテムの代わりにすべてのアイテムを置き換えます。
  2. 複数行が表示されると失敗します。

私は多くのフォームを試してみましたが、ある時点ですべて失敗しました。

sed '0,/<?php.*?>/{s/<?php.*?>//}' //this has also failed

だから私はあなたがこのsedコマンドをどのように機能させるかについていくつかのヒントを与えたり、現在の作業のためのより良いツールを提案したりできると思いました。

ベストアンサー1

申し訳ありません。 sedの代わりにperl oneliner式を使用していますが、どういうわけかsedの正規表現を学んだり覚えたりすることはできません。したがって、次のことを試すことができます。

  $ cat somefile.php | tr '\n' '@@@' | perl -p -e 's/^(.*?)(<\?php.*?\?>)(.*$)/$1$3/' | tr '@@@' '\n' > somefile_1.php

1つ目は、tr1行の文字列内で複数行の文字列を変更することです。 ' @@@'文字列は単なる例であり、編集したいファイルに存在しない文字列である可能性があります(確かに確認するには、まずgrepしてください)。
次に、perlコマンドは実際の作業を実行します。正規表現グループを使用して、文字列を3つの部分に分割します。まず、phpブロックが最初に現れる前のもの、次のphpブロック自体、最後に最初のphpブロックの後ろのすべてです。 。文字は?ワイルドカード式を貪欲にしないようにするために使用され、.*他の疑問符はエスケープする必要があります。
最後はtr改行文字を返します(最初の文字列と同じ文字列を使用する必要があります。trこの場合は " @@@")。

おすすめ記事