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

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

缺陷编号: WooYun-2016-170707

漏洞标题: 天融信TopScanner四处SQL注入漏洞root权限(无需登录)

相关厂商: 天融信

漏洞作者: xfkxfk认证白帽子

提交时间: 2016-01-18 09:07

公开时间: 2016-04-11 16:08

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序 php源码分析 白盒测试

5人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

天融信TopScanner四处root权限SQL注入漏洞(无需登录)

详细说明:

天融信TopScanner默认会对输入的参数进行转义,大部分都是用了单引号和双引号对输入参数进行了保护,但是还是有一些地方漏掉了,没有进行引号保护,导致绕过gpc进行sql注入



第一处sql注入

文件task/htmlReportShow.php

code 区域
<?
//header('Content-Type: text/html; charset=utf-8');
require_once("CTaskReport.php");
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_pie.php');
require_once ('jpgraph/jpgraph_pie3d.php');

$taskId = $_GET["task_id"];//任务ID号
$company = $_GET["company"];//公司名称
$creator = $_GET["creator"];//报告人姓名
$reportName = $_GET["name"];//报表名称
$modeID = $_GET["modeID"];//模板ID
$style = $_GET["style"];//报告的下载格式:1——html;2——pdf;3——rtf
?>
......
<?php
$report = new CTaskReport($taskId,$company,$creator,$name,$modeID);
$arrReportMode=array();
$arrReportMode=$report->getReportMode($modeID);
$m=1;//一级标号
foreach($arrReportMode as $mode){
$firstName=$mode['firstName'];//一级项名称
$seconNameArray=$mode['secondArrayName'];//二级项名称数组
?>



看这里$modeID = $_GET["modeID"];进入了函数$arrReportMode=$report->getReportMode($modeID);

跟进函数getReportMode,文件task/CTaskReport.php

code 区域
//根据模板的ID得到报表所使用的模板所有项(二维数组)
function getReportMode($modeID){
$arrReportMode = array();
$firstMode=array();//一级项名称
$sql = "select distinct(t_reportsolofirst.RSF_ID),t_reportsolofirst.RSF_Name from t_reportsolorules,t_reportsolofirst where t_reportsolofirst.RSF_ID=t_reportsolorules.RSF_ID and t_reportsolorules.RSM_ID=$modeID";

$result = $this->dl->queryDB($this->cn,$sql);
if(!$result) return false;
while($row = $this->dl->fetchArray($result)){
$temp=array();
$temp['fid']=$row[RSF_ID];
$temp['fname']=$row[RSF_Name];
array_push($firstMode,$temp);
}
//var_dump($firstMode);
if(!$firstMode){
return null;
}
foreach($firstMode as $first){
$mode=array();//临时变量
$mode['firstName']=$first['fname'];//一级名称

$firstID=$first['fid'];
//$subsql="select * from t_reportsolosecond where RSF_ID=$firstID";
$subsql="select * from t_reportsolosecond,t_reportsolorules ";
$subsql.="where t_reportsolorules.RSM_ID=$modeID and t_reportsolorules.RSF_ID=$firstID ";
$subsql.="and t_reportsolorules.RSS_ID=t_reportsolosecond.RSS_ID";

$result = $this->dl->queryDB($this->cn,$subsql); if(!$result) return false;
$i=1;
$temp=array();
while($row = $this->dl->fetchArray($result)){
$temp[$i]=$row[RSS_Name];
$i=$i+1;
}
$mode['secondArrayName']=$temp;//二级名称数组
array_push($arrReportMode,$mode);
}
return $arrReportMode;
}



可以看到$modeID参数直接进入sql语句然后执行,导致sql注入漏洞

而且这里没有判断登录状态,所无需登录即可进行注入,见漏洞证明



第二处sql注入,文件task/rtf_report.php

code 区域
<?php
require_once("phprftlite-1.1.1/rtfreport.php");
require_once("CTaskReport.php");
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_pie.php');
require_once ('jpgraph/jpgraph_pie3d.php');

$taskId = $_GET["task_id"];//任务ID号
$company = $_GET["company"];//公司名称
$creator = $_GET["creator"];//报告人姓名
$reportName = $_GET["name"];//报表名称
$modeID = $_GET["modeID"];//模板ID
$style = $_GET["style"];//报告的下载格式:1——html;2——pdf;3——rtf

$rtf = new RTF_Report();

$rtf->WriteTitle('扫描结果单一任务报告',0);
$header = array('报告名称:','单位名称:','报 告 人:','生成日期:');
$width = array(40,40);
$data = array($reportName,$company,$creator,date('Y年 m月 d日'));
$rtf->InsertInfo($header,$width,$data );


$report = new CTaskReport($taskId,$company,$creator,$name,$modeID);
$arrReportMode=array();
$arrReportMode=$report->getReportMode($modeID);



同理第一处sql注入:

$modeID = $_GET["modeID"];参数进入函数$report->getReportMode($modeID),然后进入sql语句,无引号保护,导致无需登录sql注入漏洞产生



第三处sql注入,文件/task/verticalReportShow.php

code 区域
<?
//header('Content-Type: text/html; charset=utf-8');
require_once("task/CTaskReport.php");
require_once("distribute/relation.php");
require_once ("jpgraph/jpgraph.php");
require_once ("jpgraph/jpgraph_pie.php");
require_once ("jpgraph/jpgraph_pie3d.php");
require_once("tcpdf_php4/config/lang/chi.php");
require_once("tcpdf_php4/tcpdf.php");



$id = $_GET["id"];//当前报告对应的id号
$modeID=$_GET["modeID"];//报表模板ID
$reportName = $_GET["name"];//报告的名称
$company = $_GET["company"];//单位名称
$reporter = $_GET["reporter"];//报告人
$user = $_GET["user"];//当前登录用户
$type = $_GET["type"];//报告类型
$style=$_GET["style"];//报告的下载格式:1——html;2——pdf;3——rtf

$ipTask = $_GET["ip_task"];//ip:taskid1-taskid2-taskid3;ip:taskid1-..... 手动选
$ipList = $_GET["ip_list"];//ip1;ip2;ip3//按月或按年

$month = $_GET["month"];//月份
$year = $_GET["year"];//年份
......
$dl = new DataLayer();
$cn = $dl->connectDB();

$re = new CRelation;
$globalReport = new CTaskReport($id,$company,$reporter,$reportName,$modeID);//("","","");
$taskArr = array();
......
$arrReportMode=array();
$arrReportMode=$globalReport->getReportMode_VH($modeID);
//var_dump($arrReportMode);

$m=1;//一级标号
foreach($arrReportMode as $mode){
$firstName=$mode['firstName'];//一级项名称
$seconNameArray=$mode['secondArrayName'];//二级项名称数组



可以看到参数$modeID=$_GET["modeID"]进入函数$globalReport->getReportMode_VH($modeID);

跟进函数getReportMode_VH,文件/task/CTaskReport.php

code 区域
//根据模板的ID得到报表所使用的模板项,二维数组
//对比报告相关(纵向和横向)
function getReportMode_VH($modeID){
$arrReportMode = array();
$firstMode=array();//一级项名称
$sql ="select RO_ID,RO_Name from t_rankone where RO_ID in (select distinct(`RT_OID`) from t_ranktwo where `RT_ID`in (select t_reportrules.RT_ID from t_reportrules where t_reportrules.RS_ID=$modeID))";
//echo $sql;
$result = $this->dl->queryDB($this->cn,$sql);



可见参数$modeID进入$sql,最后进入数据库被执行,没有引号保护,导致sql注入漏洞

且这里无登录状态验证,导致无需登录即可利用注入



第四处sql注入,文件/task/vertical_rtf_report.php

code 区域
<?php
require_once("task/CTaskReport.php");
require_once("distribute/relation.php");
require_once("phprftlite-1.1.1/rtfreport.php");

$dl = new DataLayer();
$cn = $dl->connectDB();


$id = $_GET["id"];//当前报告对应的id号
$modeID=$_GET["modeID"];//报表模板ID
$reportName = $_GET["name"];//报告的名称
$company = $_GET["company"];//单位名称
$reporter = $_GET["reporter"];//报告人
$user = $_GET["user"];//当前登录用户
$type = $_GET["type"];//报告类型
$style=$_GET["style"];

$ipTask = $_GET["ip_task"];//ip:taskid1-taskid2-taskid3;ip:taskid1-..... 手动选
$ipList = $_GET["ip_list"];//ip1;ip2;ip3//按月或按年

$month = $_GET["month"];//月份
$year = $_GET["year"];//年份
......
$globalReport = new CTaskReport($id,$company,$reporter,$reportName,$modeID);//("","","");
......
$arrReportMode=array();
$arrReportMode=$globalReport->getReportMode_VH($modeID);



漏洞原理同第三处sql注入,参数$modeID进入$sql,最后进入数据库被执行,没有引号保护,导致sql注入漏洞

漏洞证明:

第一处证明:

code 区域
**.**.**.**/task/htmlReportShow.php?task=20120112173538&company=netpower&creator=liuyl&reportName=report1&modeID=1 and 1=1
**.**.**.**/task/htmlReportShow.php?task=20120112173538&company=netpower&creator=liuyl&reportName=report1&modeID=1 and 1=2
明显的sql盲注



1.png





第二处SQL注入

6.png





第三和第四处同第一处和第二处证明



可直接跑出数据,且为root权限:

2.png



3.png



4.png



5.png



由于是盲注,跑数据很慢,就不跑出具体数据了,而且容易就将服务器跑挂。。。



测试案例:

**.**.**.**/

**.**.**.**/

**.**.**.**/

修复方案:

按照此系统使用引号保护加登录验证即可

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2016-01-18 10:07

厂商回复:

已确认,感谢提交

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2016-01-18 09:12 | 伤心的猫猫 ( 普通白帽子 | Rank:115 漏洞数:32 | @sangfor,@qq,@alibaba,@baidu)
    1

    6

  2. 2016-01-18 09:24 | f4ckbaidu ( 普通白帽子 | Rank:243 漏洞数:31 | 开发真是日了狗了)
    0

    当安全产品不安全时。。。

  3. 2016-01-18 09:46 | 麦兜 ( 实习白帽子 | Rank:65 漏洞数:10 | 麦兜爱吃苹果.)
    0

    师傅这是赚奶粉钱的节奏么?

  4. 2016-01-18 10:06 | SH0X8001 ( 路人 | Rank:25 漏洞数:6 | 你猜)
    0

    6666

  5. 2016-01-18 10:33 | 0hey_boy0 ( 普通白帽子 | Rank:132 漏洞数:23 | balabala~)
    0

    师傅这是赚奶粉钱的节奏么?

  6. 2016-01-21 16:36 | Sai、 ( 路人 | Rank:14 漏洞数:4 | for fun……)
    0

    哈哈,这么挖友商洞真的好么?

  7. 2016-01-21 16:53 | 伤心的猫猫 ( 普通白帽子 | Rank:115 漏洞数:32 | @sangfor,@qq,@alibaba,@baidu)
    0

    @Sai、 你知道xfk是谁吗?她其实是天融信自己人。

  8. 2016-01-22 10:17 | Geek.Ethan ( 路人 | Rank:0 漏洞数:1 | 拥有一颗极客的心,却没有极客的行动!)
    0

    @伤心的猫猫。xfkxfk邓工,应该是nsfocus的!

  9. 2016-01-22 13:19 | Sai、 ( 路人 | Rank:14 漏洞数:4 | for fun……)
    0

    @伤心的猫猫 是绿盟的

登录后才能发表评论,请先 登录