
Análisis técnico y exploit de prueba de concepto para CVE-2021-43408, una vulnerabilidad de inyección SQL en el plugin Duplicate Post de WordPress versión 1.1.9, con guía de explotación paso a paso y recomendaciones de remediación.
WordPress es un software CMS (Sistema de Gestión de Contenidos) de código abierto, un sistema de gestión de contenidos. En lugar de utilizar el lenguaje de marcado HTML, WordPress está escrito en el lenguaje de programación PHP y utiliza la base de datos MySQL. WordPress fue fundado por los programadores Matt Mullenweg y Mike Little. Actualmente, WordPress pertenece a la empresa Automattic, con sede en San Francisco, California, Estados Unidos.
El plugin Duplicate Post de Wordpress, en las versiones 1.1.9 e inferiores, presenta una vulnerabilidad de inyección SQL. Este tipo de explotación permite al atacante inyectar consultas SQL y así leer, modificar e incluso eliminar los recursos de la base de datos.
Esta vulnerabilidad puede ser explotada por cualquier usuario autenticado que tenga permiso para utilizar las funciones del plugin Duplicate Post. Por defecto, solo el Administrador tiene este permiso; sin embargo, los permisos pueden modificarse, por lo que el Editor, el Autor, el Colaborador e incluso el Suscriptor también pueden utilizar este plugin.
CVE-2021-43408 fue descubierta el "11/19/2021" y está evaluada con un nivel HIGH según la escala CVSS.

La causa principal de esta vulnerabilidad es que los datos enviados en la solicitud del usuario no se sanitizan antes de ejecutarse en la consulta SQL.
Más concretamente, en el archivo post/handler.php, en la función 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);
$idestá controlado por el atacante
La variable $id se pasa a la función que contiene la consulta SQL sin ningún tipo de sanitización. Esta función se invoca a través del Ajax de Wordpress wp_ajax_cdp_action_handling.
Se puede observar que el parámetro id se pasa a través de la función cdn_sanitize_array; aquí, los campos de datos de la entrada pasan por la función sanitize_text_field, que escapa cualquier comilla ' dentro de la cadena de datos.

Los campos de datos se procesan con
sanitize_text_field
Sin embargo, el código tiene una vulnerabilidad al pasar los datos del campo Integer a la consulta SQL que se ejecuta (el campo id); el atacante puede aprovechar esto e insertar sentencias SQL adicionales en el valor de este campo. Por lo tanto, para controlar la consulta SQL, el atacante solo necesita evitar usar el carácter '.
Paso 1: Inicie sesión como usuario Administrador e instale el plugin Duplicate Post versión 1.1.9. Este plugin permite a los usuarios duplicar las entradas existentes.

Paso 2: Acceda a la sección Post, seleccione una entrada, elija la acción Copy y pulse Apply.

Paso 3: Seleccione Setting: Default y pulse Copy.

Paso 4: Intercepte la solicitud HTTP. El campo de datos a tener en cuenta aquí es id; se puede ver que los datos de este campo son de tipo Integer.

Paso 5: Inserte el payload de inyección SQL, envíe la solicitud y observe que el servidor tarda 9 segundos en devolver la respuesta -> la inyección SQL se ha realizado correctamente.
Payload: 1 and (select*from(select(sleep(9)))a)--

