安全小白的第一次动手漏洞复现。
简介
MiniCMS是一个针对个人网站设计的微型CMS。它的特点是:
- 不需要数据库在支持,只需要一个可以运行PHP的Web环境。
- 只针对个人网站设计,没有复杂的成员管理和权限设置。
- 没有分类只有标签,免除发布文章时到底该怎么分类的纠结。
- 只有“文章”和“页面”两该个系统,没有“评论”、“插件”、“主题”,让你更专注于创造内容。
项目地址: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中有进行过滤处理,怀疑是开发人员的疏忽导致的。
构造语句:
效果:


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不存在则会报错,直接爆出物理地址。
