KPPW是客客团队主打的开源威客系统,同类开源建站产品的领跑者,搭建无物流电子商务在线服务交易平台的首选系统。2014年6月新版KPPW2.5发布了,新版借助客客团队近4年来威客行业的开源产品和商业项目的成熟经验,对前端功能进行了深入改进。KPPW从产品规划、UI设计、程序开发多个环节进行了优化,在未做框架重构情况下对程序进行更优秀的改进。
在control/ajax/upload.php中:
再来看run方法:
在这段方法中,先是获取了$this->getExt ( $fileArr ['name'] ); 文件后缀,这里没有什么问题,然后再生成上传后的随机名+后缀. 最后执行上传操作copyfile
这里先做了$this->validateFormat (),根据文件名来获取后缀,再判断后缀是否合法:
关键看这个条件:in_array ( strtolower ( $this->returninfo ['type'] ), $this->fileFormat ),这里判断type是否合法而且用了或操作,等于这边为true了,整个if条件
就为true了, 而这个type我们可以改动的,只要抓包把
Content-Disposition: form-data; name="name"; filename="1.php"
Content-Type:
中的Content-Type设置成我们想要的值就可以绕过了。
绕过了这个地方以为后面就一帆风顺了,但是还是上传不上去,继续看下面的一个操作$this->fileFilter($fileArray ["tmp_name"],$this->ext)
这个操作实际上是根据文件头来确定文件的后缀,再检测后缀与之前的文件名获取的后缀是否一致。 这本来是一个很好的过滤方法,但开发人员又写错了:
关键看这个操作:in_array ( $typeCode, array ('8297', '8075' ) ) && $fileType = $ext;
如果typecode 等于8297或者8075的时候,就会将filetype赋值为$ext,这样不就是饶过了之前的那个if判断。
POC: 只需要将content-type 设置成jpg 再在上传的文件开头写上Ra 就可以成功绕过上传过滤。 (Ra 获取以后的code值就是8297)