0x01 版本类型
源码信息:FineCMS v5.3.0 bulid 20180206
问题文件:/finecms/dayrui/libraries/Template.php
漏洞类型:反射型XSS、CSRF
0x02 漏洞详情
FineCMS后台的管理员管理和会员管理的搜索功能,未进行字符编码与过滤而导致反射型XSS。
在搜索框输入"><svg/onload=alert(1)//,点击搜索并deBug跟踪数据。

可发现POST参数keyword传进了/finecms/dayrui/controllers/Root.php中的index()方法,并通过$this->input->post('keyword', TRUE)来获取数值(进行XSS、不可见字符和基于黑名单等等的过滤._.)。
然后送进了$this->member_model->get_admin_all()方法进行数据库查询操作(没有可乘之机)。接着通过$this->template->
display()调用输出模板。

跟踪到输出模板函数/finecms/dayrui/libraries/Template.php中80行的display()方法。

在93行中通过load_view_file方法加载了模板缓存文件,并将缓存文件用include包含。(执行了文件中的php语句)
在缓存文件/cache/templates/finecms.dayrui.templates.admin_index.html.cache.php的33行可以看到,直接执行了echo语句,而$_POST['keyword']却是可控的,没有经过任何的过滤和编码。从而造成了反射型XSS。

还有一处原理差不多的反射型XSS在会员管理的搜索框处。

点击搜索,debug跟踪数据,发现POST发送的keyword在/finecms/dayrui/controllers/admin/Member.php的70行被赋值到变量$param中。(跟踪函数$this->member_model->limit_page()可知道最终是在/finecms/dayrui/models/Member_model.php中_where()方法的694行被赋值的。)之后没有再对$param进行编码和过滤便执行了$this->template->display('member_index.html')


同样是在在输出模板函数/finecms/dayrui/libraries/Template.php中的display()方法。在93行中将缓存文件用include包含。(执行了文件中的php语句)

跟踪查看缓存文件/cache/templates/finecms.dayrui.templates.member_index.html.cache.php,可以看到,在43行直接对$param['keyword']进行了输出,从导致了另一个反射型XSS。

BTW:添加后台管理员帐号请求并没有附带token值,因此可以直接利用CSRF来添加一个管理员帐号。
0x03 漏洞POC
0x01 利用管理员管理处的XSS,构造表单,当管理员访问了如下html,则会在后台添加一个管理员帐号test:123456
|
|
0x02 利用会员管理处的XSS。(创建管理员帐号时不能有相同名称或邮箱)
|
|
|
|
0x03 直接利用CSRF,当管理员访问如下html时,将创建一个管理员帐号hacker:123456
|
|
成功添加:
