你是否正在收集各类网安网安知识学习,合天网安实验室为你总结了1300+网安技能任你学,点击获取免费靶场>>
漏洞的审计
源头是在/src/extend/extcore/ImageCrop.php/crop
这个方法里面发现有个getimagesize
函数,这个函数是能够触发phar
反序列化漏洞的,而这个 cms 是基于 thinkphp5.1 框架二次开发的,这个框架有个反序列化漏洞相信大家都很熟悉了,所以我们的目的就是能控制$imgData
这个变量就行了
可以看到$imgData
是由$this->getImgData($img);
控制的,我们跟踪进去
-
private function getImgData($img){
-
if(strripos($img,
'http://')!==FALSE OR strripos($img,
'https://') !==FALSE) {
//站外图片
-
$data=file_get_contents($img);
-
}
else{
//站内图片
-
$file=DOC_ROOT.
'/'.$img;
-
if(is_file($file)) {
-
$data = file_get_contents($file);
-
}
else{
-
return
false;
-
}
-
}
-
return $data;
-
}
可以看到这里会限制只能由http://
或者https://
开头的参数才能获取站外的图片信息
再看看全局搜索crop
这个方法看看哪里会调用他
我们在src/application/task/controller/UtilController.php/cropimage
发现有个crop_image
函数,我们跟踪进去
-
function crop_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
"八进制:";
-
echo decoct($r);
-
echo
"十六进制:";
-
echo dechex($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
的函数也蛮多的。
本文涉及相关实验:任意文件上传漏洞的代码审计01 (通过本节的学习,了解文件上传漏洞的原理,通过代码审计掌握文件上传漏洞产生的原因、上传绕过的方法以及修复方法。)
转载:https://blog.csdn.net/qq_38154820/article/details/114697423