如何使用 WP-CLI 和 SQL 查找 WordPress 隐藏后门
30 de julio de 2026
0
Internet TechnologyRelated Video
5:04這會是 WordPress 歷史上最慘重的黑客入侵事件嗎?
Better Stack
Comments (0)
Log in to leave a comment
No posts yet
5:04Better Stack
Log in to leave a comment
No posts yet
对于外包制作的 WordPress 网站,按下核心更新按钮往往令人相当犹豫。因为担心主题或自定义插件发生冲突导致页面直接“白屏”,一拖再拖之下,网站不知不觉就布满了安全漏洞。当担心网站可能已经被入侵的焦虑感袭来时,这里有一套能在最快时间内排查数据库和服务器的实战检查流程。
攻击者入侵时通常非常隐蔽。他们可能会直接篡改数据库的 wp_usermeta 数据表,暗中给现有账号赋予管理员权限。这种操作在普通的登录列表中很难察觉,但只要直接查询数据库就会立刻现形。
`sql
SELECT
u.ID,
u.user_login,
u.user_email,
u.user_registered,
m.meta_value AS capabilities
FROM
wp_users u
INNER JOIN
wp_usermeta m ON u.ID = m.user_id
WHERE
m.meta_key = 'wp_capabilities'
AND (
m.meta_value LIKE '%"administrator"%'
OR m.meta_value LIKE '%"administrator":true%'
)
ORDER BY
u.user_registered DESC;
`
接下来是检查文件系统。如果在应该只包含图片或文档的 wp-content/uploads 目录中发现了 PHP 文件,十有八九就是后门。打开 SSH 终端,全面排查是否存在危险文件。
`bash
find wp-content/uploads/ -type f -name "*.php" -ls
find . -type f -name "*.php" -exec grep -HnE "(eval(|base64_decode(|gzinflate(|passthru(|shell_exec()" {} ;
wp core verify-checksums --include-root
`
日志也是必查项。针对 REST API 的攻击通常会在短时间内倾泻大量的 POST 请求,并获取到 200 或 201 的响应。我们需要从 Nginx 的 access.log 中提取出表现异常的请求。
`bash
grep -E "POST|PUT" /var/log/nginx/access.log | grep -E "/wp-json/|rest_route=" | awk '/ {print $1, $4, $6, $7, $9}' | sort | uniq -c | sort -nr | head -n 30
`
在运行中的生产网站上直接打补丁,与其说是勇敢,不如说是鲁莽。首先应该创建一个完整复制了数据库和文件系统的预发布环境。
`bash
wp db export production_backup.sql --add-drop-table
rsync -avz --exclude='wp-content/cache' /var/www/html/ staging:/var/www/staging/
wp db import production_backup.sql
wp search-replace 'https://example.com' 'https://staging.example.com' --skip-columns=guid
wp plugin list --update=available --fields=name,version,update_version,requires_php --format=table
`
复制完成后,执行更新并花上 5 分钟测试主要功能。亲自测试用户注册、登录、加入购物车、调出支付界面以及提交咨询表单,心里才会踏实。
也有因插件开发商未提供更新,导致无法立刻升级核心的棘手情况。这时,需要通过在服务器层级或 WAF 上阻断特定路径的访问来争取时间。如果使用的是 Nginx,可以在 nginx.conf 中封禁除了自身 IP 之外的所有 REST API 用户创建及批量处理端点。
`nginx
location ~* ^/wp-json/(batch/v1|wp/v2/users) {
limit_except GET {
allow 192.0.2.1;
deny all;
}
try_files $uri args;
}
`
顺便挂载一个备份脚本,将数据库和上传文件夹同步上传至 S3,以防万一。
`bash
#!/bin/bash
WP_PATH="/var/www/html"
BACKUP_DIR="/tmp/wp_backups"
DATE=$(date +%Y%m%d_%H%M%S)
S3_BUCKET="s3://my-wordpress-secure-backups"
mkdir -p $BACKUP_DIR
wp db export BACKUP_DIR/db_DATE.sql --path=$WP_PATH --quiet
tar -czf BACKUP_DIR/files_DATE.tar.gz -C $WP_PATH wp-content/uploads/
aws s3 cp BACKUP_DIR/db_DATE.sql S3_BUCKET/db_DATE.sql
aws s3 cp BACKUP_DIR/files_DATE.tar.gz S3_BUCKET/files_DATE.tar.gz
find $BACKUP_DIR -type f -mtime +7 -delete
`
清理完恶意代码并完成安全补丁并不意味着万事大吉,因为攻击者仍可能利用窃取的 Session Cookie 再次潜入。需要清理所有 Session 并彻底重置 wp-config.php 中的 Salt 密钥。
`bash
wp user list --field=ID | xargs -n 1 wp user session destroy --all
wp config shuffle-salts
`
同时,关闭在后台管理页面中直接修改插件或主题的功能。这是一道最低限度的安全防护,即使攻击者拿到了管理权限,也无法直接注入代码。请在 wp-config.php 中加入以下两行代码:
`php
define( 'DISALLOW_FILE_EDIT', true );
define( 'DISALLOW_FILE_MODS', true );
`
最后,为了防止未登录的用户通过 REST API 窃取用户列表,可以在 mu-plugins 目录下添加一个专用过滤器。
`php
<?php
/**
`