Сканнер уязвимостей CMS Drupal

drupalscan

Не секрет, что идеальных сканнеров уязвимостей не существует, особенно если такой сканнер стремится быть универсальным. Как правило, чем выше поле действия сканнера, тем ниже скорость работы, а также процент его эффективности. Эту идею подтверждает проект OWASP Joomla Vulnerability Scanner, который нацелен на самую популярную CMS. Испытав сканнер, я остался очень доволен результатами и решил написать нечто подобное для другого не менее известного продукта – CMS Drupal.

Drupal заслуженно является одной из самых безопасных CMS. Поддержка безопасности CMS в отличие от, к примеру, WordPress находится на более высоком уровне благодаря активному тестированию CMS специальной группой Drupal Security Team и своевременному выпуску патчей и апдейтов, что подтверждается доверием пользователей. Тем не менее, как и у любого популярного веб-приложения, у Drupal есть свои уязвимости, что и послужило основнанием для создания простого сканнера.

Презентация способов обхода XSS фильтров на BlackHat

BlackHatЕжегодно проводимая конференция BlackHat является одним из самых значимых событий в сфере информационной безопасности. В этом году эксперты из множества стран собрались в Лас Вегасе, чтобы показать и обсудить результаты своих исследований. Разумеется, не обошли стороной веб-безопасность – наиболее интересное выступление дали Эдуардо Вела (Eduardo Vela) и Дэвид Линдсэй (David Lindsay) на тему реализации XSS-атак в условиях WAF. Были затронуты практически все самые известные программные продукты, связанные с защитой от XSS как на стороне сервера, так и клиента: PHP-IDS, Mod_Security, XSSFilter в IE8, NoScript. Наиболее слабым оказался Mod_Security, поэтому авторы доклада рекомендуют использовать PHP-IDS вместо него. XSSFilter, изначально неспособный защитить от всех типов XSS (по словам разработчиков из MS в силу производительности браузера), также был повержен несколькими новыми XSS-векторами. На уровне клиента докладчики посоветовали использовать Firefox+NoScript, хотя и для последнего были найдены способы обхода. Ознакомиться с материалами выступления можно на сайте одного из авторов. Презентация получилась немалой – более 100 страниц. Много внимания уделено новым XSS-векторам, некоторые из которых просто поражают воображение. Только взгляните:

(É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''
+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)

За этим, казалось бы, беспорядочным набором символов кроется всем известный javascript:alert(1);. Кроме того, показаны примеры XSS, которые могут возникнуть в будущем с внедрением HTML5, а также уязвимость в PHP-функции utf8_decode(), позволяющая эксплуатировать неправильную обработку UTF-8. В целом, доклад, если не инновационный с точки зрения способов обхода, то уж точно приносящий много пищи для размышления, как разработчикам, так и взломщикам.

Новая техника быстрого извлечения данных при SQL-инъекциях в MSSQL

Прежде всего хочу поделиться ценной ссылкой – http://www.indianz.ch/. Данный ресурс имеет огромный и постоянно обновляемый каталог утилит и программ, имеющих отношение к информационной безопасности и взлому – от полезных скриптов в несколько десятков строк до таких монстров как metasploit. Именно здесь я нашел PoC, реализующий способ, который позволяет извлекать таблицы целиком за один запрос при SQL-инъекциях в MSSQL.

Новая техника называется SFX-SQLi – Select For Xml SQL Injection. В ее основе лежит применение оператора FOR XML для SELECT, который впервые появился в MSSQL 2000 и служит для преобразования результата выборки в формат данных XML, при чем на выходе всегда будет одна строка. Пример:

	SELECT *
	FROM [test].[dbo].[articles]
	FOR XML RAW

sfxsqli1

Несмотря на то, что оператор FOR XML известен еще со времен SQL Server 2000, техника SFX-SQLi получила освещение лишь в феврале этого года в работе Daniel Kachakil. Тем не менее, некоторые специалисты указывают на упоминание применения FOR XML в SQL-инъекциях еще в 2007 году.

MySQL бэкдор для Windows

В одном из своих постов однажды я уже упоминал возможность создания SQL-бэкдоров, в частности для MySQL. В отличие от MSSQL и Oracle, где имеются широкие возможности по созданию сложных хранимых процедур и функций, для MySQL проблема безопасности внутренней инфраструктуры баз данных является не столь освещенной и разработанной. Прежде всего это связано с отсутствием средств для создания различного рода malware на уровне БД, а именно встроенного скриптового языка – имеется лишь ограниченный набор конструкций для создания простейших циклов и условий. Но недавно случайно для себя обнаружил довольно любопытный пример MySQL-бэкдора, основанный на использовании UDFUser-Defined Functions (определяемые пользователем функции). Такое средство призвано расширить функционал MySQL с помощью специально оформленного и предварительно скомпилированного кода на C++, который реализует дополнительные возможности в контексте базы данных, при чем использование таких функций ни чем не отличается от любых других встроенных функций. Представленный выше бэкдор работает только под Windows XP, так как для создания UDF-функции необходимы права на запись в папку, содержащую системные библиотеки. В старых версиях MySQL этой директорией была С:/mysql/bin/, но в версиях > 5.1 поиск необходимой dll будет производиться в C:/windows/system32/. В любом случае, в Windows Vista трюк с UDF работать не будет, так как UAC не позволит записать ни в одну из этих папок.

