• Добрый день!
    Случайно обнаружилась вредоносная рекламная вставка в код сайта приблизительно следующего содержания:

    <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. Снова ничего.

    Подскажите, откуда она может добавляться?
    Заранее благодарю.

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Подскажите, откуда она может добавляться?

    Из темы оформления.

    Из темы оформления.

    Просмотрел все файлы 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 &copy; 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>&nbsp;</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 ('&nbsp;' == $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;
    }
Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Тема «Взломан сайт, нужно убрать вставку» закрыта для новых ответов.