Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2019-8942 — Análisis técnico detallado y exploit de prueba de concepto para las vulnerabilidades RCE de WordPress CVE-2019-8942 y CVE-2019-8943, demostrando LFI a RCE mediante path traversal y manipulación de carga de imágenes. | Kitploit
Herramientas/GitHubGitHub/tuannq2299/cve-2019-8942
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebCTFPruebas de PenetraciónAprendizaje y Educación
GitHubtuannq2299/cve-2019-8942

CVE-2019-8942

Análisis técnico detallado y exploit de prueba de concepto para las vulnerabilidades RCE de WordPress CVE-2019-8942 y CVE-2019-8943, demostrando LFI a RCE mediante path traversal y manipulación de carga de imágenes.

Ver Repositorio
13hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2019-8942 y CVE-2019-8943: RCE en WordPress (privilegio de autor)

Resumen

CVE-2019-8942 es una vulnerabilidad que explota un fallo LFI combinado con la funcionalidad de carga de archivos (File Upload) para lograr RCE en el servidor web de WordPress con privilegios de autor. Las versiones de WordPress afectadas incluyen las anteriores a 4.9.9 y las 5.x anteriores a 5.0.1, lo que permite la ejecución remota de código porque el valor wp_attached_file del Post Meta puede modificarse a una cadena arbitraria, por ejemplo: .jpg?file.php. Un atacante con privilegios de autor puede ejecutar código arbitrario subiendo archivos de imagen con malware PHP incrustado en los metadatos Exif. La explotación puede aprovechar CVE-2019-8943.

En CVE-2019-8943, WordPress hasta la versión 5.0.3 presenta una vulnerabilidad de Path Traversal en el método wp_crop_image(). Un atacante con permiso para usar la función de recorte de imágenes (autor) puede escribir un archivo de imagen en cualquier directorio basándose en un nombre de archivo con dos extensiones, como .jpg?/../../file.jpg.

Condiciones de explotación

  • Aplicación web que usa WordPress con versión <= 4.9.8 o 5.0.0.
  • Una cuenta de usuario con privilegios de author.

Análisis detallado

La causa principal que permite a un usuario lograr RCE radica en el error de que los metadatos del Post (Post Meta) pueden sobrescribirse.

Los metadatos se pueden entender como datos que describen otros datos. En este caso concreto, los metadatos son información sobre el blog, como el título, la fecha de publicación, el nombre del autor, etc.

En el código fuente de WordPress 4.9.8, cuando se actualiza una imagen, se llama a la función edit_post(). Lo notable aquí es que esta función opera directamente con el array $_POST. wp_update_post toma directamente $post_data como parámetro sin verificar qué campos de datos están permitidos para editar.

root@kitploit:~
function edit_post( $post_data = null ) {
	global $wpdb;
	if ( empty($post_data) )
		$post_data = &$_POST;
...
	if ( isset($post_data['meta']) && $post_data['meta'] ) {
		foreach ( $post_data['meta'] as $key => $value ) {
			if ( !$meta = get_post_meta_by_id( $key ) )
				continue;
			if ( $meta->post_id != $post_ID )
				continue;
			if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) )
				continue;
			if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) )
				continue;
			update_meta( $key, $value['key'], $value['value'] );
		}
	}
...
	update_post_meta( $post_ID, '_edit_last', get_current_user_id() );
	$success = wp_update_post( $post_data );
	if ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) {
		$fields = array( 'post_title', 'post_content', 'post_excerpt' );
		foreach ( $fields as $field ) {
			if ( isset( $post_data[ $field ] ) ) {
				$post_data[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $post_data[ $field ] );
			}
		}
		wp_update_post( $post_data );
	}

wp-admin/includes/post.php

Un usuario con permiso para publicar entradas puede sobrescribir los valores del Post Meta. Más concretamente, un atacante puede modificar el valor del metadato _wp_attached_file. Esto no cambia el nombre del archivo; solo cambia el archivo sobre el que WordPress opera al editarlo, lo que conduce a la explotación de Path Traversal.

wp_postmeta antes de realizar la explotación

Se puede ver que el archivo subido tiene el formato YYYY/MM/name.jpg; WordPress lo guarda en el directorio YYYY/MM/, lo que sugiere la explotación de Path Traversal.

En la función wp_crop_image(), cuando un usuario author recorta una imagen, WordPress verifica que la imagen exista de dos maneras. La primera consiste en buscar la imagen basándose en _wp_attached_file en el directorio wp-content/uploads.

root@kitploit:~
function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
	$src_file = $src;
	if ( is_numeric( $src ) ) { // Handle int as attachment ID
		$src_file = get_attached_file( $src );
		if ( ! file_exists( $src_file ) ) {
			// If the file doesn't exist, attempt a URL fopen on the src link.
			// This can occur with certain file replication plugins.
			$src = _load_image_to_edit_path( $src, 'full' );
		} else {
			$src = $src_file;
		}
	}

	$editor = wp_get_image_editor( $src );
