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

wordpress-image-长途代码实行破绽剖析

申博_安全工具 申博 494次浏览 未收录 0个评论

0x01 概述

2月20日,RIPS表露了WordPress内核Image模块相干的一个高危破绽,该破绽由目次穿越和文件包罗组成,终究可致使长途代码实行,现在还没有PoC表露。

RIPS形貌的细节来看,破绽涌现在wordpress编纂图片时,由于没有过滤Post Meta 值致使能够修正数据库中wp_postmeta表的恣意字段,而在加载当地服务器上的文件时没有对途径举行过滤,致使能够通报目次穿越参数,终究生存图片时能够生存至恣意目次。当某个主题include了某目次下的文件时,便能够形成代码实行。

0x02 情况搭建

该破绽影响4.9.9版本以下的wordpress顺序,4.9.9引入了过滤函数,对用户输入的post data举行了搜检,不合法的参数被过滤,重要修正以下图:

wordpress-image-长途代码实行破绽剖析

值得注重的是,在装置低版本时,装置历程当中会自动更新中心文件,因而旧版本的wp-admin/includes/post.php会更新至最新版本,以是装置历程当中能够删除自动更新相干模块,或许离线装置。

0x03 破绽剖析

破绽一:数据掩盖

破绽涌现在wordpress媒体库裁剪图片的历程,当我们上传图片到媒体库时,图片会被生存至wp-content/uploads/yyyy/mm目次,同时会在数据库中wp_postmeta表插进去两个值,分别是_wp_attached_file_wp_attachment_metadata,生存了图片地位和属性相干的序列化信息。

wordpress-image-长途代码实行破绽剖析

当我们修正图片属性(比方修正题目或许申明)的时刻,admin-media-Edit more details 会挪用wp-admin/includes/post.phpedit_post()要领,该要领的参数悉数来自于$_POST,没有举行过滤

wordpress-image-长途代码实行破绽剖析

然后会挪用到update_post_meta()要领,该要领依据$post_ID修正post meta field,接着挪用update_metadata()更新meta数据,完成以后更新post数据,挪用wp_update_post()要领

wordpress-image-长途代码实行破绽剖析

wp_update_post()要领中,若是post_type=attachment,则进入wp_insert_attachment(),接着挪用wp_insert_post(),在wp_insert_post()要领中推断了meta_input参数,若是传入了该参数,就遍历数组用来更新post_meta

wordpress-image-长途代码实行破绽剖析

进入update_post_meta(),挪用update_metadata(),在update_metadata()要领中对数据库举行更新操纵,而在全部历程当中对键值没有任何过滤,意味着我们能够传入指定的key来设置它的值,挪用栈以下图所示

wordpress-image-长途代码实行破绽剖析

因而组织数据包更新数据库中_wp_attached_file的值,插进去一个包罗../的值,以便在下面触发目次遍历。

wordpress-image-长途代码实行破绽剖析

wordpress-image-长途代码实行破绽剖析

这是第一个破绽——经由过程参数掩盖了数据库数据,在补钉处恰是对meta_input这个参数做了过滤,若是包罗则经由过程对照array舍弃该参数。

破绽二:目次遍历

接着寻觅一个猎取_wp_attached_file的值并举行了文件操纵相干的要领。

wordpress图片裁剪功用中,有如许的功用:

  1. 图片存在于wp-content\uploads\yyyy\mm目次,则从该目次读取图片,修正尺寸后另存为一张图片;
  2. 若是图片在该目次不存在,则经由过程当地服务器下载该图片,如从http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg下载,裁剪后从新生存。

这个功用是为了轻易一些插件动态加载图片时运用。

然则由于当地读取和经由过程url读取的差异性,致使能够组织一个带参数的url,如http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?1.png,在当地读取时会发明找不到admin.jpeg?1.png,而长途猎取时会疏忽?背面的参数局部,还是猎取到admin.jpeg,裁剪后生存。若是组织的url包罗途径穿越,比方http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?../../1/1.pngwordpress将淘汰后的图片生存至指定的文件夹,当图片包罗歹意代码被引用时,就可能形成代码实行。

