2017-02-16 6 views
1

私のサイトの1つは、いくつかの悪質なコードに感染しています。コードは、唯一のすべてのPHPファイルの最初の行に追加され、以下のようになっている。sedで長い文字列を削除する

<?php $ulhmjwklj = '#-#O#-#N# .......xqxe-1; ?> /*BEGIN LEGIT CODE HERE*/ <?php.... 

悪意のあるコードが長い特殊文字とスペースのたくさんの文字で何千ものであるので、私はそれを削除するスクリプトを作成してみました:最初の行に正当なコードを残しながら

for i in $(find . -name \*.php); do 
    sed -i -E "s/<\?php\s$ulhmjwklj.*\?>//" $i; 
    echo $i; 
done; 

このsedコマンドが正常に悪質なコードを削除しますが、その後、後続のすべての行では、すべての<?php ... ?>のタグを削除します。だから私は、最初の行に置き換える/のみ検索にsedコマンドを変更してみました:

for i in $(find . -name \*.php); do 
    sed -i -E "1s/<\?php\s$ulhmjwklj.*\?>//" $i; 
done; 

今すぐsedコマンドは、各ファイルの最初の行で実行されますが、それはまた、追加されているすべての合法的なPHPタグを削除します悪質なコードの直後の最初の行に移動します。

誰かがここで間違っていると説明していただけますか?

+0

は、すべてのファイルで修正された悪意のあるコードの長さですか?それともファイルごとに違いますか? – anacron

+0

また、いくつのPHPファイルがありますか?すべてが影響を受けていますか? – anacron

+0

'。*'は貪欲です... – jm666

答えて

0

The results of find should not be put through a loop。そして、私がコメントで述べたように、$は、Bashと正規表現の両方の特殊文字なので、適切に扱われなければなりません。

最後に、コメントに記載されているjm666のように、.*は貪欲であるため、.*?は検索をできる限り小さく制限しています。しかしthis won't work in sedので、我々は代わりにperlを使用する必要があります。

find . -name '*.php' -print -exec perl -p -i -e 's/<\?php \$ulhmjwklj.*?\?>//' {} \; 
+0

あなたのお返事ありがとうございました。残念なことに、これはトリックをしませんでした。まず、sed "-i -E"パラメータを別々に追加する必要がありました。そうしないと、各PHPファイルにファイル名の末尾に "E"が追加されました。これを修正すると、上記のfind/replaceクエリの結果は、正当なPHPタグと1行目の最後にあるコンテンツも削除される前と同じ問題になります。 : - /変わった.. – blazebro

+0

私の更新された答えを見てください。 'sed'のように、' perl'の '-i'オプションはインラインファイル編集を可能にし、ファイルを変更せずに"ドライラン "を行うために削除することができます。 – miken32

+0

成功!どうもありがとうございます。私はsedが私に何らかの兆候を与えてくれることを望みます。動作しません。 – blazebro

関連する問題