上篇【点亮在代码审计中组合利用链(一)】说到组合利用链在代码审计中的思想,该篇借对zzzphp1.7.3审计对此继续分解。
在zzzphp1.7.3版本save.php中up_load函数对文件上传时,上传目录upfolder可控,可将文件上传到任意目录。若目录不存在则自动创建
调用的upload的函数如下
会发现$type也可被我们控制,但是继续会发现上传的文件的文件类型都做了白名单限制,白名单为
,虽然可以通过构造type=PHP5,filename=xxx.php5但是虽然能够成功上传,但是apache默认并不解析php5。
无法利用,比较鸡肋。正如白名单限制的那样,能够被上传的文件类型有三种:zip压缩包(压缩包文件类型不限制)、图片、pdf。若你够仔细会发现有压缩包是一个切入点。那么可以考虑自解压问题,一个本不是个问题而却能够在一定条件因素下造成的重大漏洞。既然上传的文件包含压缩包且上传的目录任意可控,那么程序是否存在一个包含自解压的功能函数,能够自解压目录下的压缩包,从而造成getshell。
在源代码搜索unzip关键字,会发现up_data函数存在我们需要的利用点unzip。代码如下,getfile函数会遍历zip目录下的zip获取压缩包,压缩包存在进入自解压。
由此,将两个点组合成功构造了一个任意文件上传getshell的利用链。
当然该漏洞已经在cnvd上提交过了而官方也更新了版本,于是借题再次分析该漏洞的漏洞成因。
在zzzphp1.7.4版本中对该1.7.3中任意目录上传问题做了修复。
若使用到zzzcms还请更新至1.7.4最新版本。