图片裁剪功用在wp_crop_image()要领中,然则该要领不克不及在页面中触发,须要手动变动响应的action

起首在页面裁剪图片,并点击生存

wordpress-image-长途代码实行破绽剖析

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

抓取数据包:

action=image-editor&_ajax_nonce=4c354c778b&postid=5&history=%5B%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A5%2C%22w%22%3A347%2C%22h%22%3A335%7D%7D%5D&target=all&context=edit-attachment&do=save

post body包罗了响应的actioncontext,和供复原文件的汗青文件巨细,此处须要修正actioncrop-image以便触发wp_crop_image()要领,相干挪用以下

wp-admin/admin-ajax.php界说了裁剪图片的操纵

wordpress-image-长途代码实行破绽剖析

推断了用户权限和action称号后挪用do_action,终究在apply_filters()中进入wp_crop_image():

wordpress-image-长途代码实行破绽剖析

wordpress-image-长途代码实行破绽剖析

进入wp_ajax_crop_image()要领,在这个要领中举行了多项推断,悉数相符能力进入裁剪图片要领,以下图解释所示

wordpress-image-长途代码实行破绽剖析

起首盘算nonceexpected值并对照,若是不一致就考证不经由过程,相干要领是check_ajax_referer()–>wp_verify_nonce()。注重到传入check_ajax_referer()$attachment_id参数,该参数取自$_POST['id'],并介入背面的expected盘算,因而当我们直接变动action=crop-image是没法经由过程校验的,须要传入id的,即为postid的值。

在进入wp_crop_image()时还须要通报裁剪后的图片宽度和高度信息,以是还须要增添cropDetails[dst_width]cropDetails[dst_height]两个参数。

wp_crop_image()要领以下

wordpress-image-长途代码实行破绽剖析

从数据库掏出_wp_attached_file后并没有做搜检,形如2019/02/admin.jpeg?../../1.png的文件没法被找到,因而进入_load_image_to_edit_path()经由过程wp_get_attachment_url()要领天生当地url

wordpress-image-长途代码实行破绽剖析

随后实例化一个WP_Image_Editor用来裁剪并天生裁剪后的图片,以后挪用wp_mkdir_p()要领建立文件夹,含有../的参数进入该要领后一样没有经由过滤,终究实行到mkdir建立文件夹

mkdir( $target, $dir_perms, true)

此时的target值是这个模样,穿越目次后在2019目次下建立1文件夹,并天生cropped-1.png文件

D:\phpStudy\PHPTutorial\WWW\wordpress-4.9.8/wp-content/uploads/2019/02/admin.jpeg?../../../1

注重:此处有一个坑,我们视察上面的url,在mkdir的时刻会把admin.jpeg?../作为一个目次,而在Windows下的目次不克不及涌现?,以是上面的payload在Windows下没法胜利,经由测试,#能够存在于Windows目次,因而在Windows下的payload以下所示:

meta_input[_wp_attached_file]=2019/02/admin.jpeg#../../../1/1.png

写入数据库中即为2019/02/admin.jpeg#../../../1/1.png

终究组织第二个数据包触发裁剪图片并生存:

wordpress-image-长途代码实行破绽剖析

终究在指定目次下天生裁剪后的图片文件,以cropped-作为前缀

wordpress-image-长途代码实行破绽剖析

如许子我们能够制造一张图片马,在主题文件夹下天生,或许指定恣意目次,被include后便可形成代码实行。

0x04 PoC

见上面剖析

0x05 总结

这个破绽重要成因在于我们能够经由过程参数通报恣意值掩盖数据库中的字段,从而引入../组成目次穿越,在裁剪图片后生存文件时并没有对文件目次做搜检,形成目次穿越破绽,终究能够写入歹意图片被包罗或许经由过程Imagick破绽触发长途代码实行,应用链挺奇妙,值得进修。


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

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

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