白斩鸡@卫兵实验室
近日,Wordpress 插件file manager被爆出严重0day漏洞,本着技术研究角度,和大家分享、探讨其漏洞原因。
该修复程序已在同一天发布,并且WP File Manager插件6.9版通过删除允许未经授权的文件上传访问的端点来解决当前问题。影响版本。
该安全漏洞存在于文件管理器版本,范围从6.0到6.8。WordPress的统计数据表明,目前约有52%的安装易受攻击。由于File Manager的700,000个站点中已安装的漏洞中有一半以上,因此损坏的可能性很高。运行任何这些版本的网站都应尽快更新到6.9
影响范围
file manager 6.0至6.8
漏洞报告
漏洞的文件为connector.minimal.php.
首先对$opts
进行了初始化,这里存储了后面上传文件存储路径root信息。
通过创建elFinderConnector
对象,进而调用$connector->run();
。
elFinderConnector::run()
方法限制了请求为POST。并且读取了所有的请求参数保存到$src
中。其中$cmd
为传递cmd
变量
随后对通过循环foreach ($this->elFinder->commandArgsList($cmd) as $name => $req)
来对$src
进行校验,需要符合请求方法的参数类型。
通过elFinder::commandArgsList($cmd)
中我们查看$this->commands
发现了可以调用的方法(意味着我们可以直接调用以下列表的所有方法,例如创建文件、创建文件夹、删除文件等等)
完成变量校验后就进行一次input_filter
(addslashes和去除\00截断)随后进入$this->output($this->elFinder->exec($cmd, $args));
执行真正调用的方法代码。
根据上面可用方法的array,我们控制$cmd=upload
,即可调用upload方法。
具体exec方法如下介绍
elFinder::exec(\$cmd, \$args)
当我们控制$cmd=upload
时,遇到第一个分支。意味着我们需要传入一个$target
变量或$dst
变量。
进入$this->volume($dst)
可以看到是对$this-volume
进行了选择。
id
分别为t1_
和l1_
,我们将选择l1_
,即传入的$target
必定为l1_
前缀。
之所以这么做的理由是由于l1_
中的root=/Users/steven/Desktop/code/phpCode/wordpress/wp-content/plugins/wp-file-manager/lib/files
,而t1_
中为root=/Users/steven/Desktop/code/phpCode/wordpress/wp-content/plugins/wp-file-manager/lib/files/.trash
。
而这个$root
将会成为后面文件上传路径的前缀。
之后进入动态调用,通过$result = $this->$cmd($args);
调用upload方法。
elFinder::upload(\$args)
一开始初始化很多变量,但是我们不必要传入。并且也对volume进行了取值,后续还进行了校验。
在3313行foreach ($files['name'] as $i => $name)
通过foreach对每个上传的文件进行处理。
许多分支并没有执行,直接来到以下代码if (!$_target || ($file = $volume->upload($fp, $_target, $name, $tmpname, ($_target === $target) ? $hashes : array())) === false)
,执行真正的upload函数。
elFinderVolumeDriver::upload(\$fp, \$dst, \$name, \$tmpname, \$hashes = array())
在这个if判断中,需要关注dir($dst)
。
跟进dir($dst)
跟进file($hash)
state(\$path)
decode(\$hash)
从上面的代码看来就是把$target
的值截取前面volume的id,剩下的做一个base64解码,之后与volume['root']
进行拼接,如果解码之后的值为\\
则直接设volume['root']
为上传路径,如果不是则需要cache索引。如果直接$target
解码为../
或../css
等则会校验不通过,直接报错。
最终调用到if (($path = $this->saveCE($fp, $dstpath, $name, $stat)) == false)
实现了文件的上传。上传路径为wp-content/plugins/wp-file-manager/lib/files/bzj.php
补丁修复方式
删除了
connector.maximal.php-dist
和connector.maximal.php
两个文件增加了.htaccess
关于我们
人才招聘
二进制安全研究员(Windows内核方向)
工作地点:
1.杭州;
岗位职责:
1、负责研究Window内核相关漏洞利用技术;
2、负责分析Window内核漏洞的原理及缓解措施;
任职要求:
1、2年以上windows逆向工作经验。
2、熟悉windows底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉win32/64开发,并有相关开发经验;
3、熟悉windows驱动开发、熟悉windows平台内核架构;能熟练运用Windows平台下的软件调试方法。
4、熟练使用ida、windbg等调试软件工具调试分析漏洞。
5、有CVE编号、内核研究成果者优先;
6、具备良好的团队沟通、协作能力、良好的职业道德。
二进制安全研究员(Linux内核方向)
工作地点:
1.杭州;
岗位职责:
1、负责研究Linux内核相关漏洞利用技术;
2、负责分析Linux内核漏洞的原理及缓解措施;
任职要求:
1、2年以上Linux逆向工作经验。
2、熟悉Linux底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉x86/64开发,并有相关开发经验;
3、熟悉Linux驱动开发、熟悉Linux平台内核架构;能熟练运用Linux平台下的软件调试方法。
4、熟练使用ida、gdb、lldb等调试软件工具调试分析漏洞。
5、有CVE编号、内核研究成果者优先;
6、具备良好的团队沟通、协作能力、良好的职业道德。
二进制安全研究员(系统应用方向)
工作地点:
1.杭州;
岗位职责:
1、负责安全技术研究,跟踪国内外最新的安全技术以及安全漏洞的追踪;
2、负责进行二进制漏洞挖掘,包括不限于浏览器、chakara引擎、js引擎、office、pdf等等各种二进制类应用;
任职要求:
1、能主动关注国内外最新安全攻防技术,并在自己擅长和兴趣的领域能够进行深入的学习、研究;
2、熟练掌握windbg、ida、gdb等调试工具;
3、熟悉各类二进制安全漏洞原理(堆溢出、栈溢出、整数溢出、类型混淆等等)以及各种利用技术;
4、能够无障碍阅读英文技术文档;
5、具备良好的团队沟通、协作能力、良好的职业道德。
Web安全研究员
工作地点:
1.杭州;
岗位职责:
1、安全攻防技术研究,最新web应用及中间件(tomcat、jetty、jboss等等)、框架(struts、spring、guice、shiro等等) 组件(freemarker、sitemesh等等)漏洞挖掘研究;
2、跟踪分析国内外的安全动态,对重大安全事件进行快速响应;
任职要求:
1、了解常见的网络协议(TCP/IP,HTTP,FTP等);
2、熟练使用Wireshark等抓包工具,熟悉正则表达式;
3、掌握常见漏洞原理,有一定的漏洞分析能力;
4、具备php、python、java或其他相关语言编码能力;
5、对常见waf绕过有一定的基础经验;
6、具备一定的文档编写能力,具备良好的团队共同能力;
7、对安全有浓厚的兴趣,工作细致耐心。
感兴趣的小伙伴请联系Nike,或将简历投送至下方邮箱。(请注明来源“研究院公众号”,并附带求职岗位名称)
联系人:Nike
邮箱:nike.zheng@dbappsecurity.com.cn