...
function get_attached_file( $attachment_id, $unfiltered = false ) {
	$file = get_post_meta( $attachment_id, '_wp_attached_file', true );

wp-admin/includes/image.php

Si el método anterior falla, WordPress intenta cargar la imagen desde su propio servidor generando una URL que contiene la ruta al directorio wp-content/uploads y el nombre de archivo almacenado en _wp_attached_file. Se intenta descargar la imagen en lugar de obtenerla directamente de forma local porque, en algunos casos, algunos plugins generan la imagen cuando se envía esa URL.

Cuando WordPress carga correctamente la imagen a través del método wp_get_image_editor(), se lleva a cabo el recorte. La imagen recortada se guarda en el sistema de archivos. El nombre de archivo será el valor de la variable $src devuelto por get_post_meta(), que está bajo el control del atacante. WordPress creará un directorio con el método wp_mkdir_p() (línea 9) y guardará la imagen allí con save(). Se puede ver que el método save() no verifica la explotación de Path Traversal.

root@kitploit:~
...
$src = $editor->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs );
if ( is_wp_error( $src ) )
	return $src;

if ( ! $dst_file )
	$dst_file = str_replace( basename( $src_file ), 'cropped-' . basename( $src_file ), $src_file );

wp_mkdir_p( dirname( $dst_file ) );

$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) );

$result = $editor->save( $dst_file );

Al usar un payload inyectado en _wp_attached_file que contiene los caracteres #/../../, dicha ruta no existirá si se utiliza el primer método de carga de imágenes, por lo que WordPress recurrirá al segundo método para cargar la imagen: generar una URL para descargarla. Aquí la ruta tendrá la forma http://localhost/wp-admin/wp-content/uploads/YYYY/MM/name.jpg#/name.jpg. Al ser una URL, los caracteres posteriores a # (que indican el fragmento) se ignoran. El nombre de archivo resultante será name.jpg#/name.jpg, donde name.jpg# es un directorio y es un nombre válido. Luego se usa un payload como /name.jpg#/../../name.jpg para explotar Path Traversal.

Se puede ver que los campos de valores como _wp_attach_file o _wp_page_template han sido modificados

De Path Traversal a RCE Cada sitio de WordPress utiliza un tema y además tiene una carpeta /wp-content/themes/theme_name/ que contiene los archivos de plantilla. En algunos casos, es posible elegir el tema de una entrada. El usuario solo necesita establecer _wp_page_template en la tabla Post Meta con el nombre de archivo deseado. Sin embargo, tiene la limitación de que solo es efectivo para archivos dentro del directorio del tema. Normalmente, no se puede acceder a este directorio ni subir archivos a él. Pero podemos aprovechar la explotación de Path Traversal para escribir archivos en ese directorio. Un atacante author creará una entrada y sobrescribirá el archivo de imagen en el valor del parámetro _wp_page_template. El archivo de imagen tendrá malware PHP incrustado; cuando se cargue la imagen, el código PHP se ejecutará -> RCE.

Demostración del PoC

Paso 1: Usa wpscan para identificar el tema que utiliza el sitio web => twentyseventeen

Paso 2: Inserta el malware PHP en la imagen con la herramienta Exiftool exiftool demo.jpg -documentname="<?php phpinfo();?>"

Paso 3: Inicia sesión en el sitio admin con la cuenta author, ve a Medios -> Añadir nuevo -> Subir imagen.

Paso 4: Accede a la imagen. Haz clic en Editar más detalles

Paso 5: Haz clic en Actualizar y usa Burpsuite para interceptar la solicitud -> Enviar a Repeater

Paso 6: Haz clic en Editar imagen, recorta la imagen y haz clic en Guardar. Intercepta la solicitud de guardado y envíala a Repeater.

Paso 7: Usando la solicitud del Paso 5, añade el parámetro &meta_input[_wp_attached_file]=YYYY/MM/file.jpg#/file a la solicitud. Esta solicitud preparará la creación de la carpeta file.jpg# y copiará la imagen file en este directorio.

Paso 8: Envía la solicitud del Paso 6 para guardar la imagen. Se observa que la carpeta file.jpg# se creó y la imagen se guardó en el directorio YYYY/MM/file.jpg#.

Paso 9: Similar al paso 7, usando la solicitud del Paso 5, añade el parámetro &meta_input[_wp_attached_file]=YYYY/MM/file.jpg#/../../../../themes/twentyseventeen/file a la solicitud. Al conocer la estructura de directorios de WordPress y el nombre del tema, se puede crear el payload anterior.

Paso 10: Envía la solicitud del Paso 6 para guardar la imagen. Se observa que la imagen se guardó en la nueva ruta.

Paso 11: Ve a Entradas -> Añadir nueva. Haz clic en Publicar. Intercepta la solicitud y envíala a Repeater.

Paso 12: Usando la solicitud del Paso 11, añade el parámetro &meta_input[_wp_page_template]=cropped image, donde cropped image es el nombre del archivo de imagen del Paso 10.

Paso 13: Accede a la entrada anterior y observa que el malware dentro de la imagen se ejecuta.

Payload con las 3 solicitudes utilizadas:

root@kitploit:~
&meta_input[_wp_attached_file]=year/month/file#/file
&meta_input[_wp_attached_file]=year/month/file#/../../../../themes/twentyseventeen/file
&meta_input[_wp_page_template]=<cropped image>

Referencias

  • https://github.com/brianwrf/WordPress_4.9.8_RCE_POC
  • https://viblo.asia/p/phan-tich-cve-2019-8942-cua-wordpress-bWrZnVrYZxw
  • https://blog.sonarsource.com/wordpress-image-remote-code-execution?redirect=rips
  • https://pentest-tools.com/blog/wordpress-remote-code-execution-exploit-cve-2019-8942
Descargar herramienta