Классовая борьба. Обзор уязвимостей в популярных PHP-классахМаг (icq 884888, http://wap-chat.ru) WordPress, Joomla, Drupal, Moodle – ты, наверняка, слышал об этих популярнейших CMS, написанных на PHP. А знаешь ли ты, что в них во всех для упрощения работы используются паблик-классы: kses, Snoopy и SpellChecker в составе TinyMCE? В каждом из этих классов злостными хакерами недавно были найдены бреши в безопасности, приводящие к самым разнообразным последствиям: от банальнейшего XSS до вполне серьезного code exec. Я постараюсь донести до тебя суть найденных уязвимостей – как в классах, так и в перечисленных CMS. Коварная орфографияВ качестве первого примера найденной уязвимости расскажу о code exec в модуле проверки орфографии популярного WYSIWYG-редактора TinyMCE.
В конфиге модуля config.php как раз и прописывается метод проверки:
Как видишь, по дефолту стоит проверка через Гугл, поэтому уязвимость может затронуть редкие движки с TinyMCE. Тем не менее, раскомментируй строчку $config['general.engine'] = 'PSpellShell'; и закомментируй проверку Гуглом. Теперь дальше. Взаимодействие со спеллчекером происходит через RPC-интерфейс (нововведение появилось в 3 версии TinyMCE и 2.5 версии WordPress, раньше все было проще - передача параметров POST и GET-пакетами). Сама уязвимость – в отсутствии должной фильтрации параметра lang при составлении параметров команды для консольной утилиты в файле ./wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php:
Для передачи нужной нам evil-команды в уязвимый класс надо знать синтаксис JSON-запросов. POST-пакет, который необходимо передать в скрипт rpc.php, будет примерно следующим:
Эксплойт, думаю, напишешь сам :). Пора перейти к уязвимостям посерьезнее. Добрый песик СнупиКроме того, что так зовут песика из мультфильма Уильяма Ханны и Джозефа Барберы, Snoopy – это еще и PHP-класс, эмулирующий работу браузера. Он позволяет получать содержимое страницы и отправлять данные форм, поддерживает прокси, переадресацию и кукисы. Как подсказывает поиск Гугла по опенсорсу (http://google.com/codesearch), этот класс юзают WordPress, TikiWiki, Xoops и другие, менее популярные, движки. Hассмотрим подробно функцию _httpsrequest():
В WordPress функция пропатчена самими разработчиками с помощью escapeshellcmd. Надеюсь, ты начал понимать ход моей мысли?
Но как, спросишь ты, будет выполняться код, если режется двойная кавычка, без которой невозможно передать дальнейшую последовательность команд вне определенного аргумента? Очень просто!
Командные интерпретаторы поддерживают хитрую последовательность команд в двойных кавычках через backticks (обратных кавычек). Выполни у себя на шелле следующий код:
На экране ты должен увидеть не просто надпись `id`, а полноценный вывод команды id. Исходя из полученной информации, рассмотрим подробную эксплуатацию уязвимости на примере популярной цмски XOOPS. Выгуливаем псаИтак, качай xoops-1.3.10 с официального сайта проекта (ссылку ищи в сносках) и следи за процессом реверсивного изучения движка: 1. Сам Снупи находится в ./html/class/snoopy.class.php, уязвимая функция _httpsrequest() вызывается через другую функцию fetch(); 2. Далее идем в файл ./class/phpsyndication.lib.php и видим следующий код:
Запоминаем функции getTitle() и getHtml(); 3. Идем в файл ./html/modules/headlines/blocks/headlines.php и видим в нем такой код:
Вот и весь путь бажного кода, заканчивающийся в функциях getTitle() и getHtml(). Алгоритм написания эксплойта будет примерно следующим:
Как видишь, процесс поиска использования Snoopy в движке оказался на поверку не таким уж и легким, но, поверь, покопаться в популярных движках стоит. Пищу для размышлений я тебе дал. Опасные регулярные выраженияНастал черед самого вкусного - множественные уязвимости в kses - PHP-классе для фильтрации пользовательского ввода. Kses используется в таких популярных проектах, как WordPress, Moodle, Drupal, eGroupware, Dokeos, PHP-Nuke, Geeklog – и многих других. Первая и самая опасная уязвимость – это банальный code exec с помощью функции preg_replace и модификатора /e:
Для выполнения произвольного кода (например, вывод phpinfo) тебе необходимо в качестве параметра функции kses_bad_protocol_once() всего лишь передать следующую строку:
Сразу скажу, насчет WordPress сильно не обольщайся, ибо разработчики, как всегда, постарались и ввели в функции wp_kses_normalize_entities() защиту: & меняется на & Как выглядело бы выполнение произвольного кода в WordPress без этой строчки, ты сможешь увидеть на скриншоте. Я всего лишь запостил комментарий в произвольный пост с кодом, указанным выше. Если с многострадальным ворпдрессом этот «финт ушами» не выйдет, то авторы других движком не столь дальновидны. Возьмем, к примеру, не самый безызвестный движок Moodle. Для него умельцы на основе вышеописанной баги написали эксплойт (ссылка в сносках).
Сплойт всего-навсего передает к ним строку: – где в eval() и выполняется произвольная команда :). Но останавливаться на code exec не стоит, теперь подошла очередь XSS. В прошлогодней статье «Троянский конь в phpMyFaq» я описывал, как с помощью XSS в kses можно похекать вордпресс. Теперь же остановлюсь на этом подробней. XSS и особенности браузеровЗаботливые разработчики kses предусмотрели для нашего брата выполнение javascript путем обхода фильтрации в функции kses_bad_protocol_once2(). Достигается это вставкой пропущенных через urldecode() символов %0B (для Оперы и Осла) и %08 (для Файрфокса). Вот небольшой PoC (работает в Вордпрессе при постинге комментария): Но и это еще не все! В некоторых движках в kses доступен атрибут style, а kses не очень подготовлен к защите от XSS, внедренных в CSS. Рабочий эксплойт под такой конфиг выглядел бы следующим образом: ЗлоключениеИспользование халявных классов и разработок до добра не доводит. Советую тебе при написании собственных скриптов либо самому писать нужные классы, либо тщательно проверять опенсорс как вручную, так и по advisory в багтреках, коих появляется бесчисленное множество практически каждый день. WWW
|