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媒体库裁剪图片过程中:
-
上传图片到媒体库时:
- 图片保存路径:
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