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

Все уже наверное слышали про новую уязвимость которой подверглись миллионы сайтов на движке 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 запрос.

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
15
16
17
18
19
20
21
22
23
24
25
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';
+------+-------------+-------------+---------------------+
| 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)

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';
+-------+-------------+-------------+---------------------+
| 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 на втором.

Источник

Комментарии:

Войдите или зарегистрируйтесь чтобы оставить комментарий