披露状态:
2014-01-25: 细节已通知厂商并且等待厂商处理中
2014-01-26: 厂商已经确认,细节仅向厂商公开
2014-01-29: 细节向第三方安全合作伙伴开放
2014-02-05: 细节向核心白帽子及相关领域专家公开
2014-02-15: 细节向普通白帽子公开
2014-03-07: 细节向实习白帽子公开
2014-04-25: 细节向公众公开
简要描述:
PHPCMS前台存在严重设计缺陷
利用这个设计缺陷可导致任意代码/命令执行,当然可Getshell.
但PHPCMS代码执行不是这篇文章的主题,今天的主题是:
主题一:给大家介绍一种通用的设计缺陷,希望能引起各个厂商重视,以及由此衍生出来的一种比较新颖的漏洞利用方法,此设计缺陷目前我已在多个CMS上证明.
主题二:我想说的是当我们有任何奇思妙想的时候,哪怕这个想法"不切实际"、"不可能",只要我们想方设法去实践,就会有意想不到的效果,这个漏洞就是证明.
PS: 明天放假了,在这里祝大家新年快乐!
详细说明:
#1 前言
猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都完完了…
#2 叼着炸药包的猛兽来了
请先看下面这段代码
这段代码实际意义不大,不过,没关系我们重在研究嘛,一种典型的”将猛兽放进室内,才杀之”的案例,我们来看看
上述代码即存在本文所讲的设计缺陷
可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,后面的unlink($_GET['dst']);将之删除...
但是,各位厂商们 你们可曾想到这个木马可能在你们删除之前,生成了新的木马文件,结果可想而知,SO... 还请在设计产品时多考虑考虑....
#3 PHPCMS案例
PHPCMS相应的设计缺陷在上传头像的功能处,我们来看看其代码
/phpsso_server/phpcms/modules/phpsso/index.php 第572行开始 uploadavatar()函数
大概意思是解压ZIP文件,再删除非jpg文件,目录等(看见了吧,产生了#2所述的设计缺陷,典型的引狼入室,再杀之的设计理念),但由于在此处出现过上传漏洞,增加了这么一行代码:
只允许jpg格式文件,不允许php后缀的文件,这为我们下面的漏洞利用带来了不少的麻烦,但别急,后面我会讲到突破的方法...
#4 突破限制产生php临时文件
虽然代码限制了只能是jpg格式的文件,但我们的文件名可以是1.php.php.jpg 对吧,
想到什么没有呢?对!采用文件名截断...行动吧
(为了方便调试,我们加入如下代码,即在解压zip文件后,删除非jpg文件前中断代码的执行)
结果,成功在目录下生成了1.php文件
#5 漏洞利用poc
只要有php文件生成那就好办了,poc构想如下:
正常情况:
上传头像-->生成临时文件(1.php)-->删除非jpg文件
我们想要的情况:
上传头像-->生成临时文件(1.php)-->1.php在上层目录生成shell.php文件-->删除1.php等非jpg文件,留下shell.php文件-->成功
1.php.php.jpg文件的内容为:
同时用数字填充,大小为1 2M左右,同时打包为ZIP包,如图:
当然为了能顺利的利用,手工是不行的,程序的执行多快啊 是吧...
于是我们利用PHP写出POC,打开至少15个CMD窗口跑起来,模仿多线程嘛,哈哈...
我相信不一会就会在上层目录生成我们想要的shell.php文件,POC如下 这里就不演示了...
漏洞证明:
#6 Exp利用代码
为了方便利用,最后我用py写了最终的EXP,代码如下
#7 Exp跑起来
效果如下所示
修复方案:
你们懂.