
Prueba de concepto de CVE-2025-22710
Plugin de WordPress
Nombre del componente WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Versión vulnerable <= 8.50.0
Slug del componente smart-manager-for-wp-e-commerce
Enlace del componente https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Clase de vulnerabilidad A3: Injection
Tipo de vulnerabilidad SQL Injection
Administrador
El plugin WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager (en adelante, Smart Manager) es un plugin que permite la edición masiva y la visualización de todos los tipos de entrada (post types) en WordPress.
En el plugin Smart Manager, versión 8.50.0 y anteriores, al usar la función de búsqueda avanzada para ver entradas, se produce una vulnerabilidad de inyección SQL porque los valores de filtrado se pasan a las consultas a la base de datos sin procesamiento de escape.
Sin embargo, aunque los resultados directos de los ataques de inyección SQL no pueden verse en pantalla, es posible realizar Blind SQL Injection mediante diferencias en los valores de respuesta según condiciones verdaderas/falsas.
⚠️ Debe existir al menos una entrada para observar la diferencia en los valores de respuesta según condiciones verdaderas/falsas.
/wp-admin/admin.php?page=smart-manager).

' OR 1=1 )) # en el campo de entrada de texto. Después, haga clic en el botón de búsqueda en la parte superior.

' OR 1=2 )) # en el campo de entrada de texto, no se recuperará ninguna entrada porque la condición siempre es falsa (OR 1=2).

Al ejecutar la función 'Advanced Search' solicitada en la descripción del PoC anterior, se genera el siguiente paquete, y los valores de filtrado (Post Title, is, ' OR 1=1 )) #) introducidos en la búsqueda avanzada se ingresan en los datos de la solicitud advanced_search_query.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

Cuando se solicita este paquete, se llama a la función get_data_model en el archivo /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php, y se realizan consultas a la base de datos en el siguiente orden.
Si existen los datos de solicitud advanced_search_query, se llama a la función process_search_cond. En este momento, los datos de solicitud advanced_search_query se pasan al valor con la clave search_query en el argumento de par clave-valor.
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

La función llamada process_search_cond itera a través del valor con la clave search_query, inicializa el valor de filtrado Post Title(post_tile) en la variable $search_col, e inicializa el valor de filtrado ' OR 1=1 )) # que contiene el payload de inyección SQL en la variable $search_value.
En la función de búsqueda avanzada, la entrada del usuario (' OR 1=1 )) #) se incluye directamente en la consulta a la base de datos sin procesamiento de escape, lo que resulta en una vulnerabilidad de inyección SQL. Esta vulnerabilidad permite a los atacantes ejecutar consultas SQL arbitrarias, lo que podría conllevar graves riesgos de seguridad, como la filtración o manipulación de información sensible de la base de datos.
⚠️ La implementación del código PoC consulta el nombre de la base de datos explotando la vulnerabilidad de inyección SQL.
Abra el código PoC en un editor e introduzca la dirección del sitio WordPress y las credenciales de administrador.

Luego introduzca el siguiente comando para ejecutar el código PoC.
Módulo requeridorequests
python poc.py


Las variables $search_col y $search_value se pasan a las claves search_col (=post_title) y search_value (=' OR 1=1 )) #) del array $search_params, respectivamente. Posteriormente, esta variable $search_params se pasa como valor con la clave search_params a la función create_flat_table_search_query.

Posteriormente, la función create_flat_table_search_query define la cláusula WHERE de la consulta SQL y, en este punto, el search_value (=' OR 1=1 )) #) de la clave search_params pasado como argumento se incluye en la cláusula WHERE sin ningún procesamiento de escape.

Luego, el valor de retorno de la función create_flat_table_search_query (que contiene el payload de inyección SQL) se pasa como argumento a la función process_flat_table_search_query.

La función process_flat_table_search_query construye una consulta a la base de datos usando el argumento recibido, inicializando las variables $select, $from y $where. Aquí podemos ver que el payload de inyección SQL se pasa directamente a la variable $where sin ninguna validación.

Las variables $select, $from, $where se asignan directamente a la variable $query_posts_search, y esta variable finalmente se pasa como argumento a la función que realiza la consulta a la base de datos.
