
Технический анализ и proof-of-concept эксплойт для CVE-2021-43408, уязвимости SQL-инъекции в плагине WordPress Duplicate Post версии 1.1.9, с пошаговым руководством по эксплуатации и рекомендациями по устранению.
WordPress — это CMS (система управления контентом) с открытым исходным кодом, представляющая собой систему управления содержимым. Вместо использования HTML-кода WP написан на языке программирования PHP и использует базу данных MySQL. WordPress был основан программистами Matt Mullenweg и Mike Little. В настоящее время WordPress принадлежит компании Automattic со штаб-квартирой в Сан-Франциско, Калифорния, США.
Плагин Duplicate Post для WordPress версии 1.1.9 и ниже подвержен ошибке SQL-инъекции. Данный тип эксплуатации позволяет атакующему внедрять SQL-запросы, с помощью которых можно читать, изменять и даже удалять ресурсы в базе данных.
Эта уязвимость может быть использована любым аутентифицированным пользователем, имеющим право использовать функции плагина Duplicate Post. По умолчанию таким правом обладает только администратор, однако права могут быть изменены, и тогда редактор, автор, участник и даже подписчик смогут использовать этот плагин.
CVE-2021-43408 была обнаружена «11/19/2021» и оценена как HIGH по шкале CVSS.

Коренная причина этой уязвимости заключается в том, что данные, отправленные в запросе от пользователя, не проходят санитизацию перед выполнением SQL.
Если точнее, то в файле post/handler.php, в функции cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$idконтролируется атакующим
Переменная $id передаётся в функцию, содержащую SQL-запрос, без какой-либо санитизации. Эта функция вызывается через WordPress Ajax wp_ajax_cdp_action_handling.
Видно, что параметр id передаётся через функцию cdn_sanitize_array, где поля данных записи проходят через функцию sanitize_text_field, которая экранирует любые кавычки ' в строке данных.

Поля данных обрабатываются с помощью
sanitize_text_field
Однако в коде есть уязвимость: при передаче данных целочисленного поля в выполняемый SQL-запрос (поле id) атакующий может воспользоваться этим и вставить дополнительную SQL-команду в значение этого поля. Таким образом, чтобы контролировать SQL-запрос, атакующему достаточно избегать использования символа '.
Шаг 1: Войдите в систему как администратор, установите плагин Duplicate Post версии 1.1.9. Этот плагин помогает пользователям дублировать существующие записи.

Шаг 2: Перейдите в раздел Post, выберите одну запись, выберите действие Copy и нажмите Apply.

Шаг 3: Выберите Setting: Default и нажмите Copy.

Шаг 4: Перехватите HTTP-запрос, здесь важно обратить внимание на поле id; видно, что данные этого поля имеют целочисленный тип.

Шаг 5: Вставьте payload SQL-инъекции, отправьте запрос и обратите внимание, что сервер возвращает ответ только через 9 секунд -> SQL-инъекция прошла успешно.
Payload: 1 and (select*from(select(sleep(9)))a)--

