0x00 环境准备

XYHCMS官网:http://www.xyhcms.com/

网站源码版本:XYHCMS V3.5(2017-12-04 更新)

程序源码下载:http://www.xyhcms.com/Show/download/id/2/at/0.html

测试网站首页:

0x01 代码分析

1、漏洞文件位置:/App/Common/Lib/YunUpload.class.php   第231-271行:

  1. public function _upload() {
  2. $ext = ''; //原文件后缀
  3. foreach ($_FILES as $key => $v) {
  4. $strtemp = explode('.', $v['name']);
  5. $ext     = end($strtemp); //获取文件后缀,或$ext = end(explode('.', $_FILES['fileupload']['name']));
  6. break;
  7. }
  8. $upload = new \Think\Upload(); //new Upload($config)
  9. //修配置项
  10. 10.     $upload->autoSub  = true; //是否使用子目录保存图片
  11. 11.     $upload->subType  = 'date'; //子目录保存规则
  12. 12.     $upload->subName  = array('date', 'Ymd');
  13. 13.     $upload->maxSize  = get_upload_maxsize(); //设置上传文件大小
  14. 14.     $upload->exts     = $this->allowType; //设置上传文件类型
  15. 15.     $upload->rootPath = $this->rootPath; //上传根路径
  16. 16.     $upload->savePath = $this->subDirectory; //上传(子)目录
  17. 17.     $upload->saveName = array('uniqid', ''); //上传文件命名规则
  18. 18.     $upload->replace  = true; //存在同名是否覆盖
  19. 19.     $upload->callback = false; //检测文件是否存在回调函数,如果存在返回文件信息数组
  20. 20.       if ($info = $upload->upload()) {
  21. 21.
  22. 22.         //判断是添加水印--有缩略的才添加水印
  23. 23.         if ($this->thumFlag) {
  24. 24.             $this->_doWater($info);
  25. 25.         }
  26. 26.           //是否有缩略图
  27. 27.         if ($this->thumFlag) {
  28. 28.             $this->_doThum($info);
  29. 29.         }
  30. 30.         return $info;
  31. 31.       } else {
  32. 32.           //$str = array('err' =>1 ,'msg' => $upload->getError() );
  33. 33.         return $upload->getError();
  34. 34.     }
  35. 35.   }

这段图片上传函数中对上传参数进行设置,然后上传。文件上传类型是客户端参数可控的,导致攻击者可以修改文件上传类型,上传恶意脚本,上传完还得去保存,继续去看一下程序如何处理保存:

