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

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

缺陷编号: WooYun-2014-67512

漏洞标题: finecms 最新版v2.3.3前台getshell

相关厂商: dayrui.com

漏洞作者: phith0n认证白帽子

提交时间: 2014-07-05 17:56

公开时间: 2014-10-03 17:58

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 代码审计

5人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

不指望厂商确认,我就是要打脸。官方认为自己已经修复的很干净了,在我看来还是一点用处都没有。wooyun官方能不能给我都补个rank,毕竟找了好几个getshell了。
'DR_NAME' => '海豚大众版',
'DR_UPDATE' => '2014.6.21',
'DR_VERSION' => '2.3.3',
'DR_VERSION_ID' => 20

详细说明:

还是头像上传的地方,官方认为自己已经修复的很干净了,在我看来还是一点用处都没有。

不过demo站直接把头像上传的功能给阉割了,正常头像都没法上传了,所以我就不在demo上测试了,下载最新的v2.3.3,本地测试。

版本号:

02.jpg



看到头像上传的代码:

code 区域
public function upload() {

if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
exit('环境不支持');
}

// 创建图片存储文件夹
$dir = FCPATH.'member/uploadfile/member/'.$this->uid.'/';
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
}

// 创建图片存储的临时文件夹
$temp = FCPATH.'cache/attach/'.md5(uniqid().rand(0, 9999)).'/';
if (!file_exists($temp)) {
mkdir($temp, 0777);
}
$filename = $temp.'avatar.zip'; // 存储flashpost图片
file_put_contents($filename, $GLOBALS['HTTP_RAW_POST_DATA']);

// 解压缩文件
$this->load->library('Pclzip');
$this->pclzip->PclFile($filename);
if ($this->pclzip->extract(PCLZIP_OPT_PATH, $temp, PCLZIP_OPT_REPLACE_NEWER) == 0) {
@dr_dir_delete($temp);
exit($this->pclzip->zip(true));
}
@unlink($filename);

// 限制文件名称
$avatararr = array('45x45.jpg', '90x90.jpg', '180x180.jpg');

// 删除多余目录
$files = glob($temp.'*');
foreach($files as $_files) {
if (is_dir($_files)) {
dr_dir_delete($_files);
}
if (!in_array(basename($_files), $avatararr)) {
@unlink($_files);
}
}

// 判断文件安全,删除压缩包和非jpg图片
if($handle = opendir($temp)) {
while (false !== ($file = readdir($handle))) {
if ($file !== '.' && $file !== '..') {
if (!in_array($file, $avatararr)) {
@unlink($temp.$file);
} else {
$info = @getimagesize($temp.$file);
if (!$info || $info[2] !=2) {
@unlink($temp.$file);
} else {
copy($temp.$file, $dir.$file);
@unlink($temp.$file);
}
}
}
}
closedir($handle);
}
@rmdir($temp);



我曾经用的一个方法是,构造一个部分出错的压缩包,在解压时出现错误,导致exit,但已有部分文件已解压成功,这样就能不被后面的unlink删除。另一个方法是竞争型,再php没来得及删除我们解压出来的文件时,先访问它,让它生成一个shell。

我们看finecms里是怎么修复的:

1.用一个随机目录来保存图片,这样就算我成功解压出来,猜不到目录名也访问不了,也无法产生竞争:

code 区域
$temp = FCPATH.'cache/attach/'.md5(uniqid().rand(0, 9999)).'/';



2.删除以后再exit出去,这样就算出错,也会删除残留的文件后再退出:

code 区域
if ($this->pclzip->extract(PCLZIP_OPT_PATH, $temp, PCLZIP_OPT_REPLACE_NEWER) == 0) {
@dr_dir_delete($temp);
exit($this->pclzip->zip(true));
}





看似已经万无一失。

但finecms没想到的是,我们可以构造一个“特别”的压缩包,这个压缩包里我的shell的文件名是“../../../shell.php”,这时我们就能够把shell直接解压到根目录下,我不用猜测目录名,不用惧怕被删除,直接拿下shell。

那么,请看我怎么构造这个压缩包。

