Уязвимость в плагине Disqus для WordPress

Удаленное выполнение кода через плагин Disqus для WordPress

Мы недавно обнаружили уязвимости в плагине Disqus Comment System plugin для WordPress. Эта уязвимость, в специфических условиях, может позволить злоумышленнику удаленно выполнить код (RCE — Remote Code Execution). Другими словами, злоумышленник может делать все что хочет с такими уязвимыми сайтами.

Хотя сам плагин потенциально очень опасен, но эта опасность проявляется только лишь на серверах с WordPress с версией PHP 5.1.6 и ниже. Это также означает, что только пользователи WordPress 3.1.4 (и более ранних версий) подвержены атаке, поскольку WordPress более поздних версий не поддерживает версии PHP, «обнажающие» уязвимость.

Зная, что целевая аудитория подобной уязвимости крайне мала, мы решили сделать свое открытие общедоступным и у Disqus вышел новый патч, закрывающий уязвимость (patched version 2.76). Мы по прежнему рекомендуем каждому пользователю Disqus прежнему произвести обновление как можно скорее.

Disqus RCE уязвимость

Все началось с анализа одного JSON-парсера, в котором мы нашли следующий любопытный код:
json парсер

По некоторым причинам, распаршиваемый контент возвращается из eval(), которая затем подставляется в вызываемую функцию. Как вы знаете, функция ecal() в PHP выполняет любой код, переданный в нее.

Итак, мы имеем потенциальный RCE код в виде строки, возвращаемой eval() в двойных кавычках, что означает, что мы можем использовать синтаксис PHP для разбора сложных переменных, заставляя скрипт выполнить любые функции, которые захотим, например: {${phpinfo()}}.

Направление атаки

Все что нам было нужно — это найти место для хранения вредоносного кода, чтобы затем он сработал по триггеру через уязвимость с вызовом eval(). Чтобы это сделать нам необходимо проверять обрабатываются ли данные пользователя через функцию getNextToken().

Нашей первой догадкой было предположение, что оставляемые комментарии, отправляемые через Disqus, идут на их серверы, соответственно, можно было предположить обратное: получение комментариев для определенного поста с их же сервера.

Мы оказались правы. Недолгий поиск привел нас к некоторой функциональности, позволяющей синхронизовать комменты. Эта функциональность могла быть активирована гостевым любым пользователем, причем, он мог добавить некоторые параметры прямо к URL, например:

http://somesite.com/?cf_action=sync_comments&post_id=TARGET_POST_ID

Все, что нам оставалось — это проверить все, что мы нашли на практике. Теперь мы знали, что обнаружили работающую уязвимость и все, что нужно было для ее активации:

  • Запостить вредоносный код в коммент
  • Получить ID поста
  • Вызвать синхронизацию комментариев добавлением параметров (которые мы привели ранее) к URL
  • Все готово! Выглядит просто, не так ли?

Так вот, если вы используете устаревшую версию WordPress/PHP, вам следует обновиться на Disqus. Всем другим пользователям мы также рекомендуем обновлять движки в момент их выхода.

Подготовлено по материалам Марка-Александра Монпаса