近期,外网的RIPSTECH安全研究职员曝出WordPress的远程代码实行,是通过目录遍历和本地文件包含这两个漏洞组合而成。这个漏洞在WordPress的核心代码中存在韶光超过了6年。
影响要利用这个漏洞,攻击者必须在目标站点拥有author权限,能够登录后台。而RIPSTECH同时也表示,他们还创造了一个WordPress的权限漏洞,能够使任何人登录到WordPress网站,目前该漏洞还没表露。
干系视频:https://v.youku.com/v_show/id_XNDA3MTY2MDU1Ng==.html?spm=a2h3j.8428770.3416059.1

目前只有5.0.0受影响,4.9.9和5.0.1版本中的某一个安全补丁使该漏洞无效,但目录遍历漏洞依然存在。
但是,如果WordPress站点上的某个插件没有精确处理Post me ta,都有可能使网站不屈安。而在过去的几个月内,RIPSTECH已经不雅观测有数百万生动量的插件存在这种问题。
而根据WordPress下载页面的数据,约有33%的网站利用了该插件。综合考虑,潜在的受到该漏洞影响的网站的数量级为百万。
背景当图像上传到WordPress时,首先会保存到wp-content/uploads。WordPress同时也会在数据库中创建和保存图像的内部引用,以记录跟踪图片元信息,如上传韶光等。
此元信息在数据库中作为Post me ta进行存储。每一条都是一个键值对,分配一个特定的ID。
Example Post me ta reference to an uploaded image ‘evil.jpg’MariaDB [wordpress]> SELECT FROM wp_postme ta WHERE post_ID = 50;+---------+-------------------------+----------------------------+| post_id | me ta_key| me ta_value |+---------+-------------------------+----------------------------+| 50 | _wp_attached_file | evil.jpg || 50 | _wp_attachment_me tadata | a:5:{s:5:\"大众width\公众;i:450 ... |...+---------+-------------------------+----------------------------+
在上面的例子中,图像被分配post_ID50。如果用户希望利用或编辑该图像,WordPress将在wp-content/uploads文件夹下查找数据库中_wp_attached_file值所对应的图片。
核心问题-Post me ta会被覆盖
WordPress 4.9.9和5.0.1之前的版本中的这些Post me ta的问题在于可以被修正为任意值。
当图像的干系信息被更新(例如,它的描述被变动)时,将调用edit_post()函数。而此函数直接浸染于$_POST数组。
function edit_post( $post_data = null ) { if ( empty($postarr) ) $postarr = &$_POST; ⋮ if ( ! empty( $postarr['me ta_input'] ) ) { foreach ( $postarr['me ta_input'] as $field => $value ) { update_post_me ta( $post_ID, $field, $value ); } }
从上可以看到,你可以注入任何数据到Post me ta,并且没有安全检讨。以是攻击者可以更新_wp_attached_file的值。由于WordPress处理图像时并不会重命名文件,只会变动文件。这就将导致稍后先容的目录遍历。
通过修正Post me ta进行目录遍历
目录遍历发生在wp_crop_image()函数中,该函数用于裁剪图像。
当该函数运行时,须要输入图像的ID($attachment_id),并从数据库中获取相应的_wp_attached_file。
但是,由于edit_post()的毛病,$src_file可以被设为任何值。
function wp_crop_image( $attachment_id, $src_x, ...) { $src_file = $file = get_post_me ta( $attachment_id, '_wp_attached_file' ); ⋮
下一步中,WordPress必须确保图像存在并加载它。WordPress有两种加载图像的方法。第一种方法是大略的在wp-content/uploads目录查找由_wp_attached_file所规定的文件名。
如果该方法失落败,WordPress将考试测验从自己的做事器下载图像。为此,它将天生一个下载URL,并且包含wp-content/uploads和_wp_attached_file的值。
举个例子:如果存储在_wp_attached_file的值为evil.jpg,那么Wordpress将首先探求文件wp-content/uploads/evil.jpg;如果找不到,它将考试测验从以下URL下载文件:https://targetserver.com/wp-content/uploads/evil.jpg
考试测验下载图像而不是在本地查找图像的缘故原由是,当访问特定URL时,某个插件可能会动态天生图像。
请把稳,这套流程无任何安全防护。WordPress只会将上传目录和用户掌握输入$src_file连接起来。
一旦WordPress通过wp_get_image_editor()成功加载了一个有效的图像,它就将裁剪该图像。
⋮if ( ! file_exists( \"大众wp-content/uploads/\公众 . $src_file ) ) { // If the file doesn't exist, attempt a URL fopen on the src link. // This can occur with certain file replication plugins. $uploads = wp_get_upload_dir(); $src = $uploads['ba seurl'] . \"大众/\"大众 . $src_file; } else { $src = \"大众wp-content/uploads/\"大众 . $src_file; }$editor = wp_get_image_editor( $src );⋮
然后,被裁剪后的图像被保存回文件系统(不管它是否被下载),文件名是由攻击者掌握的$src_file。系统对文件名字符串所做的唯一修恰是在文件名前加上cropped-。例如上文的evil.jpg,被裁剪后的文件名是cropped-evil.jpg。
接着,wordPress通过wp_mkdir_p()在目标路径中创建新目录。
末了利用图像编辑的save()方法将其写入文件系统。save()方法也无安全检讨。
⋮$src = $editor->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs );$dst_file = str_replace( ba sename( $src_file ), 'cropped-' . ba sename( $src_file ), $src_file );wp_mkdir_p( dirname( $dst_file ) );$result = $editor->save( $dst_file );
想法
虽然将文件加载到图像编辑器中没有实行任何安全检讨。但是,如果文件不是有效的图像,图像编辑器将触发非常。第一个假设可行的攻击手段是,裁剪不在上传目录的图像。
如果WordPress没有在上传文件夹找到,就会试图下载图像,这就会导致远程代码实行。
将_wp_attached_file设置为evil.jpg?shell.php,这使WordPress会发出要求https://targetserver.com/wp-content/uploads/evil.jpg?shell.php。此要求将返回一个有效的图像文件,文件名是evil.jpg?shell.php。
但是,只管图像编辑器的save()方法不会进行安全检讨,但它会将要加载的图像的mime类型附加到新文件名中。在这种情形下,得到的文件名将是evil.jpg?cropped-shell.php.jpg。
当然,我们仍可以利用evil.jpg?/../../evil.jpg来将图像保存在任何目录。
利用每个WordPress主题只位于WordPress的wp-content/themes目录下的一个目录。例如,如果博客访问者想要查看博客文章,WordPress会在当前活动主题的目录中查找post.php文件。如果找到模板,它将include()。
为了拥有额外的自定义内容,可能须要WordPress包含一个上传的自定义模板。为此,用户必须在数据库中设置Post me ta中的_wp_page_template,例如文件名。这里唯一的限定是要包含的文件必须位于当前活动主题的目录中。
常日,用户无法访问此目录,也无法上载任何文件。但是,通过利用上述目录遍历,就可以把包含恶意代码的图像放入当前利用主题的目录中。然后,攻击者利用前面的方法变动_wp_attached_file,以include()恶意图像。末了,攻击者成功进行任意远程代码。
制作恶意图像-GD vs Imagick
WordPress支持两个PHP图像编辑扩展:GD和Imagick。它们之间的差异在于Imagick不会剥离图像的exif元数据,而这个中可以存储PHP代码。GD会压缩编辑每个图像,并剥离所有exif元数据。
但是,通过制作包含精心制作的像素的图像,仍旧可以进行利用。在我们研究php的GD扩展的内部构造时,还在libgd中创造了一个内存毁坏毛病。(CVE-2019-69772)。
本文由白帽汇整理并翻译,不代表白帽汇任何不雅观点和态度
来源:https://nosec.org/home/detail/2261.html
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您供应:网络空间测绘、企业资产网络、企业威胁情报、应急相应做事。