Взломан сайт, нужно убрать вставку
-
Добрый день!
Случайно обнаружилась вредоносная рекламная вставка в код сайта приблизительно следующего содержания:<div style="position:absolute;left:-1245px;width:-2356px;">Понравился мой блог xxxxx? Тогда советую Вам почитать <a href="http://www.xxxxxx.ru/tag/dieta-erekciya/">диета эрекция</a> и <a href="http://www.xxxxx.ru/tag/gripp-v-moskve/">грипп в Москве</a>.</div>
При этом в шаблоне этой вставки нет. После кода от Google Analytics сразу идут закрывающие тэги.
footer.php:
<script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> [вредоносная вставка вставляется сюда (перед вставкой множество пробелов, чтобы было сложнее заметить, при этом в footer.php здесь пустая строка] </body> </html>
А вставляемый откуда-то код, процитированный выше появляется между кодом от Google и тэгами </body> и </html>.
Скачивал все файлы с FTP и пытался найти вставку поиском по подстроке. Ничего не нашлось.
Также пробовал искать эту вставку в БД, относящейся к WordPress. Снова ничего.Подскажите, откуда она может добавляться?
Заранее благодарю.
-
Подскажите, откуда она может добавляться?
Из темы оформления.
Из темы оформления.
Просмотрел все файлы footer.php из установленных тем. Нет там такого кода. В текущей точно нет. Интерфейс WP показывает ровно то же содержимое footer.php, что и фактически есть в этом файле (при просмотре в текстовых редакторах). Поэтому не думаю, что тема. Хотя я могу не всё знать о генерации страниц в WP.
Вставка идёт на каждой странице сайта. Т.е. вроде как похоже на то, что она в шаблоне, но в шаблоне не вижу.ищите в functions.php
Ссылку можете предоставить на тему оформления, где ее брали?
ищите в functions.php
Спасибо, попробую поискать.
Ссылку можете предоставить на тему оформления, где ее брали?
К сожалению, уже вряд ли. Эта тема на нашем сайте уже более года висит. Она допиливалась и перерабатывалась вручную. Название — a524, расположена в папке noutbook, что мне ни о чём не говорит.
Увидели эту вставку, когда тестировали Яндекс.Острова на днях. Вбили название организации, и увидели, что в верхнем же результате добавлено про то, что если понравился блог, то можно посмотреть ещё вот это (дальше — по тексту вставки). Обратились в Яндекс с вопросом, откуда это взялось. И они ответили, что вообще-то у нас такой код есть на главной странице.
Мы используем некоторые дополнения (плагины) к WordPress, конечно, но они все брались с официального репозитория WP, хотя говорят, что теоретически плагины могут тоже давать такой эффект.
Собственно, вот файл functions.php из используемой темы. Криминала здесь не нашёл, но, может, кто увидит.
<?php $artThemeSettings = array( 'menu.showSubmenus' => true, 'menu.homeCaption' => "ГлавнаÑ", 'menu.showHome' => true, 'menu.topItemBegin' => "<span class=\"l\"></span><span class=\"r\"></span><span class=\"t\">", 'menu.topItemEnd' => "</span>" ); load_theme_textdomain('kubrick'); $themename = "a524"; $shortname = "artisteer"; $default_footer_content = "<a href='#'>Contact Us</a> | <a href='#'>Terms of Use</a> | <a href='#'>Trademarks</a> | <a href='#'>Privacy Statement</a><br/>Copyright © 2009 ".get_bloginfo('name').". All Rights Reserved."; $options = array ( array( "name" => "HTML", "desc" => sprintf(__('<strong>XHTML:</strong> You can use these tags: <code>%s</code>', 'kubrick'), 'a, abbr, acronym, em, b, i, strike, strong, span'), "id" => "art_footer_content", "std" => $default_footer_content, "type" => "textarea") ); function art_update_option($key, $value){ update_option($key, (get_magic_quotes_gpc()) ? stripslashes($value) : $value); } function art_add_admin() { global $themename, $shortname, $options; if ( $_GET['page'] == basename(__FILE__) ) { if ('save' == $_REQUEST['action'] ) { foreach ($options as $value) { if($value['type'] != 'multicheck'){ art_update_option( $value['id'], $_REQUEST[ $value['id'] ] ); }else{ foreach($value['options'] as $mc_key => $mc_value){ $up_opt = $value['id'].'_'.$mc_key; art_update_option($up_opt, $_REQUEST[$up_opt] ); } } } foreach ($options as $value) { if($value['type'] != 'multicheck'){ if( isset( $_REQUEST[ $value['id'] ] ) ) { art_update_option( $value['id'], $_REQUEST[ $value['id'] ] ); } else { delete_option( $value['id'] ); } }else{ foreach($value['options'] as $mc_key => $mc_value){ $up_opt = $value['id'].'_'.$mc_key; if( isset( $_REQUEST[ $up_opt ] ) ) { art_update_option( $up_opt, $_REQUEST[ $up_opt ] ); } else { delete_option( $up_opt ); } } } } header("Location: themes.php?page=functions.php&saved=true"); die; } } add_theme_page("Footer", "Footer", 'edit_themes', basename(__FILE__), 'art_admin'); } function art_admin() { global $themename, $shortname, $options; if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings saved.</strong></p></div>'; ?> <div class="wrap"> <h2>Footer</h2> <form method="post"> <table class="optiontable" style="width:100%;"> <?php foreach ($options as $value) { switch ( $value['type'] ) { case 'text': option_wrapper_header($value); ?> <input style="width:100%;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if ( get_settings( $value['id'] ) != "") { echo get_settings( $value['id'] ); } else { echo $value['std']; } ?>" /> <?php option_wrapper_footer($value); break; case 'select': option_wrapper_header($value); ?> <select style="width:70%;" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>"> <?php foreach ($value['options'] as $option) { ?> <option<?php if ( get_settings( $value['id'] ) == $option) { echo ' selected="selected"'; } elseif ($option == $value['std']) { echo ' selected="selected"'; } ?>><?php echo $option; ?></option> <?php } ?> </select> <?php option_wrapper_footer($value); break; case 'textarea': $ta_options = $value['options']; option_wrapper_header($value); ?> <textarea name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" style="width:100%;height:100px;"><?php if( get_settings($value['id']) !== false) { echo get_settings($value['id']); }else{ echo $value['std']; }?></textarea> <?php option_wrapper_footer($value); break; case "radio": option_wrapper_header($value); foreach ($value['options'] as $key=>$option) { $radio_setting = get_settings($value['id']); if($radio_setting != ''){ if ($key == get_settings($value['id']) ) { $checked = "checked=\"checked\""; } else { $checked = ""; } }else{ if($key == $value['std']){ $checked = "checked=\"checked\""; }else{ $checked = ""; } }?> <input type="radio" name="<?php echo $value['id']; ?>" value="<?php echo $key; ?>" <?php echo $checked; ?> /><?php echo $option; ?><br /> <?php } option_wrapper_footer($value); break; case "checkbox": option_wrapper_header($value); if(get_settings($value['id'])){ $checked = "checked=\"checked\""; }else{ $checked = ""; } ?> <input type="checkbox" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="true" <?php echo $checked; ?> /> <?php option_wrapper_footer($value); break; case "multicheck": option_wrapper_header($value); foreach ($value['options'] as $key=>$option) { $pn_key = $value['id'] . '_' . $key; $checkbox_setting = get_settings($pn_key); if($checkbox_setting != ''){ if (get_settings($pn_key) ) { $checked = "checked=\"checked\""; } else { $checked = ""; } }else{ if($key == $value['std']){ $checked = "checked=\"checked\""; }else{ $checked = ""; } }?> <input type="checkbox" name="<?php echo $pn_key; ?>" id="<?php echo $pn_key; ?>" value="true" <?php echo $checked; ?> /><label for="<?php echo $pn_key; ?>"><?php echo $option; ?></label><br /> <?php } option_wrapper_footer($value); break; case "heading": ?> <tr valign="top"> <td colspan="2" style="text-align: center;"><h3><?php echo $value['name']; ?></h3></td> </tr> <?php break; default: break; } } ?> </table> <p class="submit"> <input name="save" type="submit" value="Save changes" /> <input type="hidden" name="action" value="save" /> </p> </form> </div> <?php } function option_wrapper_header($values){ ?> <tr valign="top"> <th scope="row" style="width:1%;white-space: nowrap;"><?php echo $values['name']; ?>:</th> <td> <?php } function option_wrapper_footer($values){ ?> </td> </tr> <tr valign="top"> <td> </td><td><small><?php echo $values['desc']; ?></small></td> </tr> <?php } add_action('admin_menu', 'art_add_admin'); if (!function_exists('get_search_form')) { function get_search_form() { include (TEMPLATEPATH . "/searchform.php"); } } if (!function_exists('get_previous_posts_link')) { function get_previous_posts_link($label) { ob_start(); previous_posts_link($label); return ob_get_clean(); } } if (!function_exists('get_next_posts_link')) { function get_next_posts_link($label) { ob_start(); next_posts_link($label); return ob_get_clean(); } } if (!function_exists('get_previous_post_link')) { function get_previous_post_link($label) { ob_start(); previous_post_link($label); return ob_get_clean(); } } if (!function_exists('get_next_post_link')) { function get_next_post_link($label) { ob_start(); next_post_link($label); return ob_get_clean(); } } function art_comment($comment, $args, $depth) { $GLOBALS['comment'] = $comment; ?> <li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>"> <div id="comment-<?php comment_ID(); ?>"> <div class="art-Post"> <div class="art-Post-tl"></div> <div class="art-Post-tr"></div> <div class="art-Post-bl"></div> <div class="art-Post-br"></div> <div class="art-Post-tc"></div> <div class="art-Post-bc"></div> <div class="art-Post-cl"></div> <div class="art-Post-cr"></div> <div class="art-Post-cc"></div> <div class="art-Post-body"> <div class="art-Post-inner art-article"> <div class="art-PostContent"> <div class="comment-author vcard"> <?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?> <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?> </div> <?php if ($comment->comment_approved == '0') : ?> <em><?php _e('Your comment is awaiting moderation.') ?></em> <br /> <?php endif; ?> <div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),' ','') ?></div> <?php comment_text() ?> <div class="reply"> <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?> </div> </div> <div class="cleared"></div> </div> </div> </div> </div> <?php } if (function_exists('register_sidebars')) { register_sidebars(2, array( 'before_widget' => '<!--- BEGIN Widget --->', 'before_title' => '<!--- BEGIN WidgetTitle --->', 'after_title' => '<!--- END WidgetTitle --->', 'after_widget' => '<!--- END Widget --->' )); } function art_normalize_widget_style_tokens($content) { $bw = '<!--- BEGIN Widget --->'; $bwt = '<!--- BEGIN WidgetTitle --->'; $ewt = '<!--- END WidgetTitle --->'; $bwc = '<!--- BEGIN WidgetContent --->'; $ewc = '<!--- END WidgetContent --->'; $ew = '<!--- END Widget --->'; $result = ''; $startBlock = 0; $endBlock = 0; while (true) { $startBlock = strpos($content, $bw, $endBlock); if (false === $startBlock) { $result .= substr($content, $endBlock); break; } $result .= substr($content, $endBlock, $startBlock - $endBlock); $endBlock = strpos($content, $ew, $startBlock); if (false === $endBlock) { $result .= substr($content, $endBlock); break; } $endBlock += strlen($ew); $widgetContent = substr($content, $startBlock, $endBlock - $startBlock); $beginTitlePos = strpos($widgetContent, $bwt); $endTitlePos = strpos($widgetContent, $ewt); if ((false == $beginTitlePos) xor (false == $endTitlePos)) { $widgetContent = str_replace($bwt, '', $widgetContent); $widgetContent = str_replace($ewt, '', $widgetContent); } else { $beginTitleText = $beginTitlePos + strlen($bwt); $titleContent = substr($widgetContent, $beginTitleText, $endTitlePos - $beginTitleText); if (' ' == $titleContent) { $widgetContent = substr($widgetContent, 0, $beginTitlePos) . substr($widgetContent, $endTitlePos + strlen($ewt)); } } if (false === strpos($widgetContent, $bwt)) { $widgetContent = str_replace($bw, $bw . $bwc, $widgetContent); } else { $widgetContent = str_replace($ewt, $ewt . $bwc, $widgetContent); } $result .= str_replace($ew, $ewc . $ew, $widgetContent); } return $result; } function art_sidebar($index = 1) { if (!function_exists('dynamic_sidebar')) return false; ob_start(); $success = dynamic_sidebar($index); $content = ob_get_clean(); if (!$success) return false; $content = art_normalize_widget_style_tokens($content); $replaces = array( '<!--- BEGIN Widget --->' => "<div class=\"art-Block\">\r\n <div class=\"art-Block-tl\"></div>\r\n <div class=\"art-Block-tr\"></div>\r\n <div class=\"art-Block-bl\"></div>\r\n <div class=\"art-Block-br\"></div>\r\n <div class=\"art-Block-tc\"></div>\r\n <div class=\"art-Block-bc\"></div>\r\n <div class=\"art-Block-cl\"></div>\r\n <div class=\"art-Block-cr\"></div>\r\n <div class=\"art-Block-cc\"></div>\r\n <div class=\"art-Block-body\">\r\n", '<!--- BEGIN WidgetTitle --->' => "<div class=\"art-BlockHeader\">\r\n <div class=\"art-header-tag-icon\">\r\n <div class=\"t\">", '<!--- END WidgetTitle --->' => "</div>\r\n </div>\r\n</div>", '<!--- BEGIN WidgetContent --->' => "<div class=\"art-BlockContent\">\r\n <div class=\"art-BlockContent-tl\"></div>\r\n <div class=\"art-BlockContent-tr\"></div>\r\n <div class=\"art-BlockContent-bl\"></div>\r\n <div class=\"art-BlockContent-br\"></div>\r\n <div class=\"art-BlockContent-tc\"></div>\r\n <div class=\"art-BlockContent-bc\"></div>\r\n <div class=\"art-BlockContent-cl\"></div>\r\n <div class=\"art-BlockContent-cr\"></div>\r\n <div class=\"art-BlockContent-cc\"></div>\r\n <div class=\"art-BlockContent-body\">\r\n", '<!--- END WidgetContent --->' => "\r\n </div>\r\n</div>\r\n", '<!--- END Widget --->' => "\r\n </div>\r\n</div>\r\n" ); $bwt = '<!--- BEGIN WidgetTitle --->'; $ewt = '<!--- END WidgetTitle --->'; if ('' == $replaces[$bwt] && '' == $replaces[$ewt]) { $startTitle = 0; $endTitle = 0; $result = ''; while (true) { $startTitle = strpos($content, $bwt, $endTitle); if (false == $startTitle) { $result .= substr($content, $endTitle); break; } $result .= substr($content, $endTitle, $startTitle - $endTitle); $endTitle = strpos($content, $ewt, $startTitle); if (false == $endTitle) { $result .= substr($content, $startTitle); break; } $endTitle += strlen($ewt); } $content = $result; } $content = str_replace(array_keys($replaces), array_values($replaces), $content); echo $content; return true; } function art_activeID($pages){ $result = null; foreach ($pages as $index => $page){ if (is_page($page->ID)) { $result = $page; break; } } while($result && $result->post_parent) { foreach ($pages as $parent){ if ($parent->ID == $result->post_parent) { $result = $parent; breack; } } } return ($result ? $result->ID : null); } function art_blogID($pages){ $result = null; if(!'page' == get_option('show_on_front')) return $result; $blogID = get_option('page_for_posts'); if (!$blogID) return $result; foreach ($pages as $index => $page){ if ($page->ID == $blogID) { $result = $page; break; } } while($result && $result->post_parent) { foreach ($pages as $parent){ if ($parent->ID == $result->post_parent) { $result = $parent; breack; } } } return ($result ? $result->ID : null); } function art_process_front(&$pages){ if ('page' != get_option('show_on_front')) return; $frontID = get_option('page_on_front'); if (!$frontID) return; foreach ($pages as $index => $page) if($page->ID == $frontID) { unset($pages[$index]); $page->post_parent = '0'; $page->menu_order = '0'; array_unshift($pages, $page); break; } } function art_topIDs($pages){ $result = array(); foreach ($pages as $index => $page) if (!$page->post_parent) $result[]=$page->ID; return $result; } function art_remove_subitems(&$pages){ foreach ($pages as $index => $page) if ($page->post_parent) unset($pages[$index]); } function art_header_page_list_filter($pages) { global $artThemeSettings; art_process_front($pages); $artThemeSettings['menu.topItemIDs'] = art_topIDs($pages); $artThemeSettings['menu.activeID'] = art_activeID($pages); $artThemeSettings['menu.blogID'] = art_blogID($pages); if (!$artThemeSettings['menu.showSubmenus']) art_remove_subitems($pages); return $pages; } function art_list_pages_filter($output) { global $artThemeSettings; $pref ='page-item-'; if($artThemeSettings['menu.topItemIDs']) foreach($artThemeSettings['menu.topItemIDs'] as $id){ $output = preg_replace('~<li class="([^"]*)\b(' . $pref . $id . ')\b([^"]*)"><a ([^>]+)>([^<]*)</a>~', '<li class="$1$2$3"><a $4>' . $artThemeSettings['menu.topItemBegin'] . '$5' . $artThemeSettings['menu.topItemEnd'] . '</a>', $output, 1); } $frontID = null; $blogID = null; if('page' == get_option('show_on_front')) { $frontID = get_option('page_on_front'); $blogID = $artThemeSettings['menu.blogID']; } if ($frontID) $output = preg_replace('~<li class="([^"]*)\b(' . $pref . $frontID . ')\b([^"]*)"><a href="([^"]*)" ~', '<li class="$1$2$3"><a href="'. get_option('home') .'" ', $output, 1); if ((is_home() && $blogID) || $artThemeSettings['menu.activeID']) $output = preg_replace('~<li class="([^"]*)\b(' . $pref . (is_home() ? $blogID : $artThemeSettings['menu.activeID']) . ')\b([^"]*)"><a ~', '<li class="$1$2$3"><a class="active" ', $output, 1); return $output; } function art_menu_items() { global $artThemeSettings; if (true === $artThemeSettings['menu.showHome'] && 'page' != get_option('show_on_front')) echo '<li><a' . (is_home() ? ' class="active"' : '') . ' href="' . get_option('home') . '">'.$artThemeSettings['menu.topItemBegin'] . $artThemeSettings['menu.homeCaption'] . $artThemeSettings['menu.topItemEnd'] . '</a></li>'; add_action('get_pages', 'art_header_page_list_filter'); add_action('wp_list_pages', 'art_list_pages_filter'); wp_list_pages('title_li='); remove_action('wp_list_pages', 'art_list_pages_filter'); remove_action('get_pages', 'art_header_page_list_filter'); } add_filter('comments_template', 'legacy_comments'); function legacy_comments($file) { if(!function_exists('wp_list_comments')) : // WP 2.7-only check $file = TEMPLATEPATH.'/legacy.comments.php'; endif; return $file; }
- Тема «Взломан сайт, нужно убрать вставку» закрыта для новых ответов.