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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值