文件位置:/App/Manage/Controller/SystemController.class.php,第194-217行中:

  1. public function site() {
  2. if (IS_POST) {
  3. $data = I('config', array(), 'trim');
  4. foreach ($data as $key => $val) {
  5. if (stripos($val, '<?php') !== false) {
  6. $data[$key] = preg_replace('/<\?php(.+?)\?>/i', '', $val);
  7. }
  8. 10.         }
  9. 11.
  10. 12.         $data['CFG_IMGTHUMB_SIZE'] = strtoupper($data['CFG_IMGTHUMB_SIZE']);
  11. 13.         $data['CFG_IMGTHUMB_SIZE'] = str_replace(array(',', 'X'), array(',', 'X'), $data['CFG_IMGTHUMB_SIZE']);
  12. 14.         if (empty($data['CFG_IMGTHUMB_SIZE'])) {
  13. 15.             $this->error('缩略图组尺寸不能为空');
  14. 16.         }
  15. 17.
  16. 18.         if (!empty($data['CFG_IMAGE_WATER_FILE'])) {
  17. 19.             $img_ext = pathinfo($data['CFG_IMAGE_WATER_FILE'], PATHINFO_EXTENSION);
  18. 20.             $img_ext = strtolower($img_ext);
  19. 21.             if (!in_array($img_ext, array('jpg', 'gif', 'png', 'jpeg'))) {
  20. 22.                 $this->error('水印图片文件不是图片格式!请重新上传!');
  21. 23.                 return;
  22. 24.             }
  23. 25.           }

这段函数在全局配置存储过程中进行检测,注意看红色代码部分,检测图片文件格式是否是'jpg', 'gif', 'png', 'jpeg',否则提示重新上传,但是仅仅只是提示,并没有删除文件,也就是我们如果上传脚本文件,已经成功保存在服务器上面。

程序在实现上对文件上传过程处理不当,导致可以被绕过,通过该漏洞上传脚本木马,获取服务器控制权限。

0x02 漏洞利用

1、登录后台,在系统设置—网站设置—上传配置,修改文件上传类型,然后上传文件:

2、点击保存时,发现程序提示不是图片格式,请重新上传

3、继续去访问刚才成功上传的脚本,发现脚本文件依然在服务器上,并没有被删除。

4、通过菜刀链接,控制网站服务器

0x03 修复建议

1、重新梳理文件上传过程,通过白名单限制上传文件后缀;

2、禁止上传目录脚本执行权限。

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

【代码审计】XYHCMS V3.5文件上传漏洞分析的更多相关文章

  1. 1.5 webshell文件上传漏洞分析溯源(1~4)

    webshell文件上传漏洞分析溯源(第一题) 我们先来看基础页面: 先上传1.php ---->   ,好吧意料之中 上传1.png  ---->   我们查看页面元素 -----> ...

  2. 【代码审计】UKCMS_v1.1.0 文件上传漏洞分析

      0x00 环境准备 ukcms官网:https://www.ukcms.com/ 程序源码下载:http://down.ukcms.com/down.php?v=1.1.0 测试网站首页: 0x0 ...

  3. 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件上传漏洞分析

      0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...

  4. 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  5. 【代码审计】BootCMS v1.1.3 文件上传漏洞分析

      0x00 环境准备 BootCMS官网:http://www.kilofox.net 网站源码版本:BootCMS v1.1.3  发布日期:2016年10月17日 程序源码下载:http://w ...

  6. 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞分析

      0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...

  7. UEditor编辑器两个版本任意文件上传漏洞分析

    0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...

  8. [转]UEditor编辑器两个版本任意文件上传漏洞分析

    0x01 前言 UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点 ,被广大WEB应用程序所使用:本次爆出的高危漏洞属于.NET版本,其它的 ...

  9. 关于finecms v5 会员头像 任意文件上传漏洞分析

    看到我私藏的一个洞被别人提交到补天拿奖金,所以我干脆在社区这里分享,给大家学习下 本文原创作者:常威,本文属i春秋原创奖励计划,未经许可禁止转载! 1.定位功能 下载源码在本地搭建起来后,正常登陆了用 ...

随机推荐

  1. JDBC(3)—ResultSet结果集

    简介:ResultSet:结果集.封装了使用JDBC进行查询的结果.Statement只能进行更新操作,所以使用ResultSet进行查询操作. 1.调用Statement对象的executeQuer ...

  2. c# 以换行(\r\n)拆分字符串

    c# 以换行(\r\n)拆分字符串 字符串数组形式: string[] striparr = strip.Split(new string[] { "\r\n" }, String ...

  3. oracle的start with connect by prior如何使用

    oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connec ...

  4. JavaScript性能优化小知识总结

    原文出处: YouYaInsist   欢迎分享原创到伯乐头条 前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对 ...

  5. MySQL垂直拆分和水平拆分的优缺点和共同点总结

    数据的拆分(Sharding)根据其拆分分规则的类型,可以分为两种拆分模式.一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)拆分:另外一种则是 ...

  6. Spark2.2+ES6.4.2(三十一):Spark下生成测试数据,并在Spark环境下使用BulkProcessor将测试数据入库到ES

    Spark下生成2000w测试数据(每条记录150列) 使用spark生成大量数据过程中遇到问题,如果sc.parallelize(fukeData, 64);的记录数特别大比如500w,1000w时 ...

  7. SpringBoot集成Redis分布式锁以及Redis缓存

    https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...

  8. llvm 编译

    https://llvm.org/docs/GettingStarted.html https://clang.llvm.org/get_started.html https://llvm.org/d ...

  9. Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

    启动项目报错如下 原因: 在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以会出现 com.sun.jersey.api.client.ClientHandlerExce ...

  10. 海量数据拆分到nosql系统的一种方案

    获取某用户的好友最新动态. 我们大体上来说先按照用户ID将用户的好友一致性哈希到几个mongodb集群,然后把用户的最新信息也存储到mongodb中.然后利用消息系统保持数据库中的数据和mongdb中 ...