wordpress-image-远程代码执行漏洞分析
字数 1778 2025-08-29 08:31:53

WordPress Image模块远程代码执行漏洞分析

漏洞概述

2019年2月20日,RIPS披露了WordPress内核Image模块的一个高危漏洞,该漏洞由目录穿越和文件包含组成,最终可导致远程代码执行。漏洞影响WordPress 4.9.9以下版本,4.9.9版本引入了过滤函数对用户输入的post data进行检查,过滤了不合法参数。

环境搭建

  • 漏洞影响版本:WordPress 4.9.9以下
  • 注意:安装低版本时,安装过程会自动更新核心文件,因此需要:
    • 删除自动更新相关模块
    • 或进行离线安装

漏洞分析

漏洞一:数据覆盖

漏洞出现在WordPress媒体库裁剪图片过程中:

  1. 上传图片到媒体库时:

    • 图片保存路径:wp-content/uploads/yyyy/mm
    • 数据库wp_postmeta表插入两个值:
      • _wp_attached_file:图片位置
      • _wp_attachment_metadata:图片属性相关的序列化信息
  2. 修改图片属性时:

    • admin-media-Edit more details调用wp-admin/includes/post.phpedit_post()方法
    • 参数全部来自$_POST,没有进行过滤
    • 调用update_post_meta()方法根据$post_ID修改post meta field
    • 调用update_metadata()更新meta数据
    • 更新post数据,调用wp_update_post()方法
  3. wp_update_post()中:

    • 如果post_type=attachment,进入wp_insert_attachment()
    • 调用wp_insert_post()
    • 判断meta_input参数,如果传入则遍历数组更新post_meta

关键点:整个过程中对键值没有任何过滤,可以传入指定的key来设置其值,导致可以构造数据包更新数据库中_wp_attached_file的值,插入包含../的值。

漏洞二:目录遍历

WordPress图片裁剪功能有两种情况:

  1. 图片存在于wp-content\uploads\yyyy\mm目录:从该目录读取图片
  2. 图片不存在:通过本地服务器下载图片(如http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg

漏洞利用

  • 构造带参数的URL:http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?1.png
    • 本地读取时找不到admin.jpeg?1.png
    • 远程获取时忽略?后参数,获取admin.jpeg
  • 构造包含路径穿越的URL:http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?../../1/1.png
    • WordPress将裁剪后的图片保存至指定文件夹

Windows系统注意事项

  • Windows目录不能包含?字符
  • 使用#替代:meta_input[_wp_attached_file]=2019/02/admin.jpeg#../../../1/1.png

漏洞利用步骤

  1. 构造数据包更新_wp_attached_file值,插入路径穿越
  2. 构造第二个数据包触发裁剪图片并保存:
    • 修改actioncrop-image
    • 传递id参数(即postid值)
    • 添加cropDetails[dst_width]cropDetails[dst_height]参数
  3. 最终在指定目录生成裁剪后的图片文件(前缀为cropped-

漏洞修复

WordPress 4.9.9版本主要修改:

  • meta_input参数进行过滤
  • 检查用户输入的post data,过滤不合法参数

总结

该漏洞利用链:

  1. 通过参数传递任意值覆盖数据库字段
  2. 引入../构成目录穿越
  3. 裁剪图片保存时未检查文件目录
  4. 最终可写入恶意图片被包含或通过Imagick漏洞触发RCE

参考链接

WordPress Image模块远程代码执行漏洞分析 漏洞概述 2019年2月20日,RIPS披露了WordPress内核Image模块的一个高危漏洞,该漏洞由目录穿越和文件包含组成,最终可导致远程代码执行。漏洞影响WordPress 4.9.9以下版本,4.9.9版本引入了过滤函数对用户输入的post data进行检查,过滤了不合法参数。 环境搭建 漏洞影响版本:WordPress 4.9.9以下 注意:安装低版本时,安装过程会自动更新核心文件,因此需要: 删除自动更新相关模块 或进行离线安装 漏洞分析 漏洞一:数据覆盖 漏洞出现在WordPress媒体库裁剪图片过程中: 上传图片到媒体库时: 图片保存路径: wp-content/uploads/yyyy/mm 数据库 wp_postmeta 表插入两个值: _wp_attached_file :图片位置 _wp_attachment_metadata :图片属性相关的序列化信息 修改图片属性时: admin-media-Edit more details 调用 wp-admin/includes/post.php 的 edit_post() 方法 参数全部来自 $_POST ,没有进行过滤 调用 update_post_meta() 方法根据 $post_ID 修改post meta field 调用 update_metadata() 更新meta数据 更新post数据,调用 wp_update_post() 方法 在 wp_update_post() 中: 如果 post_type=attachment ,进入 wp_insert_attachment() 调用 wp_insert_post() 判断 meta_input 参数,如果传入则遍历数组更新 post_meta 关键点 :整个过程中对键值没有任何过滤,可以传入指定的key来设置其值,导致可以构造数据包更新数据库中 _wp_attached_file 的值,插入包含 ../ 的值。 漏洞二:目录遍历 WordPress图片裁剪功能有两种情况: 图片存在于 wp-content\uploads\yyyy\mm 目录:从该目录读取图片 图片不存在:通过本地服务器下载图片(如 http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg ) 漏洞利用 : 构造带参数的URL: http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?1.png 本地读取时找不到 admin.jpeg?1.png 远程获取时忽略 ? 后参数,获取 admin.jpeg 构造包含路径穿越的URL: http://127.0.0.1/wordpress/wp-content/uploads/2019/02/admin.jpeg?../../1/1.png WordPress将裁剪后的图片保存至指定文件夹 Windows系统注意事项 : Windows目录不能包含 ? 字符 使用 # 替代: meta_input[_wp_attached_file]=2019/02/admin.jpeg#../../../1/1.png 漏洞利用步骤 构造数据包更新 _wp_attached_file 值,插入路径穿越 构造第二个数据包触发裁剪图片并保存: 修改 action 为 crop-image 传递 id 参数(即 postid 值) 添加 cropDetails[dst_width] 和 cropDetails[dst_height] 参数 最终在指定目录生成裁剪后的图片文件(前缀为 cropped- ) 漏洞修复 WordPress 4.9.9版本主要修改: 对 meta_input 参数进行过滤 检查用户输入的post data,过滤不合法参数 总结 该漏洞利用链: 通过参数传递任意值覆盖数据库字段 引入 ../ 构成目录穿越 裁剪图片保存时未检查文件目录 最终可写入恶意图片被包含或通过Imagick漏洞触发RCE 参考链接 RIPS技术博客 GitHub修复提交