stealthdebuger
Механик
- Регистрация
- 25 Авг 2008
- Сообщения
- 681
- Реакции
- 1.688
- Автор темы
- #1
Недавно у видела свет очередная версия InstantCMS. Случайно это совпало с моим желанием развеяться и решением зайти на оф.сайт данной CMS.
В списке последних постов я увидал тему посвященную переводчику UniLang. Хвала автору, он действительно старался сделать полезное для сообщества и выложил свой труд для бесплатного скачивания. В данной работе автор использует функционал предоставляемый Яндекс.Переводчик и (еще один плюс в карму разработчику) он не забыл опубликовать требования Яндекс к контенту, полученному благодаря своему ресурсу.
Первый, крайне не понравившийся мне момент был кусок кода в изменяемом автором /system/core/core.php
Использование маски для подгружаемых файлов, особенно в совокупности с подставляемыми сторонним разработчиком данными, всегда не оставляет равнодушным и стимулирует желание изучить код дальше.
Дальнейший поиск UL_CURENT привел меня к следующему коду в /system/controllers/activity/model.php который также модифицирует этот программист:
Подстановка полученных из куки данных в SQL-запрос? ОК, надо проверить как происходит этот процесс и это приводит нас к такой строке: /system/core/user.php
После этого я скачал с оф.сайта текущую версию InstantCMS под номером 2.3 и открыл функцию getCookie()
Что мы имеем? Не отфильтрованную переменную, и в данном случае для формирования путей с последующим инклюдом *.php. У вас возникли идеи как это можно использовать? Путь, конечно, сложный и не во всех случаях возможен, но.... Дальнейшие фантазии оставляю на ваше усмотрение.
Также, эти же, полученные из непроверенных cookie данные используются в SQL-запросе, вы помните? Остается проверить какой путь проходит он до выполнения. /system/core/database.php
Вот и все, что вас отделяет от конечной цели. real_escape_string() безусловно необходима, но только в совокупности с иными методами фильтрации, imho. Для тех, кому кажется, что защита обеспечена, хочу напомнить об иных методах выполнения sql-запросов. Вы понимаете что делает такой параметр в куках? -1; DROP ALL TABLES; -- или, такой \xbf\x27 OR 1=1 /*
Если не понимаете вы, то поймет человек, которому это нужно.
В списке последних постов я увидал тему посвященную переводчику 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', true, true);
} 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
PHP:
define('UL_CURENT', cmsUser::getCookie('ul_lang'));
PHP:
public static function getCookie($key){
if (isset($_COOKIE['icms'][$key])){
return trim($_COOKIE['icms'][$key]);
} else {
return false;
}
}
Также, эти же, полученные из непроверенных cookie данные используются в SQL-запросе, вы помните? Остается проверить какой путь проходит он до выполнения. /system/core/database.php
PHP:
/**
* Подготавливает строку перед запросом
*
* @param string $string
* @return string
*/
public function escape($string){
return @$this->mysqli->real_escape_string($string);
}
Если не понимаете вы, то поймет человек, которому это нужно.