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上传文件漏洞的主要内容,如果未能解决你的问题,请参考以下文章