当前位置: 首页 > 科技观察

QCMSV2.0命令执行及暴力绝对路径漏洞

时间:2023-03-18 00:24:00 科技观察

QCMS是一款小型网站管理系统。拥有多种结构类型,包括:ASP+ACCESS、ASP+SQL、PHP+MYSQL。今天请师兄们挖QCMS的漏洞,把挖的全过程分享给大家。下源码,先在本地搭建环境。各种扫描,各种fuzzer,各种fuzz测试,在apache错误日志中发现如下信息:PHPWarning:mkdir()[function.mkdir]:InvalidargumentinD:\\WWW\\system\\controller\\home。phponline36在system\controller\home.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,那我们提交这个网址看看:http://localhost:8088/11_11_11__11/www我们取消删除刚刚添加的var_dump代码。直接访问这个网址发现文件夹创建成功。你可能会问为什么会有404页面。好的,让我们继续看代码。目录创建后,会检查$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。如果不在预定义的数组中,则不会向下执行。如何绕过它?修改图片大小。我们提交以下urlhttp://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-yinstallImageMagick安装ImageMagick然后生成缩略图convert-resize"100x100>"/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×1006.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文件作为图片生成另一个缩略图文件,就会失败。因此,再次读取缩略图文件时,会读取失败。因为文件不存在。在Firefox下,图像可能会因错误而无法显示。而在IE下,可能会暴露绝对路径。我认为exec('convert-resize"'.$width.''.$height.'>"'.$filename.''.$thumb.'');和读取文件($thumb);这两个地方应该有更多的价值。希望大家一起学习。为本文做出贡献的作者:TakeDownTeam漏洞研究人员MXi4oyu、Arya