fastadmin 前台getshell+csrf+xss漏洞复现—-随梦-漏洞文库小世界-安全文库-NGC660安全实验室

fastadmin 前台getshell+csrf+xss漏洞复现—-随梦

简介

FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。FastAdmin基于Apache2.0开源协议发布,目前被广泛应用于各大行业应用后台管理。

影响范围

V1.0.0.20180911_beta – V1.0.0.20200506_beta

这里使用使用 V1.0.0.20200506_beta版本复现

漏洞复现

1、前台getshell

漏洞利用条件

/application/config.php文件中: usercenter=>true
1608127716751-c6b34b90-858b-43d5-beb2-3cfed60569b3

即需要开启会员中心功能

漏洞分析

/application/index/controller/User.php文件中

第58-67行:
1608127763766-407f67bd-18d7-4bbb-9776-8d74cefe7251

_empty 函数接收$name遍历,直接将$name 返回视图中:return $this->view->fetch($name); 攻击者可通过上传文件,例如图片,传入$name,fetch模板进行php模板解析,导致getshell。
/thinkphp/library/think/view/driver/Think.php文件中的渲染fetch实际使用的是thinkphp的解析模板函数

第74-87行:
1608127780452-94d91941-1a5a-483a-b8fe-3e0ded1131fe

在验证是否为模板文件,可以看到if (!is_file($template)) ,来判断是否存在,如果存在就将文件进行php解析。
关于is_file()函数,可以参考:https://www.php.net/manual/zh/function.is-file.php不同操作系统解析文件路径的时候,linux和windwos is_file()函数实现不一样。
1、linux判断is_file() /demo/../../../../test 如果demo目录不存在,就会返回false;windows下无论这个目录是否存在,均会返回true;
2、在linux下,is_file()函数判可用于判断符号链接
3、在linux下,is_file函数会受到权限的影响,当前用户权限不足或父目录没有设置+x权限时,is_file()会返回false
4、windows系统里面/和\ 都可以使用,但是在linux下只能使用/ 来分隔路径,因此这会导致is_file()在不同系统下的返回结果不一致
5、is_file()判断文件时,如果文件大小超过2^32时,会判断失败(PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果)

漏洞利用

打开会员中心,注册并登录账号
1608127808440-5b65fd96-d440-4e19-8d3d-aad2438aa881

1608127830891-716d8f68-4d4f-47b8-916f-d4f5db011dd7

在个人资料处,上传图像
1608127869725-0ff4d558-e044-412f-b7ab-372a53232af2

抓包修改图片数据,上传图片马
1608127900498-4a44a4e7-4e03-4074-8c94-8efba4d97d6e

记录下路径后,
构造Payload:index/user/_empty?name=../../public/uploads/[图片路径]
成功getshell
1608127919831-749eff14-5b42-4fd6-815a-9ec467a4903b

2、XSS跨站脚本攻击漏洞

登录管理后台,在常规管理-系统配置模块,站点名称处输入XSS代码,提交保存,系统弹窗,证明存在XSS
1608127943173-3847f399-e3c4-4a65-8b48-75827c0f8990

3、CSRF漏洞

登录管理后台,在插件管理处,进行关键字查询,抓包生成poc,修改查询参数,在生成连接,进行测试,系统正常回显,证明存在CSRF漏洞。
1608127956765-a7918e71-5140-4c1f-bba4-4114404efd5f

输入数字1,进行查询抓包
1608127975708-4b942d6e-8355-4a5b-989a-83d40e70114f

生成poc修改参数值,进行在生成并测试

1608128021461-2af83182-0b00-4a7a-b5a0-b8f188037a7c

系统正常回显,证明存在CSRF漏洞

1608128038824-88963379-b3ab-49b1-9fd5-5968446b61a7

漏洞修复

前台getshell

打开application/index/controller/User.php,找到大概第58行的_empty方法,有以下两种修复方法:
一种修复方法是直接移除_empty方法,
另一种是将_empty方法改为

public function _empty($name)
    {
        if (!preg_match("/^([a-z0-9_]+)$/i", $name)) {
            $this->error(__('Invalid parameters'));
        }
        $data = Hook::listen("user_request_empty", $name);
        foreach ($data as $index => $datum) {
            $this->view->assign($datum);
        }
        return $this->view->fetch('user/' . $name);
    }

XSS跨站脚本攻击漏洞

方法一:输入、输出检查

对用户输入、输出的数据进行全面安全检查或过滤,限制邮箱、时间、日期等数据的格式。

完善xss filter:在客户端和服务端做特殊字符的过滤或者编码尤其注意检查是否包含HTML特殊字符。

方法二:尽量使用白名单,避免使用黑名单

CSRF漏洞

系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

参考链接

https://gitee.com/karson/fastadmin/issues/I12M62 https://www.cnblogs.com/thresh/p/13743098.html

请登录后发表评论

    请登录后查看回复内容