Помощь InstantCMS 2.3 и иже с ним. Чего следует опасаться?

Тема в разделе "InstantCMS", создана пользователем stealthdebuger, 10 ноя 2015.

Модераторы: Maybe
  1. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    628
    Симпатии:
    1.388
    Недавно у видела свет очередная версия InstantCMS. Случайно это совпало с моим желанием развеяться и решением зайти на оф.сайт данной CMS.
    В списке последних постов я увидал тему посвященную переводчику UniLang. Хвала автору, он действительно старался сделать полезное для сообщества и выложил свой труд для бесплатного скачивания. В данной работе автор использует функционал предоставляемый Яндекс.Переводчик и (еще один плюс в карму разработчику) он не забыл опубликовать требования Яндекс к контенту, полученному благодаря своему ресурсу.

    Первый, крайне не понравившийся мне момент был кусок кода в изменяемом автором /system/core/core.php
    PHP:
        public static function loadLanguage($file=false){

            
    $config cmsConfig::getInstance();

            
    $lang_dir 'system/languages/'UL_CURENT// unilang

            
    if (!$file){

                
    // Если файл не указан, то подключаем все php-файлы
                // из папки с текущим языком
                
    return self::getFilesList($lang_dir'*.php'truetrue);

            } else {

                
    // Если файл указан, то подключаем только его
                
    $lang_file $lang_dir .'/'.$file.'.php';
                return 
    self::includeFile($lang_file);

            }
        }
    Использование маски для подгружаемых файлов, особенно в совокупности с подставляемыми сторонним разработчиком данными, всегда не оставляет равнодушным и стимулирует желание изучить код дальше.
    Дальнейший поиск UL_CURENT привел меня к следующему коду в /system/controllers/activity/model.php который также модифицирует этот программист:
    PHP:
    $this->select('t.ul_'.UL_CURENT.'_description''ul_'.UL_CURENT.'_description'); // unilang
    Подстановка полученных из куки данных в SQL-запрос? ОК, надо проверить как происходит этот процесс и это приводит нас к такой строке: /system/core/user.php
    PHP:
    define('UL_CURENT'cmsUser::getCookie('ul_lang'));
    После этого я скачал с оф.сайта текущую версию InstantCMS под номером 2.3 и открыл функцию getCookie()
    PHP:
        public static function getCookie($key){
            if (isset(
    $_COOKIE['icms'][$key])){
                return 
    trim($_COOKIE['icms'][$key]);
            } else {
                return 
    false;
            }
        }
    Что мы имеем? Не отфильтрованную переменную, и в данном случае для формирования путей с последующим инклюдом *.php. У вас возникли идеи как это можно использовать? Путь, конечно, сложный и не во всех случаях возможен, но.... Дальнейшие фантазии оставляю на ваше усмотрение.
    Также, эти же, полученные из непроверенных cookie данные используются в SQL-запросе, вы помните? Остается проверить какой путь проходит он до выполнения. /system/core/database.php
    PHP:
        /**
         * Подготавливает строку перед запросом
         *
         * @param string $string
         * @return string
         */
        
    public function escape($string){
            return @
    $this->mysqli->real_escape_string($string);
        }
    Вот и все, что вас отделяет от конечной цели. real_escape_string() безусловно необходима, но только в совокупности с иными методами фильтрации, imho. Для тех, кому кажется, что защита обеспечена, хочу напомнить об иных методах выполнения sql-запросов. Вы понимаете что делает такой параметр в куках? -1; DROP ALL TABLES; -- или, такой \xbf\x27 OR 1=1 /*
    Если не понимаете вы, то поймет человек, которому это нужно.
     
    9l Marinka, tigraz_kill, MaxiSoft и 8 другим нравится это.
  2. davinchi2014

    davinchi2014 Создатель

    Регистр.:
    5 сен 2015
    Сообщения:
    12
    Симпатии:
    0
    Установил его.. Сразу же слетел компонент фрилансерс

    Unknown column 'u.is_online' in 'field list'

    SELECT i.*, u.avatar as user_avatar, u.nickname as user_nickname, u.karma as user_karma, u.is_online as is_online, u.status_text as statu, DATE_FORMAT( u.date_log, '%d.%m.%Y' ) as date_log, DATE_FORMAT( u.date_reg, '%d.%m.%Y' ) as date_reg, IFNULL(c.name, '') as city_name, IFNULL(c.id, 0) as city_id, COUNT(r.id) as portfolio, uc.name as cname, uu.name as uname
    FROM cms_freelancers i
    JOIN cms_users as u ON u.id = i.user_id
    LEFT JOIN cms_geo_cities as c ON c.id = u.city
    LEFT JOIN cms_freelancers_portfoliofile as r ON i.id = r.user_id
    LEFT JOIN cms_freelancers_cats as uc ON uc.id = i.cat_id
    LEFT JOIN cms_freelancers_uslugi as uu ON uu.id = i.uslugi
    WHERE (i.tupe = 'f') AND (i.tupe = 'f')
    GROUP BY i.id
    ORDER BY u.karma desc
    LIMIT 0, 10

    Вот такая фигня что делать то(
     
  3. mafru

    mafru Создатель.

    Регистр.:
    15 ноя 2007
    Сообщения:
    188
    Симпатии:
    65
    Вы что установили? Версию движка 2.3.0?
    Если вы про нее, то в новости про данную версию сказано:
    Судя по тексту вашей ошибки, именно в этом и проблема. У вас идет обращение к полю is_online
    Нужно ждать пока обновят версию вашего компонента фрилансер.
    Или сами ищите в файлах экшенов, где идет проверка пользователя на онлай и изменяйте, согласно инструкции.
     
  4. Phlaer

    Phlaer Писатель

    Регистр.:
    26 ноя 2012
    Сообщения:
    5
    Симпатии:
    0
    Сорри,может не в тему пишу но создать тему нет прав.Ставил на трёх хостингах,менял,чмоды и все такое но при входе в админку могу редактировать только контент.Настройки сайта ,,моды и все такое отсутствует.Перерыл всю инфу но ответа не нашёл ну а разрабы в танке.
     
  5. davinchi2014

    davinchi2014 Создатель

    Регистр.:
    5 сен 2015
    Сообщения:
    12
    Симпатии:
    0
    Все починил. Все что надо сделать, это добавить поле is_online типа TINYINT в таблицу cms_users.