可以看到$imgData是由$this->getImgData($img);掌握的,我们跟踪进去
privatefunctiongetImgData($img){if(strripos($img,'http://')!==FALSEORstrripos($img,'https://')!==FALSE){//站外图片$data=file_get_contents($img);}else{//站内图片$file=DOC_ROOT.'/'.$img;if(is_file($file)){$data=file_get_contents($file);}else{returnfalse;}}return$data;}
可以看到这里会限定只能由http://或者https://开头的参数才能获取站外的图片信息
再看看全局搜索crop这个方法看看哪里会调用他

我们在src/application/task/controller/UtilController.php/cropimage创造有个crop_image函数,我们跟踪进去
functioncrop_image($file,$options){//echo$file;$imageCrop=new\extcore\ImageCrop($file,$options);return$imageCrop->crop();}
创造这里会调用到我们上面的crop函数
这里的$file参数也便是我们传给getImgData函数的$img变量,以是这里我们看看如何去掌握他,可以看到crop_image方法里面有一个$paths=explode('.',$img);,便是会根据点去分隔我们的$img参数,然后又要count($paths)==3,我们可以回忆到getImgData限定了http的开头,我们想要phar反序列化的话,必须是phar://的开头,那么我们直接在vps上放置我们的phar文件的路径不就可以了
但是这里有一个问题,我们正常输入一个IP地址的话肯定是弗成的,由于他的count($paths)==3,以是我们可以利用十六进制绕过的方法,以是也就限定了这种方法只能在linux下面利用,这里顺便贴一下之前写的一个转进制的脚本
<?php$ip='127.0.0.1';$ip=explode('.',$ip);$r=($ip[0]<<24)|($ip[1]<<16)|($ip[2]<<8)|$ip[3];if($r<0){$r+=4294967296;}echo"十进制:";echo$r;echo"八进制:";echodecoct($r);echo"十六进制:";echodechex($r);?>
我们在$ip处贴上自己的vps的地址,这里要把稳天生的十六进制前面要加上0x
然后cacheimage函数的
$response=crop_image($paths[0].'.'.$paths[2],$args);
$paths[0].'.'.$paths[2]便是我们想要掌握的参数,由于前面explode把我们的url地址分成了3份,这里把第一份和第三份拼接了起来,于是我们可以布局类似于http://vps-ip/1.1.txt的形式,这里样我们的$paths[0].'.'.$paths[2]也就成为了1.txt也便是我们可控的东西了,同时这里也明白了为什么要将vps-ip转成16进制的缘故原由了
我们同时在vps上放置test.phar的路径,这个cms后台是可以上传jpg文件的,当然phar反序列化的话纵然是jpg后缀的文件也是能够成功反序列的,这里我为了方便直接放在根目录下
到了这一步我们的思路基本就清晰了,我们测试一下$img是否能够精确的打印出来,可以手动添加一个echo $img;
我们访问一下cacheimage的路由
可以看到我们的$img变成了1.txt,getimagesize函数里面也成功吸收到我们放在1.txt里面的内容
我们再cmd传参我们的命令即可看到漏洞已经成功利用
总结漏洞已经上交于cnvd平台,然后这个漏洞由于十六进制绕过的问题,只能在linux下才可以成功实现,以是可以把cms放在docker里面进行测试,然后在一些小的cms里面关于phar反序列化漏洞还是比较好找的,由于一样平常来说后台都是能够上传jpg格式的文件,能够触发phar的函数也蛮多的。
https://www.hetianlab.com/expc.do?ec=ECID5504-22b1-44f6-984f-1339663ac214&pk_campaign=toutiao-wemedia#stu
想要理解文件上传漏洞的事理,通过代码审计节制文件上传漏洞产生的缘故原由、上传绕过的方法以及修复方法。复制上方链接,进入实操靶场!