漏洞证明:

先把自己的shell改名字成aaaaaaaaaaaaaaaaaaaa.php

之所以起这个名字,就是预留一些空间,方便我之后将文件名改成../../../aaaaaaaaaaa.php而不用怕字符串长度不对。

把文件直接打包成zip,用notepad++打开:

03.jpg



将我画框的俩文件名的前9个字符改成../../../

04.jpg



然后就大功告成。



注册用户,来到头像上传处,上传头像:

01.jpg



抓包将刚才构造的压缩包贴进去:

05.jpg



然后,网站根目录下就会有你的shell了:aaaaaaaaaaa.php

06.jpg

修复方案:

呵呵

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-07-05 18:31

厂商回复:

六月就修复,可以测试官方演示站点

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-07-05 18:08 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    恭喜师傅, 乌云还是有良心的。 上个首页 冒冒泡

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

    @′ 雨。 哭了,上首页没rank还是0蛋呀

  3. 2014-07-05 18:37 | 梧桐雨 认证白帽子 ( 核心白帽子 | Rank:1643 漏洞数:189 | 学无止境)
    0

    这是比忽略更大的羞辱

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

    @dayrui.com 我知道你们的套路,我测试的时候zip组件都没有,头像都传不上去。然后漏洞发出来,你们会修了,然后开始BBBB说自己已经修复过,为啥我每次提交的时候下载下来的版本都没修复?真是逗比,我下的6.21版本,你六月份修复,啥时候,该不会是6.22吧?呵呵,反正我照拿我的通用型奖金,还真感谢你们给我提供了这么多getshell的机会,让我把奖金赚的满满的。退一万步,就算你们6月修复,但为何不发布新版本,现在都7月5号了,不把用户的安全放在眼里的厂商,祝你们早倒闭早超生~谢谢~

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

    @梧桐雨 别说出来,多不好呀~~

  6. 2014-07-05 18:48 | 梧桐雨 认证白帽子 ( 核心白帽子 | Rank:1643 漏洞数:189 | 学无止境)
    1

    @phith0n 我完全理解,这样不尊重白帽子成果的厂商真是应该TJJTDS

  7. 2014-07-05 19:11 | Mosuan ( 普通白帽子 | Rank:449 漏洞数:175 | 尘封此号,不装逼了,再见孩子们。by Mosua...)
    0

    @phith0n 这位大侠也是忽略了我两个,然后一个给我1rank

  8. 2014-07-05 20:39 | ′ 雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:198 | Only Code Never Lie To Me.)
    0

    师傅 官网格盘 走起,

  9. 2014-07-06 03:07 | Annabelle ( 实习白帽子 | Rank:56 漏洞数:17 | .)
    0

    有些话,不要说出来嘛~

  10. 2014-07-06 07:12 | mramydnei ( 普通白帽子 | Rank:400 漏洞数:87 )
    0

    @dayrui.com 官方其实都是知道这些洞的。只是懒的修或没时间罢了 怎么说呢,不足为虑? 我是不是说到你心里边去了?出来回复个yes呗 呵呵

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

    官网格盘 走起

  12. 2014-07-10 00:29 | HackPanda ( 普通白帽子 | Rank:117 漏洞数:16 | Talk is cheap,show me the shell.)
    0

    从头到尾看了厂商的解释和评分…感觉国内信息安全又没希望了…@xsser 这厂商咋办?…

  13. 2014-08-07 23:31 | bitcoin ( 普通白帽子 | Rank:857 漏洞数:248 | 学习是最好的投资!)
    0

    Rank看不懂

  14. 2014-08-16 08:21 | July ( 路人 | Rank:29 漏洞数:11 | 红星闪闪)
    0

    @dayrui.com 厂商的回复,处处带着挑衅语气,挑战白帽子的脾气,何必呢?最后,还不是让一群白帽子针对你。希望你不是下一个织梦.(织梦的下坡路、因为你们有之梦火)

  15. 2015-07-08 15:25 | 1c3z ( 普通白帽子 | Rank:297 漏洞数:63 | @)!^)
    0

    学习了!!

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