
PoC и смягчение для CVE-2019-9787 (WordPress XSS/CSRF/RCE). Демонстрирует исправления санитизации, HttpOnly куки и защиту от CSRF на основе хеша с модификациями кода.
исправление логической ошибки в процессе очистки для администраторов.
добавьте две строки в /wp-admin/includes/ajax-actions.php и /wp-includes/comment.php (подробнее в отчёте):
remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
add_filter( 'pre_comment_content', 'wp_filter_kses' );
http-only
Для сессионных cookie, управляемых PHP, флаг устанавливается либо постоянно в php.ini (руководство PHP по HttpOnly) через параметр:
session.cookie_httponly = True
защита на основе хеша
Токен проверки CSRF не был реализован в WordPress, потому что это помешало бы функциям trackbacks и pingbacks. Сервер не может отличить нелегитимный CSRF-запрос от легального PINGBACK/TRACEBACK запроса; WordPress автоматически принимает комментарий без правильного CSRF-токена как запрос PINFBACK или TRACEBACK и фильтрует его с помощью белого списка.
Чтобы защититься от этой уязвимости CSRF, мы добавляем новое поле в форму с именем hashnonce для проверки того, что комментарий отправлен администратором. Администратор подписывает значение поля комментария с помощью своей cookie.
Подпись значения поля комментария использует md5 для генерации хеша (см. график).
Когда администратор пытается принять PINFBACK или TRACEBACK и _wp_unfiltered_html не может быть предоставлен, мы используем wp_verify_hashNonce. Если проверка не удалась, будет сообщено об ошибке. Даже если проверка прошла успешно, логическая ошибка исправлена, и для фильтрации комментариев будет использоваться wp_filter_kses.
Изменённый код:
третий метод взят из https://github.com/sijiahi/Wordpress_cve-2019-9787_defense