>  기사  >  백엔드 개발  >  WordPress의 PHP 파일에서 악성 코드 제거

WordPress의 PHP 파일에서 악성 코드 제거

WBOY
WBOY원래의
2016-07-25 08:46:341220검색
악성코드, 워드프레스, PHP
회사의 워드프레스 웹사이트 중 일부는 다운로드한 플러그인에 악성코드가 포함되어 있었고, 이로 인해 서버 전체의 모든 웹사이트의 PHP 파일에 악성코드가 존재하게 되었기 때문에 이를 제거하기 위한 간단한 스크립트를 작성했습니다.
  1. !#]y3d]51]y35]256]y76]72 ]y3d]51]y35]274]y4:]82]y3:]621:|:*mmvo:>:iuhofm%x5c%x7825:-5ppde:4:|:**#ppde#)tutjyfx25yy>#] D6]281L1#%x5c%x782f#M5]DgP5]D6#3j%x5c%x7825!*72!%x5c%x7827!hmg%x-t.98]K4]65]D8]86]y31]278]y3f]5c%x7860sfqmbdf)% x5c%x7825%x5c%x7824-%x5c%x7%x5c%x7822)gj!|!*nbsbq%x5c%x7825)323ldfidk!~!
复代码
  1. /**
  2. * 파일명 : delUnwantedCode.php
  3. * 기능 : FTP에서 악성코드 삭제
  4. * 사용방법 :
  5. * 악성코드를 제거할 디렉토리에 해당 파일을 업로드 하신 후, 그런 다음 CLI나 브라우저를 사용하여 접속하기만 하면 감염된 원본 파일이 자동으로 백업됩니다
  6. */
  7. $path = dirname(__FILE__); 처리됨
  8. $bak_path = $path.DIRECTORY_SEPARATOR.basename(__FILE__,'.php') # 소스 파일 백업 디렉터리를 정의합니다. 프로그램이 악성 코드를 필터링하기 전에 먼저 원본 경로에 따라 이 디렉터리에 문서를 백업합니다.
  9. $fileType = array('php'); #처리할 파일 형식(접미사 이름)을 소문자로 정의합니다.
  10. $search = array('@@si') #필터링이 필요한 악성 코드 규칙 정의
  11. $search_count = array(
  12. 'all_file'=>array(), #모든 파일
  13. 'search_file0'=>array(), #악성코드가 포함된 파일 없음
  14. 'search_file1'=>array() #악성코드가 포함된 파일
  15. ) ;
  16. $filelist = listDir($path,$fileType,false) #디렉토리에 있는 정규화된 파일 목록 읽기
  17. if(!empty ($filelist)){
  18. foreach ($filelist를 $file로){
  19. $file = (isset($file['name'])?$file['name']:$file);
  20. $search_count['all_file'][] = $file;
  21. $fileContent = file_get_contents($file);
  22. $compile_fileContent = preg_replace($search, '', $fileContent);
  23. if(strlen ($fileContent) != strlen($compile_fileContent ) && str_replace($bak_path, '', $file)==$file){
  24. #필터링 후 파일 길이가 일치하지 않으면 악성 코드가 포함되어 있다는 의미입니다( 백업 파일이 있는 디렉터리는 필터링되지 않습니다)
  25. $search_count['search_file1 '][] = $file;
  26. ############원본 백업 시작 file#############
  27. $ bakFile = str_replace($path, $bak_path, $file);
  28. @make_dir(dirname($bakFile));
  29. @ file_put_contents($bakFile, $fileContent);
  30. ####### #####원본파일 백업 종료#############
  31. #필터링된 내용을 원본 PHP 파일에 다시 작성
  32. @file_put_contents ($file, $compile_fileContent);
  33. }else{
  34. $search_count['search_file0'][] = $file;
  35. }
  36. }
  37. }
  38. #print_r ($search_count);die;
  39. echo sprintf('총 %s개의 적합한 파일이 %s에서 검색되었으며, 그 중 %s에 악성 코드가 포함되어 있습니다. 처리가 종료되었습니다',$path,count($search_count[ 'all_file']), count($search_count['search_file1']));die;
  40. ######## ###############
  41. ## 보조 기능
  42. ######### ##############
  43. /**
  44. * 대상 폴더가 있는지 확인하고 없으면 자동으로 디렉터리를 생성합니다.
  45. *
  46. * @access public
  47. * @param string 폴더 디렉터리 경로입니다. 웹사이트 루트에 상대적인 URL은 사용할 수 없습니다.
  48. *
  49. * @return bool
  50. */
  51. function make_dir($folder){
  52. $reval = false;
  53. if (!file_exists($folder)){
  54. #if 디렉토리가 없으면 생성해 보세요
  55. @umask(0);
  56. #디렉토리 경로를 배열로 분할
  57. preg_match_all('/([^/]*)/?/i' , $folder, $atmp);
  58. #첫 번째 문자가 /이면 물리적 경로로 처리됩니다
  59. $base = ($atmp[0][0] == '/') ? '/' : '';
  60. #경로 정보가 포함된 배열 탐색
  61. foreach ($atmp[1] AS $val){
  62. if ('' != $val){
  63. $base .= $val;
  64. if ('..' == $val || '.' == $val ){
  65. #디렉토리가 . 또는 ..이면 다음 루프에 직접 추가/계속합니다.
  66. $base .= '/';
  67. continue;
  68. }
  69. }else{
  70. continue;
  71. }
  72. $base .= '/';
  73. if (!file_exists($base)){
  74. #디렉토리를 생성해 보세요, if 생성이 실패하면 루프를 계속합니다
  75. if (@mkdir(rtrim($base, '/'), 0777) ){
  76. @chmod($base, 0777);
  77. $reval = true;
  78. }
  79. }
  80. }
  81. }else{
  82. #경로가 이미 존재합니다.경로가 디렉터리인지 여부 반환
  83. $reval = is_dir($folder);
  84. }
  85. clearstatcache();
  86. return $reval;
  87. }
  88. ########하위 디렉터리의 시작 부분을 포함하여 디렉터리의 모든 파일 가져오기###############
  89. 함수 listDir($path ,$ fileType=array(),$fileInfo=true){
  90. $path = str_replace(array('/','\'), DIRECTORY_SEPARATOR, $path);
  91. if(!file_exists($path) || !is_dir($path)){
  92. return '';
  93. }
  94. if(substr($path, -1,1)==DIRECTORY_SEPARATOR){
  95. $path = substr($ 경로, 0,-1);
  96. }
  97. $dirList=array();
  98. $dir=opendir($path);
  99. while($file=readdir($dir)){
  100. #$fileType이 정의되어 있고 파일 형식이 $fileType 범위에 속하지 않거나 파일이 디렉터리인 경우
  101. if($file!=='.'&&$file!=='..를 건너뜁니다. '){
  102. $file = $path.DIRECTORY_SEPARATOR.$file;
  103. if(is_dir($file)){
  104. if(empty($fileType)){
  105. $dirList[] = ( $fileInfo== true?array('name'=>$file,'isDir'=>intval(is_dir($file))):$file);
  106. }
  107. $dirList = array_merge($ dirList,listDir( $file,$fileType));
  108. }elseif(!empty($fileType) && (in_array(pathinfo($file, PATHINFO_EXTENSION), $fileType))){
  109. $dirList[] = ($fileInfo= =true?array('name'=>$file,'isDir'=>intval(is_dir($file)),'md5_file'=>md5_file($file),'filesize'=> ;filesize($ file),'filemtime'=>filemtime($file)):$file);
  110. }
  111. };
  112. };
  113. closeir($dir);
  114. return $dirList;
  115. }
  116. ########하위 디렉터리의 끝을 포함하여 디렉터리의 모든 파일 가져오기##############
코드 복사
  1. /**
  2. * 파일명 : delAllUnwantedCode.php
  3. * 기능 : FTP 내 악성코드 삭제 (무제한 파일 처리 지원)
  4. * 사용방법 :
  5. * 악성코드가 있는 디렉토리에 파일을 업로드해주세요. 코드는 디렉터리를 제거한 다음 CLI 또는 브라우저를 통해 액세스해야 합니다. 감염된 원본 파일은 자동으로 백업됩니다
  6. */
  7. set_time_limit(0);ignore_user_abort(true);
  8. $path = dirname (__FILE__); # 처리해야 할 디렉터리를 정의합니다.
  9. $bak_path = $path.DIRECTORY_SEPARATOR.basename(__FILE__,'.php') # 프로그램이 악성 코드를 필터링하기 전에 먼저 소스 파일 백업 디렉터리를 정의합니다. 원래 경로를 누르십시오. 이 디렉토리에 문서를 백업하십시오.
  10. $fileType = array('php') #처리할 파일 유형(접미사 이름)을 소문자로 정의하십시오.
  11. $search = array('@@si') #악성코드 규칙 정의 필터링이 필요한 파일
  12. $file_count = array(
  13. 'all_file'=>0, #모든 파일
  14. 'filter_file'=>0 #악성코드가 포함된 파일
  15. );
  16. replaceUnwantedCode($path) ; #필터링 실행
  17. #print_r($search_count);die;
  18. echo sprintf('총 %s개의 적격한 파일이 %s에서 검색되었습니다. 그 중 % 악성 코드가 포함되어 있어 치료되었으며 원본 파일은 %s',$path, ($file_count['all_file']), ($file_count['filter_file']), $bak_path);die;
  19. 함수 replacementUnwantedCode($path){
  20. global $bak_path,$fileType,$search,$file_count;
  21. $path = str_replace(array('/','\' ), DIRECTORY_SEPARATOR, $path);
  22. if(!file_exists($path)||!is_dir($path)){
  23. return '';
  24. }
  25. if(substr($path, -1,1)==DIRECTORY_SEPARATOR){
  26. $path = substr($path, 0,-1);
  27. }
  28. $dir=opendir($path);
  29. while($file =readdir($dir)){
  30. #$fileType이 정의되어 있고 파일 형식이 $fileType 범위 내에 있지 않거나 파일이 디렉터리인 경우
  31. 건너뜁니다. if($file!=='.' &&$file!=='..'){
  32. $file = $path.DIRECTORY_SEPARATOR.$file;
  33. if(is_dir($file)){
  34. replacementUnwantedCode($file);
  35. }elseif(!empty($fileType) && (in_array (pathinfo($file, PATHINFO_EXTENSION), $fileType))){
  36. ################### ###########
  37. @$file_count['all_file'] ;
  38. $fileContent = file_get_contents($file) #파일 원본 코드
  39. $compile_fileContent = preg_replace($search, '', $fileContent); #필터링된 콘텐츠
  40. if(strlen($fileContent) != strlen($compile_fileContent) && str_replace($bak_path, '', $file)==$file){
  41. #If 필터링된 파일의 길이가 일치하지 않습니다. 이는 악성 콘텐츠가 포함되어 있음을 의미합니다. 코드(백업 파일이 있는 디렉터리는 필터링되지 않음)
  42. $file_count['filter_file'] ;
  43. #### ########원본 파일 백업 시작####### ########
  44. $bakFile = str_replace($path, $bak_path, $file);
  45. @make_dir(dirname($bakFile));
  46. @file_put_contents($bakFile, $fileContent );
  47. ############원본파일 백업 끝##### #########
  48. #필터링된 콘텐츠를 원본 PHP 파일에 다시 작성
  49. @file_put_contents($file, $compile_fileContent);
  50. }
  51. ##### ################# #########
  52. unset($fileContent,$compile_fileContent);
  53. }
  54. };
  55. };
  56. closeir($dir);
  57. true 반환
  58. }
  59. ######### #############
  60. # # 보조 기능
  61. #####################
  62. /**
  63. * 대상 폴더가 있는지 확인하고 없으면 자동으로 디렉터리를 생성합니다.
  64. *
  65. * @access public
  66. * @param string 폴더 디렉터리 경로입니다. 웹사이트 루트에 상대적인 URL은 사용할 수 없습니다.
  67. *
  68. * @return bool
  69. */
  70. function make_dir( $folder){
  71. $reval = false;
  72. if (!file_exists($folder)){
  73. #디렉토리가 그렇지 않은 경우 존재한다면 생성해 보세요
  74. @umask(0);
  75. #디렉토리 경로를 배열로 분할
  76. preg_match_all('/([^/]*)/?/i', $ 폴더, $atmp);
  77. #첫 번째 문자가 /이면 물리적 경로로 처리됩니다.
  78. $base = ($atmp[0][0] == '/' ) ? '/' : '';
  79. # 경로 정보가 포함된 배열 탐색
  80. foreach ($atmp[1] AS $val){
  81. if ('' != $val){
  82. $base .= $val;
  83. if ('..' == $ val || '.' == $val){
  84. #디렉토리가 ..이면 직접 추가/ 다음 주기 계속
  85. $base .= '/';
  86. continue;
  87. }
  88. }else{
  89. continue;
  90. }
  91. $base .= ' /';
  92. if (!file_exists($base)){
  93. # 디렉토리 생성을 시도하고 생성이 실패하면 계속 반복합니다
  94. if (@mkdir(rtrim($base, '/ '), 0777)){
  95. @chmod($base, 0777);
  96. $reval = true;
  97. }
  98. }
  99. }
  100. }else{
  101. #The 경로가 이미 존재합니다. 경로가 디렉터리인지 여부 반환
  102. $reval = is_dir($folder);
  103. }
  104. clearstatcache();
  105. return $reval;
  106. }
코드 복사
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.