WordPress: тест на проникновение. Полный анализ малоизвестных уязвимостей раскрученного движкаМаг (icq 884888, http://wap-chat.ru) WordPress - без преувеличения, самый популярный движок во всех «интернетах» (по запросу «Powered by WordPress» Гугл выдает 74 400 000 результатов!). Движок писался с расчетом на то, чтобы любая «домохозяйка» смогла им воспользоваться. Так и получилось: знаменитая «5-минутная установка», средства защиты от спама, визуальный редактор, seo-friendly ссылки и многие другие фичи сделали свое дело. Но все ли в порядке у всего этого великолепия с элементарной безопасностью? В предыдущих номерах ][ я уже не раз поднимал тему безопасности WordPress. Вкратце вернемся к пройденному и систематизируем твои знания. Итак, последняя мало-мальски серьезная SQL-инъекция была найдена в 2.2.2 версии движка 28 июля далекого уже 2007 года неким Alexander Concha (не повезло человеку с фамилией). Не будем подробно на ней останавливаться, но если ты интересуешься историей, смотри ссылку на advisory в сносках. Идем далее. Во всех версиях движка, до 2.3.3 версии включительно, присутствует XSS-уязвимость в модуле фильтрации html kses (вспомнить о ней тебе поможет, например, январский номер журнала). Уязвимость можно было бы считать достаточно серьезной, если бы не одно но: админу надо нажать на ссылку с очень подозрительным адресом, что произойдет, только если админ – полный «чайник». Стоит упомянуть о нашумевшей в свое время уязвимости «Charset Remote SQL Injection» (версии <=2.3.3), которую я считаю псевдо-уязвимостью. Почему? Потому что в настройках блога искусственно должна быть выставлена кодировка MySQL «GBK» либо «BIG5». А такого счастливого совпадения я ни разу не встречал за всю свою многолетнюю практику работы с движком. Еще одна презабавнейшая бага – «WordPress <=2.3.2 'xmlrpc.php' Post Edit Unauthorized Access Vulnerability» (читай о ней в одном из прошлогодних «FAQ United»), которая позволяет пользователям с правами «subscriber» редактировать посты других пользователей. Все бы хорошо, если бы посты не сваливались в «draft», то есть – неопубликованные черновики. Так что, оставим эту багу для истории. Говоря о 2.3.x ветке, нельзя не упомянуть о баге «WordPress 'cat' Parameter Directory Traversal Vulnerability», о которой я также рассказывал в FAQ. Бага удивительна своей простотой, но использование омрачает тот факт, что работает она только на Windows-платформах. Последняя достойная внимания уязвимость - это «SQL Column Truncation (Admin Takeover)», почитать о которой ты сможешь в моей прошлогодней статье «Неслучайные числа». Замечу, что пользоваться ей крайне тяжело, ведь сгенерировать две rainbow таблицы по 40 и 80 Гб соответственно (ну, или подождать 2-4 дня), необходимых для работы эксплойта не каждому под силу. WordPress Comments Html Spam VulnerabilityПеред тобой первая неопубликованная уязвимость, которую я назвал «WordPress Comments Html Spam Vulnerability». Уязвимость затрагивает все версии движка, начиная от 1.5 и заканчивая последней (на момент написания статьи) 2.7.1. Заглянем в исходники вордпресса. Открывай файл ./wp-includes/comment.php и находи следующий код:
В чем смысл этого кода?
В этом занимательном коде есть один нюанс. Разработчики WordPress просто-напросто не знают, как работает функция parse_url. Эти слова подразумевают, что parse_url() элементарно не проверяет валидность переданного адреса! Мы можем передать в нее что-то вроде «http://%/suck_wordpress», в результате чего переменная $uri['host'] станет равной «%». Далее, как ты уже догадался, наш evil-хост переместится в sql-запрос, который примет следующий вид:
Так как этот запрос всегда будет возвращать true, наш спам-комментарий априори будет считаться зааппрувленным :). Но и это еще не все! Для работы с трекбеком используется файл ./wp-trackback.php, в котором наше тело комментария ($excerpt) попадает в такую функцию:
Казалось бы, передать ссылку здесь невозможно. Но нерадивые разработчики снова не учли несколько нюансов:
Исходя из этой информации, можно придумать конечный эксплойт:
Где в поле «Comment» вставляем:
В итоге, на нужном блоге мы получим зааппрувленный комментарий с выделенной жирной ссылкой «Купить слона». Единственное замечание: этот способ в SEO годен только для Yahoo, Яндекса, MSN, так как в коде ссылки добавляется rel="nofollow", благодаря которому всемогущий Гугл не засчитывает ссылку. Подмена RSS-фидов в DashboardВ конце прошлого года я нашел еще один занимательный баг в WordPress, который заключался в подмене RSS-лент на главной странице админки блога. Теперь смотри. Скопируй ленту новостей с девблога официального сайта вордпресса, затем вставь в нее в качестве первого поста объявление о security-патче (или просто новой версии) блога. В посте (естественно, в ссылке на скачку) укажи свой протрояненный дистрибутив вордпресса.
В итоге, ты увидишь на главной странице админки блога свой evil-rss :). Ах да, для использования этой уязвимости необходимы:
Эти забавные пинги. Часть 1Так уж сложилось, что наибольшее число уязвимостей WordPress пришлось как раз на технологии Pingback и Trackback. Вот и на этот раз, копаясь в функциях, отвечающих за пинги, я нашел сразу 2 (!) фрагментированные sql-инъекции во всех версиях движка до 2.5.1 включительно и с правами author/editor (WordPress MU also affected). Для наглядности возьмем подопытный движок за номером 2.3.3. Открывай ./wp-includes/post.php и находи в нем код: Небольшие раскопки дают понять, что фильтра «add_ping» не существует в коде движка. Получается, что данные из первого запроса подставляются во второй запрос без какой-либо фильтрации! А теперь о способе эксплуатации данной уязвимости. Запасись терпением :). Чтобы использовать баг, тебе необходимо две инсталляции вордпресса: 1. Все равно какой версии. Создай новый пост с любым тайтлом и содержимым:
Запомни адрес созданного поста (например, http://lamer/wp1/?p=2). 2. Во втором блоге ветки 2.3.x-2.5.1 создай пост с любым содержанием и любым тайтлом, а в поле «Send trackbacks to:» пиши: Сохраняй пост. Снова заходи в его редактирование, но теперь редактируй само содержимое и вставляй туда ссылку в html-формате на пост из первого блога:
Готово! Сохраняйся, переходи на страницу нашего поста и наслаждайся результатами выполнения скули в виде хеша и пароля админа. Эти забавные пинги. Часть 2Вторая SQL-инъекция присутствует в механизме трэкбэков и выглядит уже не так ужасно. Открывай файл ./wp-includes/comment.php и находи в нем код:
Здесь мы наблюдаем ту же ситуацию: переменная $to_ping подставляется в следующий запрос без какой-либо фильтрации. Использовать эту SQL-инъекцию очень просто. 1. Создавай новый пост и в «Send trackbacks to:» вставляй следующее:
2. Сохраняй пост, заходи в редактирование вновь созданного поста и опять вставляй туда тот же самый код; 3. Сохраняйся и наблюдай в тайтле поста логин и пароль админа. Коварный parse_strНе могу не поделиться с тобой еще одной забавной SQL-инъекцией, которая присутствует во всех версиях движка, начиная с 2.3.x и заканчивая последней на данный момент 2.7.1. Для использования инъекции необходимы права «manage_links». Для теста снова возьмем WordPress 2.3.3. Итак, открывай ./wp-admin/link-manager.php. В этом файле присутствует следующий код: Начиная от этого кода, попробуем провести небольшой реверсинг:
На этот раз разработчики WordPress не учли, что:
Отсюда, как логичный вывод, следует blind sql-инъекция:
Условия здесь такие:
Wordpress 2.5 Cookie Integrity Protection VulnerabilityЕще одна интереснейшая логическая уязвимость, которой уделили недостаточно внимания, – это «Cookie Integrity Protection Vulnerability». Ей подвержен WordPress 2.5. В официальном advisory насчет реальной эксплуатации баги сказано мало и не совсем понятно, – так что многие до сих пор у меня интересуются, как ее использовать.
Расшифровка этих непонятных символов элементарна:
Если ты еще не понял, то скажу тебе, что проблема заключается как раз в способе конкатенации этих значений. 1. Регистрируй юзера с именем «admin99»; 2. Авторизуйся на блоге; 3. Отредактируй свои кукисы (в Опере: Инструменты -> Дополнительно -> Редактирование cookies) следующим образом: Было: Стало: В итоге, с новыми кукисами ты благополучно авторизуешься с правами админа. Wordpress 2.7.x admin remote code execution exploitВыполнение произвольного кода в админке через create_function (баг нашел некий Ryat[puretot]) - еще одна интересная уязвимость, почему-то оставшаяся не только без внимания хакеров, но и без внимания разработчиков! Эксплойт к ней появился еще в версии 2.7, но в последнем вордпрессе (сейчас - 2.7.1) дыра по-прежнему не закрыта. Проведем небольшой аудит кода ./wp-admin/post.php:
Из анализа этого кода видно, что юзер с правами «edit_post» может провести инъекцию произвольного кода следующим образом: 1. Сменить значение «display_name» на что-то вроде \';phpinfo();\'. В результате переменная $message будет выглядеть так:
2. Когда $message пройдет stripslashes и попадет в create_function(), создастся функция с таким вот интересным телом:
Как видишь, налицо банальный code exec. Ссылку на эксплойт ищи в сносках. Добавлю, что эксплойт предназначен для юзера с правами admin, но, немного подумав, ты сможешь исправить его для работы с правами author/editor. ИтогиЖесткие рамки статьи не позволяют рассказать обо всех найденных мной и другими людьми уязвимостях WordPress, но я этого и не хочу :). Описанные тут уязвимости – лишь верхушка айсберга. Существуют гораздо более серьезные и полезные баги во всех, даже самых последних, версиях движка. Эти баги не только стоят множество зеленых президентов, но и позволяют безбедно жить на поприще SEO. Поэтому могу лишь пожелать разработчикам вордпресса оставаться такими, какие они есть: невнимательными и забавными в своей простоте. Ссылки по теме
|