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

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

缺陷编号: WooYun-2014-77223

漏洞标题: php 5.x.x 两个小漏洞(phpyun和新云cms shell作证)

相关厂商: PHP

漏洞作者: menmen519

提交时间: 2014-10-13 15:44

公开时间: 2014-12-30 14:44

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: php缺陷

6人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-13: 细节已通知厂商并且等待厂商处理中
2014-10-18: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-12-12: 细节向核心白帽子及相关领域专家公开
2014-12-22: 细节向普通白帽子公开
2015-01-01: 细节向实习白帽子公开
2014-12-30: 细节向公众公开

简要描述:

php 5.x.x 两个小bug 在实际中的漏洞利用 ,本来说不发这种情况,但是由于在实际的cms白盒审查过程中,发现有鲜活的例子可证明,就当发福利发出来.........

详细说明:

以下测试没有在特殊说明的情况下均为windows底下

第一个问题:



文件包含,大家都知道php文件阶段这么一个例子,在5.2.x里面很常见,但是有谁关心过,文件包含的时候后面可以跟很长的空格呢



我们来看一个例子:



$filename = "d:/aaa/bbb/cccc/a.png";



include($filename);



这样是完全没有问题的,这里不讨论阶段,如果我们改写一下



$filename = "d:/aaa/bbb/cccc/a.png ";



这里跟了一大堆空格在后面,我们看一下还能否包含进来,我们给a.png里面写上phpinfo()



1.png







2.png







3.png







我没有安装linux版本底下5.2.X的直接在linux底下看5.4.x



4.png





5.png







我们也可以给后面的空格填充小圆点 ,也是可以的

6.png







但是在linux底下5.4.x不行





7.png







下来我们测试php 5.3.x,我们搭建环境 还是windows:



8.png







我们改为点号也是可以的

9.png







由此可见linux底下 应该不存在此问题,后续linux底下我们就不测试了





如果想挨个的去测是,我们下载了phpstudy,里面包括了当前php所有的可能性的组合



10.png





下来 我们就不一个个测试了 直接搭建一个最新的5.6





11.png





12.png





13.png







到此为止我们已经分析完毕



结论就是:



文件包含的时候在windows底下,点号 和 空格 是可以被引入进来,并且无妨碍包含





漏洞利用场景:



phpyun:

请看我这个漏洞http://**.**.**.**/bugs/wooyun-2014-075752



当然了 这个漏洞利用了mysql的阶段,重新获取的时候不会添加空白字符导致



那么由以上的推论来算,就是她引入了空白字符,我们照样还是可以进行文件包含





假设:php云对 文件名里面过滤了空白字符,也就是说判断当前的文件名是不是一个合法的文件名,一般点号是不被过滤的,那么我们照样还是可以用点号隔断,在mysql层面阶段,然后正常引入进行文件包含





这个小漏洞我们就分析完了,下来我们再看另一个漏洞



php里面有一个is_file函数,从官网查的的信息是,这个函数是判断,当前传递过来的是不是一个文件



14.png





这是w3c给出来的例子,可以足够说明,如果传递过来的是目录的话,这个函数会返回空值



那么实际情况是不是这样呢,看我测试一下





在我们d盘xxx目录底下有三个文件,我们在建立一个aaaa目录作参照



15.png







环境为windows底下,代码如下:

code 区域
<?php
$filename = "D:/xxxx/aaaa.sql/";
if(is_file($filename)){
echo file_get_contents($filename);
}else{
echo "this file is not exist!!!";
}
?>





执行如图所示



16.png





这里大家都看出来了,我顺便也把file_get_contents这个函数也测了,其实所有操作文件的应该都具有这个漏洞





php版本为5.2.x这个版本会产生这样的效果,跟官网给出来的定义完全不一样,那么我们在去linux底下验证一下



17.png





由此可以看出来,没有去做windows底下的判断,这时候我们也就不去测试windows了,看看php的最高版本5.6.x在windows是不是也是这样

18.png





神奇的事情发生了,居然在最高版本,这个函数处理了这种情况,我们测试了我们的三个文件都不能通过



我们对我们构造的三个文件分别同一测试:

code 区域
<?php

$file_array = array(
"D:/xxxx/aaaa_1.sql/",
"D:/xxxx/aaaa.sql/",
"D:/xxxx/aaaa.sql/"
);

foreach($file_array as $filename){
if(is_file($filename)){
echo file_get_contents($filename)."<br>";
}else{
echo "this file is not exist!!!<br>";
}
}
?>





