WordPress <= 4.9.6 任意文件删除漏洞

最近 RIPS 团队公开了一个 WordPress 的任意文件删除漏洞(需要登录),目前该漏洞仍然未修复(2018年06月27日),该漏洞影响 Wordpress 最新版 4.9.6。

漏洞原理与危害

该漏洞出现的原因是由于在 WordPress 的wp-includes/post.php文件中wp_delete_attachement()函数在接收删除文件参数时未进行安全处理,直接进行执行导致。

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()中,unlink()传入的$meta['thumb'],未经过任何过滤处理直接被调用。这段代码的目的是为了在删除图像的同时删除图像的缩略图。在 WordPress 中通过媒体管理器上传的图像被表示为附件类型的内容。$meta['thumb']的值,从数据库中检索,并保存成表示图像的文章自定义字段。因此,在从数据库检索到unlink()函数调用之间表示缩略图文件名的值没有经过任何检查和过滤。如果该值在保存到数据库之前也没有经过对过滤不安全内容处理措施,将可能导致出现利用该功能执行任意文件删除。

...
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 上传目录的相对路径中,当附件被删除时,该文件将被删除。攻击者可利用此漏洞进而执行任意代码。

修复建议

可将下面的代码加载到当前主题的function.php中进行弥补:

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

    return $data;
});

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jeremy的技术点滴

记录解决几个前端小问题的过程

62560
来自专栏JadePeng的技术博客

weex官方demo weex-hackernews代码解读(上)

一、介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android。最新版本的weex已默认将v...

35950
来自专栏贺贺的前端工程师之路

React-Native 遇到的错误1. React-Native 部分组件在debug模式下打包在iOS真机上可以显示,但是release模式下打包在iOS真机上不显示2. React-Native

这段代码在release包的情况是,buttons是空的,是由于if (child.type.name === 'FlowSendButton')这是判断根本不...

16030
来自专栏源码之家

Linux CentOS下,浏览器乱码,支持中文解决;以及中文输入法的安装

43240
来自专栏大史住在大前端

javascript基础修炼(6)——前端路由的基本原理

现代前端开发中最流行的页面模型,莫过于SPA单页应用架构。单页面应用指的是应用只有一个主页面,通过动态替换DOM内容并同步修改url地址,来模拟多页应用的效果,...

17530
来自专栏Samego开发资源

ThinkPHP开发常用信息记录

17630
来自专栏Django中文社区

让 Django 完成翻译:迁移数据库

我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创...

35690
来自专栏BeJavaGod

【老话新说】在springmvc中使用hibernate-validate

老鸟绕道,新手可以看看,目前流行的SSM中都是使用的hibernate-validate进行验证,可以通过页面标签error显示 或者以json方式(推荐),作...

27470
来自专栏liulun

基于.net开发chrome核心浏览器【三】

本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的, Cef项目是C/C++的项目; CefGlue只不过是通...

38250
来自专栏码神联盟

IntelliJ系列 ⑥ | IDEA 之 常见的高效配置全解

33530

扫码关注云+社区

领取腾讯云代金券