漏洞挖掘分析:QCMS V2.0命令执行与暴绝对路径漏洞

漏洞挖掘分析:QCMS V2.0命令执行与暴绝对路径漏洞

黑客资讯访客2021-10-12 0:50:002703A+A-

  QCMS是一款小型的网站管理系统。拥有多种结构类型,包括:ASP+ACCESS、ASP+SQL、PHP+MYSQL。今天叫兄弟们一起挖掘QCMS的漏洞,与大家分享挖洞的全过程。

  把源码down下来,本地先搭建了一个环境。各种扫描,各种fuzzer,各种模糊测试之后发现apache错误日志里面有如下信息:

  PHP Warning:  mkdir() [<a href='function.mkdir'>function.mkdir</a>]: Invalid argument in D:\WWW\system\controller\home.php on line 36

  在systemcontrollerhome.php文件的36行有创建目录的mkdir函数

  而$path这个变量是由$thumb传递过来的,那么我们向上追踪$thumb变量。

  我们发现$thumb初始值为空字符串。而给$thumb赋值是通过$url_arr这个数组。

  而$url_arr这个数组又是通过explode函数生成的。其实真正的漏洞成因就在

  $url_arr = explode('_', substr($url, 1, -4));

  Explode函数根据_将原始的URI分割为数组,存放到$url_arr中。

  接下来把$url_arr[1]的第一个元素向后截取作为图片的宽度;

  把$url_arr[2]的第一个元素向后截取作为图片的高度;

  接下来再判断$url_arr[3]是否为空,并赋值给$noWaterMark.

  也就是说,我们得用_来分割url,而且让$url_arr的长度必须大于2。否则直接404并且退出程序。

  我们23行下面设置个断点,并且把$url_arr打印出来。

  发现当我提交http://localhost:8088/11_11_11_11

  的时候,程序可以直接绕过19行的if判断,向下走。

  但是直接这样提交并没有创建文件夹,是因为$path = dirname($thumb);这个函数并没有给$path赋值,我们打印下$path的值,看下是多少。

  发现此时的$path是一个.,那么$thumb的值是多少呢?

  我们发现$thumb的值是11_w1_h1_11。我们来看下dirname这个函数。

  发现该函数返回去掉文件名后的目录名。OK,那么我们提交这样的URL看看:http://localhost:8088/11_11_11__11/www

  我们取消删掉刚才添加的var_dump这些代码。直接访问这个URL发现文件夹创建成功。

  大家可以可能会问为什么还有一个404页面。OK,我们接着往下看代码。

  目录创建完之后,会盘对$filename这个变量是否是一个文件。我们打印下这个文件名。

  我们会发现,这个文件名是用$url_arr的下标为0的元素加上文件的后缀名组装的。

  这真是一个神奇的组装。大家看我怎么拼接。

  我提交如下url:

  http://localhost:8088/index_11_11__11/.php

  就组装成了首页的index.php

  我提交http://localhost:8088/lib/config/config_11_11__11/.php

  那么就组装成了数据库的配置文件.

  这时候$filename就是一个文件名.就绕过了

  开始执行下面的生成缩略图的操作.

  接下来程序会判断图片的大小是否在程序预定义的$size_arr这个数组中。

  如果不在,那么抱歉,404.我们先打印下原来的图片大小。

  发现图片大小为1,1 。不在预定义的数组中,那么就不会向下执行。怎么绕过呢?修改图片大小。我们提交如下url

  http://localhost:8088/lib/config/config_150_150__11/.php

  成功绕过。开始执行exec生成缩略图的操作。和readfile读取文件的操作。

  exec('convert -resize "'.$width.'x&'.$height.'>" '.$filename.' '.$thumb.'');

  而convert-resize 这个命令是linux下生成缩略图的命令。要使用这个命令,必须先安装ImageMagick。于是我又搭建了一个LAMP环境。yum -y install ImageMagick

  安装了下ImageMagick

  然后生成了下缩略图

  convert -resize "100×100>"  /var/www/html/qcms/upload/static/upload/source/20141101/5.png  /var/www/html/qcms/upload/static/upload/source/20141101/6.png

  这条命令就是把5.png 缩放为100×100的6.png。

  而我提交http://localhost:8088/lib/config/config_150_150__11/.php

  那么就试图把lib/config/config.php这个文件生成lib/config/config_w50_h50.php

  把lib/config/config_w50_h50.php 当成lib/config/config.php的缩略图。

  但是一个php文件当作图片生成另一个缩略图文件就会失败。因此再去读取那个缩略图文件时就会读取失败。因为文件不存在。在火狐下可能会暴图片因存在错误而无法显示。

  而在IE下有可能就会暴出绝对路径

  我感觉exec('convert -resize " '.$width.''.$height.'>" '.$filename.''.$thumb.''); 和readfile($thumb); 这两处应该还有更多的利用价值。希望大家一起研究下。

 

点击这里复制本文地址 以上内容由黑资讯整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
  • 3条评论
  • 痴者卮酒2022-06-03 07:47:34
  • l_arr这个数组。  而$url_arr这个数组又是通过explode函数生成的。其实真正的漏洞成因就在  $url_arr = explode('_', substr($url, 1, -4));  Explo
  • 慵吋饮湿2022-06-03 11:02:12
  • 于是我又搭建了一个LAMP环境。yum -y install ImageMagick  安装了下ImageMagick  然后生成了下缩略图  convert -resize "100×100>"  /var
  • 拥嬉俗欲2022-06-03 11:44:38
  • 20141101/6.png  这条命令就是把5.png 缩放为100×100的6.png。  而我提交http://localhost:8088/lib/config/config_150_150__11/.php  那么就试图把lib/config/

支持Ctrl+Enter提交

黑资讯 © All Rights Reserved.  
Copyright Copyright 2015-2020 黑资讯
滇ICP备19002590号-1
Powered by 黑客资讯 Themes by 如有不合适之处联系我们
网站地图| 发展历程| 留言建议| 网站管理