Выполнение произвольных команд в Symphony 1.7.01

Однажды я натолкнулся на 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!


4 comments:

  1. Pento, 2. August 2008, 23:05

    Тьфу, уже подумал про одноименный фремворк на PHP

     
  2. wi11son, 5. August 2008, 22:01

    Pento, ты не одинок))) Элитный сплоит получился 😉

     
  3. Raz0r, 5. August 2008, 23:59

    Название фреймворка на PHP пишется немного по-другому: Symfony

     
  4. ekim, 1. February 2009, 2:03

    тоже подумал про Symfony, но после фразы “использование XSLT в шаблонах” понял что не то. в Symfony шаблоны через жопу сделаны (неудобные совершенно)

     

Write a comment: