同社の Wordpress Web サイトの一部には、ダウンロードしたプラグインに悪意のあるコードが含まれており、その結果、サーバー全体のすべての Web サイトの PHP ファイルに悪意のあるコードが存在することになったので、それらを削除する簡単なスクリプトを作成しました。
- !#]y3d]51]y35]256]y76 ]72]y3d]51]y35]274]y4:]82]y3:]621:|:*mmvo:>:iuhofm%x5c%x7825:-5ppde:4:|:**#ppde#)tutjyf% 7825yy>#]D6]281L1#%x5c%x782f#M5]DgP5]D6#!tus%x5x782fq%x5c%x7825>2q%x5c%x7825!{e %x5c%7827pd%x5c%x78256>X)!gjZb%x5c%x7825!**X)ufttj%x7825c:>11!#]D6M7]K3#j %x5c%x7825!*9!%x5c%x7827!hmg%x5c%x7825)!gj!~#]y31]278]y3e]81]K78:569x7827k:!ftmf!}Z;^nbsbq%x5c%x7825%x5c%x785cSFWtj%x5c%x7822)gj6<^#Y #%x5c%x785cq%x5c%x]y7f#!%x5c%x782400~:Ew:Qb:Qc:]37]278]225]241]334]368]322]3]364]6]283]2178}527}88:}334 }472%x55c%x7825hIr%x5c%x785c1^-%x5c%x7825r%x5c%x785c2^-5c%x782f#%x5c%x782f},;#-#}+;%x5c%x7825-qp%x5c%x7825) 5c%x782f*#npd%x5c%x782f#)rrd%x5c%x782f#00;quui#>.5j:>11
复制代
/**- * ファイル名: delUnwantedCode.php
- * 機能: FTP 内の悪意のあるコードを削除します
- * 使用方法:
- * 悪意のあるコードを削除する必要があるディレクトリにファイルをアップロードし、CLI またはブラウザを通じてアクセスしてください。元のファイルが感染している場合は、自動的にバックアップされます
- */
- $path = dirname(__FILE__); #処理するディレクトリを定義します
- $bak_path = $path.DIRECTORY_SEPARATOR.basename(__FILE__,'. php '); #ソース ファイルのバックアップ ディレクトリを定義します。プログラムは、最初に元のパスに従ってこのディレクトリにドキュメントをバックアップします
- $fileType = array('php'); #ファイル タイプを定義します。処理する必要があるサフィックス名)、小文字
- $search = array('@@si'); #フィルタリングが必要な悪意のあるコードのルールを定義します
- $search_count = array(
- 'all_file'=>array(), #すべてのファイル
- 'search_file0' =>array(), #悪意のあるコードはありません File
- 'search_file1'=>array() #悪意のあるコードを含むファイル
- );
-
-
- $filelist = listDir($path,$fileType,false);ディレクトリ内の修飾されたファイルのリスト
- if(!empty ($filelist)){
- foreach ($filelist as $file){
- $file = (isset($file['name'])?$file['name' ]:$file);
- $search_count['all_file '][] = $file;
- $fileContent = file_get_contents($file);
- $compile_fileContent = preg_replace($search, '', $fileContent);
- if(strlen ($fileContent) != strlen($compile_fileContent) && str_replace($bak_path, '', $file)==$file){
- #フィルタリング後のファイルの長さは矛盾しています。これは、悪意のあるコードが含まれていることを意味します(バックアップ ファイルが見つかった場合はフィルタリングされません)
- $search_count['search_file1'][] = $ file;
-
- ##########元のファイルのバックアップを開始します######## ######
- $bakFile = str_replace($path, $bak_path, $file );
- @make_dir(dirname($bakFile));
- @file_put_contents($bakFile, $fileContent);
- ##### #######元のファイルのバックアップの終了######## #######
-
- #フィルターされたコンテンツを元の PHP ファイルに書き換えます
- @file_put_contents($file, $compile_fileContent );
- }else{
- $search_count['search_file0'][] = $ file;
- }
- }
- }
-
- #print_r($search_count);die;
- echo sprintf('合計 %s 個の修飾されたファイルは%s から検索されました。そのうち %s には悪意のあるコードが含まれており、処理は完了しました ',$path,count($search_count['all_file']), count($search_count['search_file1']));die;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #########################
- ## 補助function
- ################ ########
-
- /**
- * 対象のフォルダーが存在するかどうかを確認し、存在しない場合はディレクトリを自動的に作成します
- *
- * @access public
- * @param string フォルダーのディレクトリ パス。 Web サイトのルートに対する相対 URL は使用できません
- *
- * @return bool
- */
- function make_dir($folder){
- $reval = false;
- if (!file_exists($folder)){
- #ディレクトリが存在しない場合は、ディレクトリを作成してみます
- @umask(0);
-
- #ディレクトリ パスを配列に分割します
- preg_match_all('/([^ /]*)/?/i', $folder, $atmp);
-
- #If 最初の文字が / の場合、物理パスとして扱われます
- $base = ($atmp[0][0] = = '/') ? '/' : '';
-
- #パス情報を含む配列を走査します
- foreach ($atmp[1] AS $val){
- if ('' != $val){
- $base . = $val;
- if ('..' == $val || '.' == $val ){
- #ディレクトリが . または... の場合は、次のサイクルに直接追加/続行します
- $base 。 = '/';
- continue;
- }
- }else{
- continue;
- }
-
- $base .= '/ ';
-
- if (!file_exists($base)){
- #if ディレクトリを作成してみます作成は失敗します。ループを続行します
- if (@mkdir(rtrim($base, '/'), 0777)){
- @chmod( $base, 0777);
- $reval = true;
- }
- }
- }
- }else{
- #パスはすでに存在します。パスがディレクトリかどうかを返します
- $reval = is_dir($folder);
- }
-
- clearstatcache();
-
- return $reval;
- }
-
-
- ######ディレクトリ内のすべてのファイルを取得します, サブディレクトリの先頭を含めます################
- function listDir($path,$fileType=array(),$fileInfo=true){
- $path = str_replace(array( '/ ','\'), DIRECTORY_SEPARATOR, $path);
- if(!file_exists($path)||!is_dir($path)){
- return '';
- }
- if(substr($path, - 1, 1)==DIRECTORY_SEPARATOR){
- $path = substr($path, 0,-1);
- }
- $dirList=array();
- $dir=opendir($path);
- while($file= readdir( $dir)){
- #$fileType が定義されていて、ファイル タイプが $fileType の範囲内にない場合、またはファイルがディレクトリの場合は、
- if($file!=='.'&&$file!=) をスキップします。 ='.. '){
- $file = $path.DIRECTORY_SEPARATOR.$file;
- if(is_dir($file)){
- if(empty($fileType)){
- $dirList[] = ($fileInfo== true?array( 'name'=>$file,'isDir'=>intval(is_dir($file))):$file);
- }
- $dirList = array_merge($dirList,listDir($file,$ fileType));
- }elseif(!empty($fileType) && (in_array(pathinfo($file, PATHINFO_EXTENSION), $fileType))){
- $dirList[] = ($fileInfo==true?array('name') =>$ file,'isDir'=>intval(is_dir($file)),'md5_file'=>md5_file($file),'filesize'=>filesize($file),'filemtime'=> ;filemtime($ file)):$file);
- }
- };
- };
- Closedir($dir);
- return $dirList;
- }
- ######ディレクトリ内のすべてのファイルを取得します。サブディレクトリの末尾を含む# ###############
-
コードをコピー
/**- * ファイル名: delAllUnwantedCode.php
- * 機能: FTP 内の悪意のあるコードを削除 (任意の数のファイル処理をサポート)
- * 使用方法:
- * 悪意のあるコードを削除する必要があるディレクトリにファイルをアップロードし、その後、CLI またはブラウザを使用してアクセスするだけで、元の感染ファイルが自動的にバックアップされます
- */
- set_time_limit(0);ignore_user_abort(true);
- $path = dirname(__FILE__); #処理が必要なディレクトリを定義します
- $bak_path = $path .DIRECTORY_SEPARATOR.basename(__FILE__,'.php'); #ソース ファイルのバックアップ ディレクトリを定義します。プログラムが悪意のあるコードをフィルタリングする前に、最初に元のパスに従ってドキュメントをこのディレクトリにバックアップします
- $fileType = array ('php'); #定義 処理するファイルの種類 (サフィックス名)、小文字
- $search = array('@@si'); #フィルタリングが必要な悪意のあるコード ルールを定義します
- $file_count = array(
- 'all_file'=>0, #すべてのファイル
- 'filter_file'=> 0 #悪意のあるコードを含むファイル
- );
-
- replaceUnwantedCode($path); #フィルタリングを実行
-
- #print_r($search_count);die;
- echo sprintf('合計 %条件を満たす s ファイルが %s から検索されました。悪意のあるコードを含む %s は削除され、元のファイルは %s',$path, ($file_count['all_file']), ($file_count) に保存されています['filter_file']), $bak_path);die;
-
-
-
- function replaceUnwantedCode($path){
- global $bak_path,$fileType,$search,$file_count;
- $path = str_replace(array('/', '\'), DIRECTORY_SEPARATOR, $path);
- if(! file_exists($path)||!is_dir($path)){
- return '';
- }
- if(substr($path, -1,1) ==DIRECTORY_SEPARATOR){
- $path = substr($path, 0 ,-1);
- }
- $dir=opendir($path);
- while($file=readdir($dir)){
- #If $fileTypeが定義されており、ファイル タイプが $fileType の範囲内にないか、ファイルがディレクトリである場合は、
- if($file!=='.'&&$file!=='..'){
- $file = $ をスキップしてください。 path.DIRECTORY_SEPARATOR.$file;
- if(is_dir($file)){
- replaceUnwantedCode($file);
- }elseif(!empty($fileType) && (in_array(pathinfo($file, PATHINFO_EXTENSION), $fileType)) ){
- ############## #################
- @$file_count['all_file']++;
- $fileContent = file_get_contents($file); #元のコードをファイルする
- $compile_fileContent = preg_replace( $search, '', $fileContent); #フィルターされたコンテンツ
- if(strlen($fileContent) != strlen($compile_fileContent) && str_replace($bak_path, '', $file)==$file){
- # フィルタリング後のファイルの長さが一致しない場合は、悪意のあるコードが含まれていることを意味します (バックアップ ファイルが配置されているディレクトリはフィルタリングされていません)
- $file_count['filter_file ']++;
-
- ############元のファイルのバックアップを開始# ################
- $bakFile = str_replace($path, $ bak_path, $file);
- @make_dir(dirname($bakFile));
- @file_put_contents($bakFile, $fileContent );
- ############元のファイルのバックアップの終了## ############
-
- #フィルターされたコンテンツを元の PHP ファイルに書き換えます
- @file_put_contents($file, $compile_fileContent);
- }
- ############ ###################
- unset( $fileContent,$compile_fileContent);
- }
- };
- };
- Closedir($dir);
- return true;
- }
-
-
-
-
-
- ################ ######
- ## 補助機能
- ############## ######
-
- /**
- * 対象のフォルダーが存在するかどうかを確認し、存在しない場合はディレクトリを自動的に作成します
- *
- * @access public
- * @param string フォルダーのディレクトリ パス。 Web サイトのルートに対する相対 URL は使用できません
- *
- * @return bool
- */
- function make_dir($folder){
- $reval = false;
- if (!file_exists($folder)){
- #ディレクトリが存在しない場合存在するので作成してみてください
- @umask(0);
-
- #ディレクトリパスを配列に分割します
- preg_match_all('/([^/]*)/?/i', $folder, $atmp);
-
- #最初の文字が / の場合、物理パスとして扱われます
- $base = ($atmp[0][0] == '/') ? '/' : '';
-
- #パスを含む配列を走査します情報
- foreach ($atmp[1] AS $val){
- if ('' != $val ){
- $base .= $val;
- if ('..' == $val || '.' = = $val){
- #ディレクトリが . または.. の場合、次のサイクルに直接追加/続行します
- $base .= '/';
- continue;
- }
- }else{
- continue;
- }
-
- $ base .= '/';
-
- if (!file_exists($base)){
- #ディレクトリを作成してみます、作成が失敗した場合はループを継続します
- if (@mkdir(rtrim($base, '/'), 0777 )){
- @chmod($base, 0777);
- $reval = true;
- }
- }
- }
- } else{
- #パスはすでに存在します。パスがディレクトリかどうかを返します
- $reval = is_dir($folder);
- }
-
- clearstatcache();
-
- return $reval;
- }
-
-
コードをコピー
|