因为微X公众号推送机制改变了,快来星标
再也不迷路,谢谢大众!
影响版本:
V1.0.0.20180911_beta - V1.0.0.20200506_beta
日前看官方4天了,还无修复
漏洞代码位置: https://github.com/karsonzhang/fastadmin/blob/master/application/index/controller/User.php
漏洞披露信息:https://github.com/karsonzhang/fastadmin/issues/73?spm=a2c4g.11174386.n2.3.428c1051tmy0pT
============================================
官方发布信息了:https://www.fastadmin.net/news/83.html
==========================
漏洞利用要求: usercenter=>true
漏洞分析:
存在漏洞文件位置:
application/index/controller/User.php /** * 空的请求 * @param $name * @return mixed */public function _empty($name){ $data = Hook::listen("user_request_empty", $name); foreach($dataas $index => $datum) { $this->view->assign($datum); } return $this->view->fetch(user/ . $name);}_empty函数接收$name遍历,直接将$name返回视图中:return $this->view->fetch($name);攻击者可经过上传文件,例如照片,传入$name,fetch模板进行php模板解析,引起getshell。
渲染fetch实质运用的是thinkphp的解析模板函数,内容如下: public function fetch($template, $data = [], $config = []){ if ( == pathinfo($template, PATHINFO_EXTENSION)) { // 获取模板文件名 $template = $this->parseTemplate($template); } // 模板不存在 抛出反常 if (!is_file($template)) { throw newTemplateNotFoundException(template not exists: . $template, $template); } // 记录视图信息 App:debug && Log::record([ VIEW ] . $template . [ . var_export(array_keys($data),true) . ], info); $this->template->fetch($template, $data, $config); }
在验证是不是为模板文件,能够看到if (!is_file($template)) ,来判断是不是存在,倘若存在就将文件进行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 以上的文件,有些文件系统函数可能返回没法预期的结果)
能够参考https://www.php.net/manual/zh/function.is-file.php
实验如下:
漏洞验证:
用户登录,进入个人页面,修改上传照片
brup:
获取到的位置:
payload: http://www.demo.com/index.php/index/user/_empty?name=../../public/uploads/xxxxx/xxxxx.jpg
因is_file()在linux下/user目录不存在,因此没法利用,除非能够创建或存在,能够手工创建public下创建user目录
windows下通杀。
修复方法:
打开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); }
这个方法设计的用途重点是用于插件系统,便于插件研发者在处理前台用户关联信息时能够直接运用index/user/custommethod的URL方式拜访到自定义的视图,便于共用布局和JS。
https://www.cnblogs.com/sevck/p/13723094.html
★
付费圈子
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各样资料文档+各样工具+付费会员
进成员内部群
星球的近期主题和星球内部工具有些展示
加入安全交流群
关 注 有 礼 关注下方公众号回复“666”能够领取一套领取黑客成长秘籍
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读
干货|史上最全一句话木马
干货 | CS绕过vultr特征检测修改算法
实战 | 用中国人写的红队服务器搞一次内网穿透练习
实战 | 渗透某培训平台经历
实战 | 一次曲折的钓鱼溯源反制 免责声明因为传播、利用本公众号渗透安全团队所供给的信息而导致的任何直接或间接的后果及损失,均由运用者自己负责,公众号渗透安全团队及作者不为此承担任何责任,一旦导致后果请自动承担!如有侵权烦请通知,咱们会立即删除并致歉。谢谢!好文分享保藏赞一下最美点在看哦
|