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 на втором.
Комментарии:
Войдите или зарегистрируйтесь чтобы оставить комментарий