这里的全版本是指:最新v9.5.6 + v9 others +phpcms 2008 + ..
这个漏洞在Windows下和Linux下利用方法不一样,鉴于 @phpcms (省略10000字),都懂的..
这里我只给出Windows的利用方法(Linux的利用涉及另一个漏洞,暂不公开)
Tips:这个洞在我手里已经有很长一段时间了,主要目的是分享里面涉及的思路.
#1漏洞文件及相应的代码
/phpcms/libs/classes/attachment.class.php
/phpcms/modules/attachment/attachments.php
造成漏洞的代码(只贴最重要的)
从上面的代码,可以看出上传的文件类型是我们可以控制的,$_POST['filetype_post'] post提交的,于是我们貌似就可以直接上传php类型的文件,是不是呢? 显然不是,接下来的这行代码限制了我们上传的文件格式
很明显,只要文件类似test.php,test.php.php经过此代码后,均会被修改为test._php,test._php._php,显然不是我们想要的结果,我们来分析分析 这个正则替换(这里我们简化下)..
正则的意思是字符串中查找以php结尾或包含"php."的字符串,找到就将之加上相应的下划线替换掉,这个正则表面上看起来似乎没有什么问题,但是仔细想想呢,还是有问题的..
倘若我们上传的文件后缀为".phpX"(这里的"X"表示某一特殊字符),则绕过了这个正则,而恰巧".phpX"可以解析为php(如php3,php4,当然这里这两个不行),或.phpX经过后面函数或程序代码的处理,或利用系统的特性、PHP的特性等,将这个特殊字符处理掉,那不就ok了,下面就来测试这两种情况..
#2 测试用的伪代码
为了更好的测试,我这里简化了代码,更改为如下
#3 思路一:测试除了php3、php4,还有没有其他的后缀可以解析为php
Fuzzing 测试代码1如下(py)
该程序在本地跑起来,效果如图..
可以看出,在Windows环境下,只有php3可以解析为php(Kali Linux测试php5可以解析为php),由于.php3会被转换为._php3,所以这个思路行不通..
#4 思路二:有没有可能将特殊字符串"X"干掉
Fuzzing 测试代码2如下(py)
同样,该程序在本地跑起来,效果如图..
文件名前面的数字是被"干掉"字符的十进制数字,可以看出%81--%99会被干掉..
该特性雷同Windows下对"."和" "(空格)的忽略。
#5 测试phpcms
好,由于经过上面的Fuzzing知道,只要文件名为".phpX"(X表示%81-%99),就可以生成绕过正则生成".php",成功getshell..
首先在网站后台进行如下的设置..
1.内容 > 管理栏目 > 设置投稿 (允许)
2.用户 > 会员组管理 > 管理会员组 > 设置是否允许上传附件(允许上传)
随便上传一个jpg文件(这里是显示phpinfo信息),抓包 修改,如图:
这里有两处需要修改:
点击Forward即可在 /phpcms/uploadfile/2014/0530/ 目录下生成php文件,如图
就到这里了,至于phpcms 2008 getshell的方法与之类似,不再阐述..