漏洞概要 关注数(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缺陷
漏洞详情
披露状态:
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()
我没有安装linux版本底下5.2.X的直接在linux底下看5.4.x
我们也可以给后面的空格填充小圆点 ,也是可以的
但是在linux底下5.4.x不行
下来我们测试php 5.3.x,我们搭建环境 还是windows:
我们改为点号也是可以的
由此可见linux底下 应该不存在此问题,后续linux底下我们就不测试了
如果想挨个的去测是,我们下载了phpstudy,里面包括了当前php所有的可能性的组合
下来 我们就不一个个测试了 直接搭建一个最新的5.6
到此为止我们已经分析完毕
结论就是:
文件包含的时候在windows底下,点号 和 空格 是可以被引入进来,并且无妨碍包含
漏洞利用场景:
phpyun:
请看我这个漏洞http://**.**.**.**/bugs/wooyun-2014-075752
当然了 这个漏洞利用了mysql的阶段,重新获取的时候不会添加空白字符导致
那么由以上的推论来算,就是她引入了空白字符,我们照样还是可以进行文件包含
假设:php云对 文件名里面过滤了空白字符,也就是说判断当前的文件名是不是一个合法的文件名,一般点号是不被过滤的,那么我们照样还是可以用点号隔断,在mysql层面阶段,然后正常引入进行文件包含
这个小漏洞我们就分析完了,下来我们再看另一个漏洞
php里面有一个is_file函数,从官网查的的信息是,这个函数是判断,当前传递过来的是不是一个文件
这是w3c给出来的例子,可以足够说明,如果传递过来的是目录的话,这个函数会返回空值
那么实际情况是不是这样呢,看我测试一下
在我们d盘xxx目录底下有三个文件,我们在建立一个aaaa目录作参照
环境为windows底下,代码如下:
执行如图所示
这里大家都看出来了,我顺便也把file_get_contents这个函数也测了,其实所有操作文件的应该都具有这个漏洞
php版本为5.2.x这个版本会产生这样的效果,跟官网给出来的定义完全不一样,那么我们在去linux底下验证一下
由此可以看出来,没有去做windows底下的判断,这时候我们也就不去测试windows了,看看php的最高版本5.6.x在windows是不是也是这样
神奇的事情发生了,居然在最高版本,这个函数处理了这种情况,我们测试了我们的三个文件都不能通过
我们对我们构造的三个文件分别同一测试:
然后访问 这时候php是5.6.x
后续的5.5.x就不用测试了,也就是说在5.2.x时候有这个漏洞
找到了这个,我们就看一下一个oday 我就不发了 直接在这里分析一下这个漏洞的利用
新云cms(yxcms)
dbbackController.php(38-49):
这里做文件还原用:
$file=$_GET['f']; 这个参数没有做任何处理,然后直接流向importSql($file.'/'))
这里 已经看到了没有,程序员的误区,猜测
1.如果它本身就支持单文件还原的话,那么在php的高版本中$file.'/' 永远就是个目录
2.如果它本身就不支持单文件还原的话,那么在php低版本中$file.'/' 这个也可以是个文件
问题就出来了,我们跟进去:
Dbbak.class.php:(158-170):
漏洞出现了吧 ,这里用了一个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防御
证实了我所说的一切,我就不前台上出啊了直接给出来一个放到可写目录里面
**.**.**.**/YXcmsApp1.2.5/index.php?r=admin/dbback/recover&f=../../upload/shell.png
这里可怕的 因为可以批量执行sql语句,所以也能进行提权等等,可以参照我这一片文章
http://**.**.**.**/305654676.html
之后的csrf 的利用想必大家都会了 直接给管理员发一个要审核的图片 图片的src就是这个get链接
然后就没有然后了
..............................
漏洞证明:
修复方案:
版权声明:转载请注明来源 menmen519@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2014-12-30 14:44
厂商回复:
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值