1-PHP代码审计——PHPCMSV9.2上传文件漏洞

Posted songly_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-PHP代码审计——PHPCMSV9.2上传文件漏洞相关的知识,希望对你有一定的参考价值。

漏洞说明:phpCMSV9.2上传文件漏洞主要是用户管理的头像上传功能对上传的图片使用了zip解压缩功能,但是对于解压后的文件没有完全删除才导致的。

 

漏洞复现环境:

chrome浏览器安装xdebug

phpstrom开发工具

wamp

php-5.4.45

phpcms9.2

 

测试环境网址为www.test.com,环境搭建好后,在浏览器地址栏输入网址http://www.test.com/install安装phpcms9.2

默认都是下一步安装,到账号设置这一步需要设置数据库和cms管理后台的账户,根据自己本地环境设置就好。然后下一步,等待安装完成。

 

漏洞复现

 

访问首页注册一个用户:

 

 

注册完成选择账号管理,修改头像--->点击上传头像照片:

 

 

上传头像照片这里我们需要准备一张123.jpg图片和一个zip格式的压缩文件,test.zip文件中有一个test文件夹,在这个文件夹下有一个test.php文件,文件的内容如下:

 

 

开启浏览器的代理,先上传123.jpg图片,使用burpsuite进行抓包:

 

 

把123.jpg图片文件的数据删除,右键paste from file ,打开test.zip文件

点击forward转发数据包

 

 

在Proxy选项中,选择HTTP history可以看到文件的上传路径为:phpsso_server/uploadfile/avatar/1/1/1/test/test.php

 

 

将burpsuite的url链接复制并粘贴到网址访问可以看到页面是可以正常访问没有报错,上传文件成功:

分析漏洞

 

头像上传功能是在phpcms的phpsso_server\\phpcms\\modules\\phpsso路径下index.php文件,index.php有个uploadavatar方法,上传头像时就会调用这个方法。

使用phpstorm工具开启debug调试模式,当点击上传头像进入debug调试:

可以看到当点击上传头像时就会调用uploadavatar方法,获取用户上传头像的数据保存到$avatardata变量中。

 

$avatarfile变量是保存文件的文件夹路径。

 

 

load_onfig函数创建图片文件夹,$filename变量是完整的文件存储路径,file_put-contents函数的作用就是创建一个.zip后缀的文件包,并存放到$filename指定的存储路径。

 

然后对1.zip文件进行解压缩,这一步没啥可分析的,继续分析后面的代码

 

到这一步才是重点,这一段代码也是引发上传漏洞的真正原因:

分析以上代码可知,readdir函数读取了C:\\wamp\\www\\test.com\\phpsso_server\\uploadfile\\avatar\\1\\1\\1目录下的所有文件,接着做了以下事情:

首先判断文件名是否都合法
再进一步判断文件是否为允许上传的jpg图片文件
如果不是jpg文件则会被unlink函数删除,是jpg文件则写入数据库

但是php中的unlink函数只能删除文件,而之前的1.zip文件肯定会被unlink函数删除掉,解压后的test是一个文件夹,所以unlink函数并不能删除test文件夹。

 

攻击者在上传的文件中多新建了一个文件夹上传,以此来避免被删除。而我们上传的1.zip文件中的test.php文件解压后放在test文件夹中,这才避免被删除。产生漏洞的原因是后台使用了zip压缩处理图片,对C:\\wamp\\www\\test.com\\phpsso_server\\uploadfile\\avatar\\1\\1\\1目录下的文件只判断了一层,没有递归判断。

 

漏洞修复建议

不使用zip压缩处理图片,更新phpcms版本。

 

 

以上是关于1-PHP代码审计——PHPCMSV9.2上传文件漏洞的主要内容,如果未能解决你的问题,请参考以下文章

[代码审计]极致CMS1.9.5存在文件上传漏洞

[代码审计]极致CMS1.9.5存在文件上传漏洞

php代码审计8审计文件上传漏洞

JAVA代码审计 任意文件上传篇

PHP代码审计学习——文件上传

代码审计之文件上传漏洞实验