拿WordPress开刀——点亮代码审计技能树(二)
字数 1849 2025-08-25 22:58:40
WordPress代码审计实战:文件删除与路径穿越漏洞分析
1. CVE-2018-12895: 认证文件删除漏洞
1.1 漏洞背景
WordPress媒体功能组件在处理上传文件时存在安全缺陷,允许认证用户(如作者权限)删除服务器上的任意文件。
1.2 漏洞原理
1.2.1 WordPress媒体功能组件划分
WordPress媒体功能可分为四个关键组件:
- 过滤组件:负责清理上传文件及文件名
- 文件组件:将文件移动到上传目录
- Meta组件:生成并存储文件元信息
- 数据库组件:存储文件相关信息
1.2.2 Meta组件漏洞细节
当用户上传图片时:
- 文件被移动到
wp-content/uploads目录 - WordPress在
wp_postmeta表中创建元条目,包含_wp_attached_file等关键信息
漏洞存在于edit_post()函数中,该函数:
- 直接继承
$_POST数组中的变量 - 允许用户修改任意元条目为任意值
- 未验证修改的元条目内容
1.2.3 漏洞利用链
- 攻击者修改
_wp_attached_file元条目为任意文件路径 - WordPress信任该值并直接删除指定文件
- 导致任意文件删除
1.3 漏洞利用
1.3.1 利用步骤
- 获取作者权限账户
- 通过修改
_wp_attached_file元数据 - 触发文件删除操作
1.3.2 典型攻击场景
删除wp-config.php文件:
- WordPress检测到配置文件丢失
- 系统进入安装模式
- 攻击者可重新配置数据库连接
- 获取管理员权限
1.4 影响与限制
影响:
- 可删除关键系统文件
- 导致权限提升
- 可控制整个WordPress安装
限制:
- 删除配置文件会导致数据丢失
- 容易被管理员察觉
- 无法保留原有数据库内容
2. CVE-2019-8943: 认证路径穿越与本地文件包含漏洞
2.1 漏洞背景
WordPress图像裁剪功能中存在路径穿越漏洞,结合本地文件包含漏洞可实现任意代码执行。
2.2 漏洞原理
2.2.1 图像裁剪流程
- 文件管理组件将图像移至上传目录
- 创建数据库元信息索引
- 裁剪时获取图像ID和对应
_wp_attached_file元数据 - 图像编辑组件处理并保存新图像
2.2.2 关键漏洞点
- 元数据控制:通过
edit_post()漏洞控制_wp_attached_file值 - 路径拼接缺陷:
- WordPress尝试两种方式加载图像:
- 直接查找
wp-content/uploads/[可控文件名] - 从URL下载
https://target.com/wp-content/uploads/[可控文件名]
- 直接查找
- 拼接过程无路径穿越过滤
- WordPress尝试两种方式加载图像:
- 文件保存缺陷:
- 保存时仅添加
cropped-前缀 - 不验证最终路径
- 允许路径穿越
- 保存时仅添加
2.2.3 漏洞利用技巧
- 使用
evil.jpg?shell.php格式:- HTTP请求会忽略
?后内容 - 但保存时会附加
.jpg扩展名
- HTTP请求会忽略
- 使用路径穿越:
- 如
evil.jpg?/../../evil.jpg - 可将文件写入任意目录
- 如
2.3 漏洞利用
2.3.1 利用步骤
- 控制
_wp_attached_file元数据 - 构造恶意路径穿越payload
- 触发图像裁剪功能
- 将含恶意代码的图像写入可访问目录
- 结合LFI执行代码
2.3.2 高级利用技术
- 在图像EXIF元数据中注入PHP代码
- 利用路径穿越写入web可访问目录
- 通过LFI执行恶意代码
2.4 影响与优势
优势:
- 比文件删除更隐蔽
- 不破坏站点数据
- 可实现持久化访问
影响:
- 可实现任意代码执行
- 完全控制服务器
- 难以检测
3. 防御建议
3.1 通用防御措施
- 及时更新WordPress核心
- 最小化用户权限
- 实施文件完整性监控
3.2 针对Meta组件漏洞
- 验证所有元数据修改
- 实施严格的输入过滤
- 对敏感元数据操作进行权限检查
3.3 针对路径穿越漏洞
- 规范化所有文件路径
- 限制文件操作目录
- 验证文件名中的特殊字符
- 实施严格的文件扩展名检查
4. 总结
这两个漏洞展示了WordPress核心中复杂的安全问题:
- 信任边界问题:过度信任来自数据库和用户输入的数据
- 组件间通信缺陷:组件间缺乏充分的数据验证
- 安全链条断裂:单个组件的安全假设被其他组件破坏
通过深入理解这些漏洞,安全研究人员可以:
- 开发更有效的代码审计方法
- 识别类似架构中的潜在漏洞
- 设计更安全的Web应用程序框架