MiniCMS漏洞复现(一)
简介
MiniCMS是一个针对个人网站设计的微型CMS。它的特点是:
0.不需要数据库在支持,只需要一个可以运行PHP的Web环境。
1.只针对个人网站设计,没有复杂的成员管理和权限设置。
2.没有分类只有标签,免除发布文章时到底该怎么分类的纠结。
3.只有“文章”和“页面”两该个系统,没有“评论”、“插件”、“主题”,让你更专注于创造内容。
CVE复现
MiniCMS很适合代码审计入门找找感觉,非常适合小白作为开胃菜。
鉴于本人是安全小白,所以跟着HACHp1师傅的CVE漏洞整理进行漏洞复现。
CVE-2018-1000638 反射型XSS
存在位置:/MiniCMS-master/mc-admin/page.php处date参数存在XSS漏洞。
找到传参点:
if (isset($_GET['date']))
$filter_date = $_GET['date'];
else
$filter_date = '';
这里GET传入了date
参数,而后没有进行任何过滤处理直接插入到前端代码中,且不止一处。
<span class="pager">共 <?php echo $page_count; ?> 项 <a class="link_button" href="?state=<?php echo $state; ?>&date=<?php echo $filter_date;?>">«</a><a class="link_button" href="?state=<?php echo $state; ?>&date=<?php echo $filter_date;?>&page=<?php echo $prev_page; ?>">‹</a>第 <input type="text" value="<?php echo $page_num; ?>" id="page_input_1"/> 页,共 <?php echo $last_page; ?> 页<a class="link_button" href="?state=<?php echo $state; ?>&date=<?php echo $filter_date;?>&page=<?php echo $next_page; ?>">›</a><a class="link_button" href="?state=<?php echo $state; ?>&date=<?php echo $filter_date;?>&page=<?php echo $last_page; ?>">»</a></span>
因此,此处可以构造语句进行XSS攻击,构造语句如下:
?date="></a><img%20src=1%20onerror=alert(1)><a>
效果:
CVE-2018-10227 存储型XSS
存在位置:/MiniCMS-master/MiniCMS-master/mc-admin/conf.php 在设置中修改网站地址处存在XSS漏洞,可直接存储XSS payload。
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,虽然在下面出现了过滤性输出:
<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中有进行过滤处理,怀疑是开发人员的疏忽导致的。
构造语句:
http://localhost/MiniCMS"></a><img src=1 onerror=alert(1)><a>
效果:
CVE-2018-10424 物理路径泄露
存在位置: /MiniCMS-master/mc-admin/post-edit.php处将GET的参数id改为不存在的文件名,会爆出物理地址。
} 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不存在则会报错,直接爆出物理地址。
写在后面
我叫W4ngch3n,这是我第一次写博客,请多多指教~