Альтернатива NULL-byte при LFI или новая уязвимость в PHP

Уязвимость в PHP, о которой пойдет речь в данной статье, была обнаружена в декабре 2008 пользователем форума sla.ckers.org под ником barbarianbob. В одном из своих ответов он предложил новый способ реализации локального инклуда, когда атакующий имеет возможность указывать произвольное имя файла, но не способен отбросить расширение при включенной директиве PHP magic_quotes_gpc в виду того факта, что широко используемый в таких целях NULL-byte (0x00) подвергается экранированию и, как следствие, становится неэффективным. Значение подобного способа невозможно переоценить, так как на данный момент почти все LFI-векторы основаны на использовании NULL-байта и, как правило, имеют данное ограничение. До настоящего времени информация оставалась незамеченной, но недавно итальянская команда USH опубликовала уникальный материал, расширяющий понимание новой уязвимости и дополняющий представление о ее причинах и других способах реализации.

SQL-инъекции и PROCEDURE ANALYSE()

PROCEDURE ANALYSE() – это процедура MySQL, которая исследует запрос и предлагает оптимальные типы данных для каждой колонки, участвующей в запросе. Процедура работает во всех версиях MySQL, начиная с третьей.

Синтаксис:
SELECT … FROM … WHERE … PROCEDURE ANALYSE([max_elements,[max_memory]])

При вызове процедуры, весь результат запроса переписывается и возвращаются следующие данные:

mysql> SELECT user_login, user_pass FROM wp_users WHERE ID=1 PROCEDURE ANALYSE();
+------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+

| Field_name             | Min_value                          | Max_value                          | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std  | Optimal_fieldtype                                   |

+------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+

| wp.wp_users.user_login | admin                              | admin                              |          5 |          5 |                0 |     0 | 5.0000                  | NULL | ENUM('admin') NOT NULL                              |
| wp.wp_users.user_pass  | $P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0 | $P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0 |         34 |         34 |                0 |     0 | 34.0000                 | NULL | ENUM('$P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0') NOT NULL |

+------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+

2 rows in set (0.00 sec)

Ни один из аргументов PROCEDURE ANALYSE() не позволяет использовать подзапросы внутри них, однако процедуру можно использовать в SQL-инъекциях для получения имен колонок, которые участвуют в выборке, таблицы и текущей базы данных. Особенно это актуально для MySQL версии 4, где нет системной базы данных information_schema, хранящей информацию о всех БД, таблицах и их колонках.

Эффективный и быстрый пентестинг веб-приложений с Burp Suite

Burp Suite – это набор относительно независимых кроссплатформенных приложений, написанных на Java, призванных решать повседневные задачи пентестера. Ядром программы является Burp Proxy, выполняющий функции локального прокси-сервера; остальные компоненты набора – это Spider, Intruder, Repeater, Sequencer, Decoder и Comparer. Все составляющие связаны между собой в единое целое таким образом, что данные могут быть отправлены в любую часть приложения, например из Proxy в Intruder для проведения различных проверок над веб-приложением, из Intruder в Repeater – для более тщательного ручного анализа HTTP-заголовков. Все компоненты заслуживают особого внимания, поэтому хотел бы рассказать о каждом из них.

Burp Suite

Бэкдор в триггере

Нередко случается, что все руткиты/бэкдоры/веб-шеллы, полученные взломщиком с большими усилиями, однажды обнаруживаются администратором сервера и безвозвратно удалются. Чтобы закрепиться в системе как можно дольше, используется множество способов, большинство из которых сводится к хранению бэкдора непосредственно в файловой системе. У меня возникла идея хранить “черный ход” в систему в триггерах базы данных.

Триггер – это особая хранимая процедура, которая выполняется при наступлении определенного события на уровне таблицы базы данных. Этими событиями обычно являются использование операторов INSERT, UPDATE, DELETE. Главная особенность триггера заключается в том, что хранимая процедура, которую по сути он представляет собой, вызывается не пользователем, а самой базой данных и только при определенном условии.

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

GROUP_CONCAT()

Функция GROUP_CONCAT() позволяет объединить в одну строку несколько записей из таблицы, при этом можно задавать свой собственный символ разделения, а также воспользоваться операторами DISTINCT, ORDER BY, ASC/DESC. Впервые функция появилась в MySQL версии 4.1. Полный синтаксис и примеры использования можно посмотреть в официальной документации MySQL.

В SQL-инъекции GROUP_CONCAT() может пригодиться при получении списка баз данных, таблиц и их колонок из information_schema (разумеется, при MySQL 5.*).

SQL Column Truncation в WordPress

Вот и появился первый эксплоит для уязвимости SQL Column Truncation, о чем не так давно писал Стефан Эссер, специалист, обнаруживший данную уязвимость. Причем дыра найдена не в каком-нибудь малоизвестном движке, а в WordPress! Тем не менее повода для паники нет, так как уязвимость некритична: все что удастся нападающему – это сменить пароль администратору, но узнать его не получится. Кроме того, на атакуемом блоге должна быть включена опция регистрации пользователей.

PoC: http://milw0rm.com/exploits/6397

Также читайте мою статью, посвященную SQL Column Truncation.