wordpress4.9.7版本前任意文件删除漏洞修复方法

2018-12-1816:09:05网站建设与开发Comments3,146 views字数 1859阅读模式

RIPS团队公开了wordpress 4.9.6以及4.9.6之前版本存在的任意文件删除漏洞,通过该漏洞,具有登录上传附件权限的用户可以删除网站上任意的文件,该漏洞在4.9.7版本被修复,如果正在使用wordpress 4.9.7以下版本的用户可以更新到最新版本修复该漏洞,不想更新的站长可以通过下面的方法修复。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

漏洞原理与危害

由于WordPress文件wp-includes/post.php中的函数wp_delete_attachement()在接收删除文件参数时未进行安全处理,直接进行执行导致该漏洞的出现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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'],未经过任何过滤处理直接被调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

这段代码的目的是为了在删除图像的同时删除图像的缩略图。在wp_delete_attachement()函数中,$meta['thumb']的值从数据库中检查,并保存成表示图像的文章自定义字段,但是如果代码不对$meta['thumb']的内容进行任何检查和过滤,就会导致利用该功能执行任意文件删除的操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

1
2
3
4
5
6
7
8
9
10
11
12
...
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()函数执行之间,没有安全措施来确保这个值为真正是在编辑的附件缩略图。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

$_POST['thumb']可以变为任意文件的路径,这个值可以保存到WordPress上传目录的相对路径中,当附件被删除时,该文件将被删除。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

修复方法

方法一:把wordpress升级到4.9.7或以上版本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

方法二:把下面的代码放到当前使用主题的functions.php文件中:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html

1
2
3
4
5
6
7
8
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;
}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/cms/8732.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/cms/8732.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定