然后访问 这时候php是5.6.x

19.png



20.png





21.png





22.png





后续的5.5.x就不用测试了,也就是说在5.2.x时候有这个漏洞





找到了这个,我们就看一下一个oday 我就不发了 直接在这里分析一下这个漏洞的利用

新云cms(yxcms)





dbbackController.php(38-49):

code 区域
public function recover()
{
@set_time_limit(0);
$file=$_GET['f'];
if(empty($file)) $this->error('参数错误');
if(self::$ndb->importSql($file.'/'))
{
$this->success('数据恢复成功!',url('dbback/index'));
}
else{
$this->error('数据恢复失败!');
}
}





这里做文件还原用:



$file=$_GET['f']; 这个参数没有做任何处理,然后直接流向importSql($file.'/'))



这里 已经看到了没有,程序员的误区,猜测



1.如果它本身就支持单文件还原的话,那么在php的高版本中$file.'/' 永远就是个目录

2.如果它本身就不支持单文件还原的话,那么在php低版本中$file.'/' 这个也可以是个文件



问题就出来了,我们跟进去:

Dbbak.class.php:(158-170):

code 区域
public function importSql($rdir){
if(empty($rdir)) $this->error('没有指定备份文件夹路径');
$dir=$this->dataDir.$rdir;
if(is_file($dir))
{
return $this->_importSqlFile($dir);
}
if($link = opendir($dir))
{
$fileArry = scandir($dir);
$pattern = "/_part[0-9]+.sql.php$|_all.sql.php$/";





漏洞出现了吧 ,这里用了一个is_file,如果是一个文件,那么直接读取文件,进行数据库还原操作





再次猜想,我们前台上传一个图片,图片的内容就是大量的sql语句,那么这里是可控的



如果我们上传的图片为 dsada8926372.png,那么传递到这里就是

/xxx/yyyy/ggg/../../../目录/dsada8926372.png/ 这时候 就是一个我们可以控制的sql文件了



哈哈 牛逼不 完全越过了条件判断



我们访问url:

**.**.**.**/YXcmsApp1.2.5/index.php?r=admin/dbback/recover&f=1402565182



这居然还是一个get类型的操作,也没有csrf防御



23.png





证实了我所说的一切,我就不前台上出啊了直接给出来一个放到可写目录里面

**.**.**.**/YXcmsApp1.2.5/index.php?r=admin/dbback/recover&f=../../upload/shell.png

24.png







这里可怕的 因为可以批量执行sql语句,所以也能进行提权等等,可以参照我这一片文章

http://**.**.**.**/305654676.html





之后的csrf 的利用想必大家都会了 直接给管理员发一个要审核的图片 图片的src就是这个get链接



然后就没有然后了

..............................

漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-12-30 14:44

厂商回复:

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-10-13 15:56 | BadCat ( 实习白帽子 | Rank:81 漏洞数:21 | 悲剧的我什么都不会)
    0

    牛逼了!!

  2. 2014-10-13 16:02 | Moc ( 路人 | Rank:23 漏洞数:12 | 屌丝何苦为难屌丝)
    0

    录像的师傅看这里

  3. 2014-10-13 16:15 | char ( 路人 | Rank:13 漏洞数:3 | 中国平安,不只保险这么简单。)
    1

    灯光请打到2楼,这样就反光看不清2楼了,三楼清晰可见。

  4. 2014-10-13 16:27 | 小飞 ( 实习白帽子 | Rank:52 漏洞数:12 | 挖洞对于16岁的我来说实在是太艰难了!)
    1

    四楼出租

  5. 2014-10-13 16:47 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1358 漏洞数:142 | 发扬海绵宝宝的精神! 你不是海绵宝宝,你怎...)
    0

    php向来喜欢忽略...

  6. 2014-10-13 17:23 | onpu ( 普通白帽子 | Rank:354 漏洞数:62 | 不轻诺 故我不负人 不信诺 故人不负我)
    1

    前排瓜子水果出售

  7. 2014-10-13 17:24 | menmen519 ( 普通白帽子 | Rank:914 漏洞数:161 | http://menmen519.blog.sohu.com/)
    1

    @子非海绵宝宝 忽略 就忽略了 我是发福利的 只是提供思路

  8. 2014-10-13 17:26 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1358 漏洞数:142 | 发扬海绵宝宝的精神! 你不是海绵宝宝,你怎...)
    1

    @menmen519 专注通用20年 大神请收下我的膝盖...

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