FineCMS 漏洞不仅皮囊好看,灵魂更有趣

0x00背景

最近在挖掘FineCMS源码的漏洞,发现了一些有趣的洞,斗哥计划先从配置文件写入开始分析,然后再结合存储XSS进行GetShell,本篇先分析配置文件写入的问题,下周再分析存储XSS的问题,最终通过这两类洞的组合利用GetShell,大体思路流程很简单,但是代码分析中有蛮多技巧,期待与师傅们的交流讨论。

0x01漏洞审计

1x00相关环境

1x01漏洞分析

在\finecms\finecms\dayrui\controllers\Install.php文件中的第127-131行发现如下代码块。

通过反向追溯在当前文件中的第75行中发现$data的创建位置。

跟入post方法,在\finecms\finecms\system\core\Input.php文件中的第255行中发现发 post方法的代码块。

跟入_fetch_from_array方法,在\finecms\finecms\system\core\Input.php文件中的第177-230行中发现该方法的代码块,代码主要对传入的数组进行简单的数据判断,代码较多这里列出重要的代码,当$xss_clean为TRUE的时候会进行xss_clean操作。通过追溯$xss_clean变量,发现是从\finecms\finecms\dayrui\config\config.php配置文件中的$config['global_xss_filtering']获取的,但是默认情况下该变量的值为FALSE,不会进行任何的XSS过滤。

但是当$config['global_xss_filtering']为TRUE会进入\finecms\finecms\system\core\Security.php的xss_clean方法进行XSS过滤,但是不进行单引号的转义,但是还过滤了PHP的标签和一些关键函数,由于还过滤了尖括号所以标签没想到绕过方法,但是可以使用类似system/*()*/('whoami')的方式绕过关键字的过滤规则进行代码执行。

因此此处可以引入单引号,从而导致写入php代码进行GetShell。

1x02漏洞复现

在进行安装的时候,如果$config['global_xss_filtering']开启了,即TRUE,可构造如下请求可以执行PHP代码导致GetShell。

如果$config['global_xss_filtering']未开启即为FALSE,进行如下请求可以GetShell。

成功写入文件并生成evil.php:

访问evil.php成功GetShell:

2x00相关环境

2x01漏洞分析

在文件\finecms\finecms\dayrui\controllers\admin\Site.php的第46-67行中发现如下代码块,使用post接收data的数据,然后在检测域名是否被使用,未被使用将更新数据库中fn_site表中的domain的字段。

跟入$this->site_model->cache(),在\finecms\finecms\dayrui\models\Site_model.php文件中的第323-368行中,发现cache()方法,重点看第325行和338行。

跟入$this->get_site_data()方法,在\finecms\finecms\dayrui\models\Site_model.php文件中的第285-300行发现代码块,分析代码块知道是进行如下的数据查询,把前面存到数据库中的配置,取出来然后赋给$data, 通过打印$data可以知道到的就是站点配置的信息。

跟进$t['domain'] && $domain[$t['domain']] = $id;,$domain最终传入了如下\finecms\finecms\dayrui\models\Site_model.php文件中的第363行代码。

因此foreach ($data as $id => $t)后对$domain[$t['domain']] = $id;进行赋值,其中为$domain变量传入了键名$t['domain'],又因为to_require_one中不会对数组的键名进行安全处理,因此可以引入单引号,存在文件写入的问题。

2x02漏洞复现

可以通过构造如下请求进行文件写入,并执行代码的操作:

0x02小结

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180302G0QGY300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券