检测并清理一个或多个 WordPress 站点上的 wp2shell(CVE‑2026‑63030)入侵痕迹。
wp2shell 是在 WordPress 7.0.2 / 6.9.5 / 6.8.6(2026‑07‑17)中修复的认证前远程代码执行漏洞。公开 PoC 在一天内出现,约 48 小时内便出现大规模利用。打补丁能堵住漏洞——但在打补丁之前就被利用的站点早已被入侵,而更新不会移除攻击者留下的持久化后门。
该工具用于发现并移除这些持久化后门。它是一个单一、依赖极少的 Bash 脚本,默认只读运行,可一次扫描数千个站点。
⚠️ 这是一款防御性工具,不包含任何利用代码。运行
--clean前,请先为站点创建快照。
利用后阶段,wp2shell 工具通常会留下两种持久化痕迹,该工具均能发现:
user_login 为 wpsvc_<hex> / wp2_<hex> / w2s_<hex>,或邮箱位于攻击者域名(@wp2shell.*、@shellcode.*、@wordpress-svc.internal、@wordpress-noreply.net、@x.lol),并具有 administrator 角色。(注意:@system.local 是某些托管主机上合法的占位管理员邮箱——它被刻意不视为 IOC。)wp-content/plugins/<plausible-name>-<6hex>/<same>.php:一个约 1.3 KB 的微型 PHP 文件,带有伪造的 Author: WordPress.org Community 头部,以令牌(token)作为访问门槛,暴露 ?c=<command> 命令接口。它还能检测通用情况:wp-content/ 下任何将 $_GET['c'] 传入命令/求值执行点的 PHP 小文件。
curl -fsSLO https://raw.githubusercontent.com/InstaWP/wp2shell-scan/main/wp2shell-scan.sh
chmod +x wp2shell-scan.sh
需要 bash、find、grep 以及 mysql/mariadb 客户端。若环境中存在 WP‑CLI 则会使用它(可更干净地删除用户),但并非必需——WebShell 检测完全不需要数据库。
# Scan ONE site (read-only)
./wp2shell-scan.sh --path /var/www/example.com
# Scan EVERY WordPress install under a base directory (bulk)
./wp2shell-scan.sh --base /var/www
./wp2shell-scan.sh --base /home # shared hosting
# Auto-detect common layouts (/var/www/*, /home/*/public_html, ...)
./wp2shell-scan.sh
# Machine-readable
./wp2shell-scan.sh --base /var/www --json > report.json
# CLEAN — quarantine + remove backdoors, rotate wp-config salts (logs everyone out)
./wp2shell-scan.sh --base /var/www --clean --yes
# Vet a BACKUP / SNAPSHOT / TEMPLATE dump before restoring it (see warning below)
./wp2shell-scan.sh --sql /path/to/backup.sql
被移除的工件会被移动到隔离目录(而非直接删除),以便保留证据。发现入侵(扫描)或完成清理(清理)时退出码为 1,干净时为 0——便于在 cron/CI 中使用。
[COMPROMISED] /var/www/example.com — 2 backdoor admin(s), 2 webshell(s)
admin: ID=41 wpsvc_2e1487df8abb <[email protected]> (2026-07-19 06:41:48)
webshell: .../wp-content/plugins/security-headers-manager-8d1d21/security-headers-manager-8d1d21.php
[clean] /var/www/other-site.com
----------------------------------------------------------------
scanned=812 clean=811 compromised=1 cleaned=0
清理在线站点并不会清理你的备份。 在站点被入侵期间捕获的备份、快照或暂存/蓝图模板中仍包含攻击者的管理员账户——恢复它(或从中创建新站点)会立即再次感染。这是我们用惨痛教训换来的:在清理完所有受影响的在线站点后,全新站点仍不断带着后门出现,因为它们正是从受污染的模板快照创建出来的。
在恢复之前先检查转储文件:
./wp2shell-scan.sh --sql /path/to/backup.sql
./wp2shell-scan.sh --sql backup1.sql --sql backup2.sql.gz # repeatable, .gz supported
若任一转储文件被污染,退出码为 1。若确实被污染:不要恢复它——先清理在线站点,然后创建全新备份,并删除/替换在暴露期间创建的任何快照或模板。
--clean 会移除管理员账户和 WebShell,并轮换盐值。你仍需:
wp core verify-checksums)。?c= 的命令值。/wp-json/batch/v1、?rest_route=/batch/v1,包括 %2f 编码形式)。如果 CDN 可能会放行 REST 路径,请将该规则放在**源站(origin)**上。恶意管理员:
SELECT u.ID,u.user_login,u.user_email,u.user_registered
FROM wp_users u JOIN wp_usermeta m ON u.ID=m.user_id
WHERE m.meta_key='wp_capabilities' AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;
WebShell 插件:
find wp-content/plugins -maxdepth 1 -type d -regextype posix-extended -regex '.*-[0-9a-f]{6}$'
grep -rl "\$_GET\['c'\]" wp-content/plugins/
参见 CLEANUP-WITH-CLAUDE.md,其中提供了一个可直接粘贴的提示词,可驱动 Claude Code(或任何具备能力的编码代理)在单个站点上完成同样的检测和清理,并在每个破坏性步骤前进行人工确认。
MIT —— 参见 LICENSE。按现状提供,不附带任何担保。由 InstaWP 团队在一次真实事件中构建并经过实战检验。