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

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

缺陷编号:wooyun-2014-077223

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

相关厂商:PHP

漏洞作者: menmen519

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

修复时间:2014-12-30 14:44

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

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

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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://wooyun.org/bugs/wooyun-2014-075752
当然了 这个漏洞利用了mysql的阶段,重新获取的时候不会添加空白字符导致
那么由以上的推论来算,就是她引入了空白字符,我们照样还是可以进行文件包含
假设:php云对 文件名里面过滤了空白字符,也就是说判断当前的文件名是不是一个合法的文件名,一般点号是不被过滤的,那么我们照样还是可以用点号隔断,在mysql层面阶段,然后正常引入进行文件包含
这个小漏洞我们就分析完了,下来我们再看另一个漏洞
php里面有一个is_file函数,从官网查的的信息是,这个函数是判断,当前传递过来的是不是一个文件

14.png


这是w3c给出来的例子,可以足够说明,如果传递过来的是目录的话,这个函数会返回空值
那么实际情况是不是这样呢,看我测试一下
在我们d盘xxx目录底下有三个文件,我们在建立一个aaaa目录作参照

15.png


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

<?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


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

<?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):

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):

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:
http://192.168.10.70/YXcmsApp1.2.5/index.php?r=admin/dbback/recover&f=1402565182
这居然还是一个get类型的操作,也没有csrf防御

23.png


证实了我所说的一切,我就不前台上出啊了直接给出来一个放到可写目录里面
http://192.168.10.70/YXcmsApp1.2.5/index.php?r=admin/dbback/recover&f=../../upload/shell.png

24.png


这里可怕的 因为可以批量执行sql语句,所以也能进行提权等等,可以参照我这一片文章
http://menmen519.blog.sohu.com/305654676.html
之后的csrf 的利用想必大家都会了 直接给管理员发一个要审核的图片 图片的src就是这个get链接
然后就没有然后了
..............................

漏洞证明:

修复方案:

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


漏洞回应

厂商回应:

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

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

厂商回复:

最新状态:

暂无