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
|
|
成功添加: