安全矩阵

 找回密码
 立即注册
搜索
查看: 2482|回复: 0

对某cms的一次审计思路

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2021-3-12 22:21:06 | 显示全部楼层 |阅读模式
原文链接:对某cms的一次审计思路

漏洞的审计
源头是在/src/extend/extcore/ImageCrop.php/crop这个方法里面发现有个getimagesize函数,这个函数是能够触发phar反序列化漏洞的,而这个 cms 是基于 thinkphp5.1 框架二次开发的,这个框架有个反序列化漏洞相信大家都很熟悉了,所以我们的目的就是能控制$imgData这个变量就行了

可以看到$imgData是由$this->getImgData($img);控制的,我们跟踪进去
  1. private function getImgData($img){
  2.         if(strripos($img, 'http://')!==FALSE OR strripos($img,'https://') !==FALSE) { //站外图片
  3.             $data=file_get_contents($img);
  4.         }else{ //站内图片
  5.             $file=DOC_ROOT.'/'.$img;
  6.             if(is_file($file)) {
  7.                 $data = file_get_contents($file);
  8.             }else{
  9.                 return false;
  10.             }
  11.         }
  12.         return $data;
  13.     }
复制代码

可以看到这里会限制只能由http://或者https://开头的参数才能获取站外的图片信息

再看看全局搜索crop这个方法看看哪里会调用他

我们在src/application/task/controller/UtilController.php/cropimage发现有个crop_image函数,我们跟踪进去

  1. function crop_image($file, $options){
  2.     // echo $file;
  3.     $imageCrop=new \extcore\ImageCrop($file, $options);
  4.     return $imageCrop->crop();
  5. }
复制代码

发现这里会调用到我们上面的crop函数

这里的$file参数也就是我们传给getImgData函数的$img变量,所以这里我们看看如何去控制他,可以看到crop_image方法里面有一个$paths=explode('.',$img);,就是会根据点去分隔我们的$img参数,然后又要count($paths)==3,我们可以回想到getImgData限制了http的开头,我们想要phar反序列化的话,必须是phar://的开头,那么我们直接在vps上放置我们的phar文件的路径不就可以了
但是这里有一个问题,我们正常输入一个IP地址的话肯定是不行的,因为他的count($paths)==3,所以我们可以使用十六进制绕过的方法,所以也就限制了这种方法只能在linux下面使用,这里顺便贴一下之前写的一个转进制的脚本

  1. <?php
  2. $ip = '127.0.0.1';
  3. $ip = explode('.',$ip);
  4. $r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
  5. if($r < 0) {
  6.     $r += 4294967296;
  7. }
  8. echo "十进制:";
  9. echo $r;
  10. echo "八进制:";
  11. echo decoct($r);
  12. echo "十六进制:";
  13. echo dechex($r);
  14. ?>
复制代码

我们在$ip处贴上自己的vps的地址,这里要注意生成的十六进制前面要加上0x

然后cacheimage函数的

  1. $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=weixin-wemedia#stu















回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-21 03:37 , Processed in 0.012598 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表