警告:WordPress文件删除到代码执行 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

警告:WordPress文件删除到代码执行

警告:WordPress文件删除到代码执行

WordPress是网络上最受欢迎的CMS。根据w3tech,大约30%的网站使用它1。这种广泛的采用使其成为网络罪犯的一个有趣目标。在这篇博文中,我们将介绍WordPress核心中经过身份验证的任意文件删除漏洞,该漏洞可能导致攻击者执行任意代码。7个月前,该漏洞已报告给WordPress安全团队,但仍未修补。自首次报告以来已经过去很长时间没有任何补丁或具体计划,这使我们决定将其公之于众。

谁受到影响

在撰写本文时,没有任何补丁可以防止此漏洞。任何WordPress版本(包括当前的4.9.6版本)都容易受到此博客帖子中描述的漏洞的影响。

为了利用下面讨论的漏洞,攻击者需要获得预先编辑和删除媒体文件的权限。因此,该漏洞可用于升级通过接管具有与作者一样低的角色的帐户或通过利用其他漏洞/错误配置而获得的权限。

影响 – 攻击者可以做些什么

利用此漏洞可以使攻击者能够删除WordPress安装的任何文件(+ PHP进程用户具有删除权限的服务器上的任何其他文件)。除了擦除整个WordPress安装的可能性,如果没有可用的当前备份可能会产生灾难性后果,攻击者可以利用任意文件删除的能力来规避一些安全措施并在Web服务器上执行任意代码。更确切地说,可以删除以下文件:

  • .htaccess:通常,删除此文件不会产生任何安全后果。但是,在某些情况下,.htaccess文件包含与安全性相关的约束(例如,对某些文件夹的访问约束)。删除此文件将停用这些安全约束。
  • index.php文件:通常将空的index.php文件放入目录中,以防止Web服务器无法执行此操作的目录列表。删除这些文件会向攻击者授予受此度量保护的目录中所有文件的列表。
  • wp-config.php:删除WordPress安装的这个文件会在下次访问网站时触发WordPress安装过程。这是因为wp-config.php包含数据库凭据,并且没有它的存在,WordPress就像尚未安装一样。攻击者可以删除此文件,使用他为管理员帐户选择的凭据进行安装过程,最后在服务器上执行任意代码。

技术细节

将未经过处理的用户输入传递给文件删除功能时,会发生任意文件删除漏洞。在PHP中,这会在unlink()调用函数时发生,并且用户输入可能会影响部分或整个参数$filename,这些参数表示要删除的文件的路径,而不进行适当的清理。

可以在WordPress Core中实现此漏洞的代码部分位于以下wp-includes/post.php文件中:

/wp-includes/post.php

 1 2 3 4 5 6 7 8 9101112131415
function wp_delete_attachment( $post_id, $force_delete = false ) {
	
	$meta = wp_get_attachment_metadata( $post_id );
	
	if ( ! empty($meta['thumb']) ) {
		// Don't delete the thumb if another attachment uses it.
		if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) {
			$thumbfile = str_replace(basename($file), $meta['thumb'], $file);
			/** This filter is documented in wp-includes/functions.php */
			$thumbfile = apply_filters( 'wp_delete_file', $thumbfile );
			@ unlink( path_join($uploadpath['basedir'], $thumbfile) );
		}
	}
	
}

wp_delete_attachement()上面显示的函数中,$meta[‘thumb’]调用中使用的内容unlink()不经过任何清理。此代码段的目的是删除图像的缩略图以及删除。通过WordPress中的媒体管理器上传的图像表示为附件类型的帖子。$meta[‘thumb’]从数据库中检索该值,并将其保存为表示图像的帖子的自定义字段2。因此,在从数据库检索和关键函数调用中使用之间unlink(),表示缩略图文件名的值不进行任何清理或检查。如果该值在保存到数据库之前也没有经过任何或不充分的安全措施,我们将在下一个代码清单中看到,我们有一个二阶任意文件删除漏洞。

/wp-admin/post.php

 1 2 3 4 5 6 7 8 9101112

switch($action) {

	case 'editattachment':
		check_admin_referer('update-post_' . $post_id);
		
		// Update the thumbnail filename
		$newmeta = wp_get_attachment_metadata( $post_id, true );
		$newmeta['thumb'] = $_POST['thumb'];

		wp_update_attachment_metadata( $post_id, $newmeta );

后面的代码片段/wp-admin/post.php表示如何将属于附件的缩略图的文件名保存到数据库中。在从保存的用户输入检索$_POST[‘thumb’]和保存到数据库wp_update_attachment_metadata()之间,没有安全措施来确保该值确实代表正在编辑的附件的缩略图。值$_POST[‘thumb’]可以保存,相对于WordPress上传目录的任何文件的路径,当附件被删除时,文件将被删除,如第一个列表中所示。

临时修补程序

在撰写本文时,所描述的漏洞在WordPress核心中仍未修补。因此,我们在下面的剪辑中提供了一个临时修复程序。通过将修复程序添加到functions.php当前活动的主题/子主题的文件中,可以将修复程序集成到现有的WordPress安装中。

123456789
add_filter( 'wp_update_attachment_metadata', 'rips_unlink_tempfix' );

function rips_unlink_tempfix( $data ) {
    if( isset($data['thumb']) ) {
        $data['thumb'] = basename($data['thumb']);
    }

    return $data;
}

所提供的Hotfix所做的就是挂钩wp_update_attachement_metadata()调用并确保为元值提供的数据thumb不包含任何可以进行路径遍历的部分。因此,不能删除任何安全相关文件。

提供的修复程序最终应视为临时修复,以防止攻击。我们无法监督WordPress插件的所有可能的向后兼容性问题,并建议您谨慎对WordPress文件进行任何修改。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明警告:WordPress文件删除到代码执行
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址