Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2019-8942 — 详细的技术分析和概念验证漏洞利用,针对WordPress RCE漏洞CVE-2019-8942和CVE-2019-8943,演示通过路径遍历和图像上传操纵实现LFI-to-RCE。 | Kitploit
工具/GitHubGitHub/tuannq2299/cve-2019-8942
漏洞分析漏洞利用Web应用程序漏洞利用CTF渗透测试学习与教育
GitHubtuannq2299/cve-2019-8942

CVE-2019-8942

详细的技术分析和概念验证漏洞利用,针对WordPress RCE漏洞CVE-2019-8942和CVE-2019-8943,演示通过路径遍历和图像上传操纵实现LFI-to-RCE。

查看仓库
1144年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2019-8942和CVE-2019-8943:WordPress RCE(作者权限)

总览

CVE-2019-8942 是一个利用LFI漏洞结合文件上传功能以作者权限在WordPress Web服务器上执行RCE的漏洞。受影响的WordPress版本包括4.9.9之前和5.x至5.0.1之前,允许远程执行代码,因为wp_attached_file的Post Meta值可以被更改为任意字符串,例如字符串:.jpg?file.php。具备作者权限的攻击者可以通过上传包含恶意PHP代码在Exif元数据中的图片文件来执行任意代码。可利用CVE-2019-8943进行利用。

CVE-2019-8943 中,WordPress至5.0.3版本在wp_crop_image()方法中存在路径遍历漏洞。具备使用裁剪图片功能权限(作者)的攻击者可以根据包含两个扩展名的文件名(如.jpg?/../../file.jpg)将图片文件写入任意目录。

利用条件

  • Web应用程序使用WordPress版本 <= 4.9.8 或 5.0.0。
  • 具有author权限的用户账户。

详细分析

主要导致用户能够执行RCE的原因在于Post meta可被覆盖。

元数据可以理解为描述数据的数据,具体在此案例中,元数据是关于博客的信息,如:标题、发布日期、作者姓名等。

在WordPress 4.9.8版本的源代码中,当图片被更新时,会调用edit_post()函数。值得注意的是,该函数直接操作$_POST数组。wp_update_post直接使用$post_data作为参数,而不检查允许编辑的数据字段。

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

具有发帖权限的用户可以覆盖Post Meta的值。更具体地说,攻击者可以修改元数据_wp_attached_file的值。这不会改变文件名,只会改变WordPress在编辑时操作的文件,从而导致路径遍历利用。

利用前的wp_postmeta

可以看到上传的文件格式为YYYY/MM/name.jpg,WordPress将文件保存在YYYY/MM/目录下,我们可以联想到路径遍历利用。

在wp_crop_image()函数中,当author用户进行图片裁剪时,WordPress会通过两种方式检查图片是否存在。第一种方式根据_wp_attached_file在wp-content/uploads目录中查找图片。

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

如果上述方法失败,WordPress将尝试从其自身服务器下载图片,通过生成包含wp-content/uploads目录路径和_wp_attached_file中文件名的URL。之所以尝试下载而非直接从本地获取,是因为在某些情况下,某些插件会在发送该URL时生成图片。

当WordPress通过wp_get_image_editor()成功下载图片后,裁剪操作便会进行。裁剪后的图片随后会保存到文件系统中。文件名是get_post_meta()返回的$src值,该值受攻击者控制。WordPress会通过wp_mkdir_p()(第9行)创建目录,并使用save()将图片保存在此处。可以看到save()方法没有检查路径遍历利用。

...
$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 );

如果使用包含#/../../字符的payload传入_wp_attached_file,使用第一种加载图片的方式将不存在这样的路径,因此WordPress会执行第二种方式生成URL下载图片。此时路径形式为http://localhost/wp-admin/wp-content/uploads/YYYY/MM/name.jpg#/name.jpg,由于是URL路径,#之后的字符(表示片段)会被忽略。找到的文件名将是name.jpg#/name.jpg,其中name.jpg#是一个目录,这是一个有效的名称。接下来使用类似/name.jpg#/../../name.jpg的payload进行路径遍历利用。

可以看到_wp_attach_file和_wp_page_template等字段值已被修改

路径遍历到RCE 每个WordPress页面都会使用一种主题,同时会有一个/wp-content/themes/theme_name/文件夹存放模板文件。在某些情况下,为文章选择主题是可行的。用户只需将Post Meta表中的_wp_page_template设置成所需的文件名。但限制是它仅对主题目录中的文件有效。通常这个目录无法直接访问和上传文件。然而,我们可以利用路径遍历将文件写入该目录。author攻击者将创建一篇文章,并将图片文件覆盖到参数_wp_page_template的值中。图片文件会被注入恶意PHP代码,当图片加载时,PHP代码随之执行 -> RCE。

PoC演示

步骤1:使用wpscan确定网站使用的主题 => twentyseventeen

步骤2:使用工具Exiftool将恶意PHP代码注入图片 exiftool demo.jpg -documentname="<?php phpinfo();?>"

步骤3:使用author账户登录站点后台,进入媒体 -> 添加新文件 -> 上传图片。

步骤4:访问图片。点击编辑更多详细信息。

步骤5:点击更新并使用Burpsuite拦截请求 -> 发送到Repeater

步骤6:点击编辑图片进行裁剪并点击保存。拦截保存请求并发送到Repeater。

步骤7:使用步骤5的请求,添加参数&meta_input[_wp_attached_file]=YYYY/MM/file.jpg#/file到请求中。该请求将准备创建文件夹file.jpg#并将图片file复制到此文件夹。

步骤8:发送步骤6的请求以保存图片。可以看到文件夹file.jpg#已创建,图片已保存到目录YYYY/MM/file.jpg#。

步骤9:类似步骤7,使用步骤5的请求,添加参数&meta_input[_wp_attached_file]=YYYY/MM/file.jpg#/../../../../themes/twentyseventeen/file到请求中。由于知道WordPress的目录结构和主题名称,我们可以构造出以上payload。

步骤10:发送步骤6的请求以保存图片。可以看到图片已按新路径保存。

步骤11:进入文章 -> 添加新文章。点击发布。拦截请求并发送到Repeater。

步骤12:使用步骤11的请求,添加参数&meta_input[_wp_page_template]=cropped image,其中cropped image是步骤10中图片的文件名。

步骤13:访问该文章,看到图片中的恶意代码被执行。

使用3个请求的payload:

&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]=<裁剪后的图片>
下载工具