WordPress5.0远程代码执行分析
字数 1487 2025-08-18 11:38:08

WordPress 5.0 远程代码执行漏洞分析与复现指南

漏洞概述

WordPress 5.0.0 版本存在一个高危的远程代码执行漏洞,该漏洞由路径穿越和本地文件包含两个漏洞组合而成。RIPS团队于2019年2月19日公开了该漏洞详情,但未完全披露所有技术细节。

环境搭建

  1. 从WordPress官网下载5.0版本代码
  2. 搭建成功后不要登录,因为WordPress 3.7.0+版本会在用户登录时自动更新小版本
  3. 禁用自动更新:在wp-config.php文件开头添加:
    define('AUTOMATIC_UPDATER_DISABLED', true);
    

漏洞分析

路径穿越漏洞

漏洞利用步骤

  1. 构造特殊数据包插入恶意路径到数据库:
    POST /wordpress/wp-admin/post.php HTTP/1.1
    Host: localhost
    Connection: close
    ...
    &action=editpost&meta_input[_wp_attached_file]=2019/03/demo.jpeg#themes/twentynineteen/demo.jpeg
    

代码分析路径

  1. wp-admin/post.php中当$action=editpost时调用edit_post方法
  2. edit_post方法中可控的$post_data变量来源于$_POST
  3. $post_data传入wp_update_post方法
  4. wp_update_post调用wp_insert_post方法
  5. wp_insert_post将恶意路径传入update_post_meta方法
  6. update_post_meta调用update_metadata方法
  7. update_metadata调用wpdb类的update方法,将恶意路径更新到数据库

图片获取机制

WordPress获取上传图片的两种方式:

  1. 直接在wp-content/uploads/目录下寻找
  2. 当第一种方式失败时,从http://localsite/wp-content/uploads/meta_value下载

图片裁剪功能利用

构造特殊数据包利用裁剪功能将上传图片移动到任意路径:

POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1
Host: localhost
...
Connection: close
_ajax_nonce=29a195c152&postid=28&do=save&action=crop-image&cropDetails[x1]=0&cropDetails[y1]=0&cropDetails[width]=1200&cropDetails[height]=1200&cropDetails[dst_width]=1200&cropDetails[dst_height]=1200&id=28

代码执行流程

  1. action=crop-image时调用wp_ajax_crop_image方法
  2. wp_ajax_crop_image根据POST中的id校验请求和权限
  3. $_POST['cropDetails']传入wp_crop_image方法
  4. wp_crop_image函数关键点:
    • 根据$_POST['id']从数据库获取图片路径
    • 图片不存在时使用URL形式获取
    • 选择图片处理扩展(Imagick优先级高于GD)
    • 裁剪后图片命名为'cropped-' . basename($src_file)
    • 创建目录并调用save方法保存图片

本地文件包含漏洞

触发条件

  1. 上传一个txt文件
  2. 修改_wp_page_template值为图片马路径:
    POST /wordpress/wp-admin/post.php HTTP/1.1
    Host: localhost
    ...
    Connection: close
    ...&action=editpost&post_type=attachment&post_ID=8&save=Update&post_name=123&meta_input[_wp_page_template]=cropped-demo.jpeg
    

代码分析

  1. 全局搜索_wp_page_template关键字
  2. get_page_template_slug函数根据传入的$post变量查询并返回模板文件名
  3. WordPress程序运行时选择相应模板文件并包含
  4. get_single_templateget_page_template函数都调用get_page_template_slug
  5. 最终在wp-includes/template-loader.php中包含模板文件

常见问题解决

如果遇到LFI失败(查看附件页面直接404),可能是Apache的rewrite模块未开启:

# Ubuntu系统解决方案
sudo a2enmod rewrite  # 开启rewrite模块
sudo vim /etc/apache2/apache2.conf

# 找到如下内容并修改:
<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None  # 改为 AllowOverride All
    Require all granted
</Directory>

sudo systemctl restart apache2

漏洞利用流程图

  1. 通过路径穿越将恶意路径插入数据库
  2. 利用图片裁剪功能将恶意文件移动到目标位置
  3. 通过修改_wp_page_template触发本地文件包含
  4. 最终实现远程代码执行

参考

  • RIPS团队官方博客(2019年2月19日)
  • WordPress 5.0.0源代码分析
WordPress 5.0 远程代码执行漏洞分析与复现指南 漏洞概述 WordPress 5.0.0 版本存在一个高危的远程代码执行漏洞,该漏洞由路径穿越和本地文件包含两个漏洞组合而成。RIPS团队于2019年2月19日公开了该漏洞详情,但未完全披露所有技术细节。 环境搭建 从WordPress官网下载5.0版本代码 搭建成功后 不要登录 ,因为WordPress 3.7.0+版本会在用户登录时自动更新小版本 禁用自动更新:在 wp-config.php 文件开头添加: 漏洞分析 路径穿越漏洞 漏洞利用步骤 构造特殊数据包插入恶意路径到数据库: 代码分析路径 wp-admin/post.php 中当 $action=editpost 时调用 edit_post 方法 edit_post 方法中可控的 $post_data 变量来源于 $_POST $post_data 传入 wp_update_post 方法 wp_update_post 调用 wp_insert_post 方法 wp_insert_post 将恶意路径传入 update_post_meta 方法 update_post_meta 调用 update_metadata 方法 update_metadata 调用 wpdb 类的 update 方法,将恶意路径更新到数据库 图片获取机制 WordPress获取上传图片的两种方式: 直接在 wp-content/uploads/ 目录下寻找 当第一种方式失败时,从 http://localsite/wp-content/uploads/meta_value 下载 图片裁剪功能利用 构造特殊数据包利用裁剪功能将上传图片移动到任意路径: 代码执行流程 当 action=crop-image 时调用 wp_ajax_crop_image 方法 wp_ajax_crop_image 根据POST中的 id 校验请求和权限 将 $_POST['cropDetails'] 传入 wp_crop_image 方法 wp_crop_image 函数关键点: 根据 $_POST['id'] 从数据库获取图片路径 图片不存在时使用URL形式获取 选择图片处理扩展(Imagick优先级高于GD) 裁剪后图片命名为 'cropped-' . basename($src_file) 创建目录并调用 save 方法保存图片 本地文件包含漏洞 触发条件 上传一个txt文件 修改 _wp_page_template 值为图片马路径: 代码分析 全局搜索 _wp_page_template 关键字 get_page_template_slug 函数根据传入的 $post 变量查询并返回模板文件名 WordPress程序运行时选择相应模板文件并包含 get_single_template 和 get_page_template 函数都调用 get_page_template_slug 最终在 wp-includes/template-loader.php 中包含模板文件 常见问题解决 如果遇到LFI失败(查看附件页面直接404),可能是Apache的rewrite模块未开启: 漏洞利用流程图 通过路径穿越将恶意路径插入数据库 利用图片裁剪功能将恶意文件移动到目标位置 通过修改 _wp_page_template 触发本地文件包含 最终实现远程代码执行 参考 RIPS团队官方博客(2019年2月19日) WordPress 5.0.0源代码分析